This is an R Markdown document. Markdown is a simple formatting syntax for authoring HTML, PDF, and MS Word documents. For more details on using R Markdown see http://rmarkdown.rstudio.com.
When you click the Knit button a document will be generated that includes both content as well as the output of any embedded R code chunks within the document. You can embed an R code chunk like this:
rm(list = ls())
library(devtools)
## Warning: package 'devtools' was built under R version 4.3.3
## Loading required package: usethis
## Warning: package 'usethis' was built under R version 4.3.3
etf6 <- read.table('C:/Users/Badamkhand/Downloads/ETF6_20080101-20200430.csv', sep = ',', header = T)
#
head(etf6)
## 證券代碼 簡稱 年月日 收盤價.元.
## 1 0050 元大台灣50 20080102 39.6472
## 2 0052 富邦科技 20080102 27.0983
## 3 0056 元大高股息 20080102 14.5739
## 4 0050 元大台灣50 20080103 38.9876
## 5 0052 富邦科技 20080103 26.0676
## 6 0056 元大高股息 20080103 14.3758
etf6 <- etf6[, -2]
colnames(etf6) <- c('id', 'date', 'price')
head(etf6)
## id date price
## 1 0050 20080102 39.6472
## 2 0052 20080102 27.0983
## 3 0056 20080102 14.5739
## 4 0050 20080103 38.9876
## 5 0052 20080103 26.0676
## 6 0056 20080103 14.3758
library(pacman)
p_load(reshape2, xts, quantmod)
etf6.l <- dcast(etf6, date~id)
## Using price as value column: use value.var to override.
head(etf6.l)
## date 0050 0052 0056 0061 006206 00638R
## 1 20080102 39.6472 27.0983 14.5739 NA NA NA
## 2 20080103 38.9876 26.0676 14.3758 NA NA NA
## 3 20080104 38.9876 25.9346 14.4041 NA NA NA
## 4 20080107 37.2064 24.1391 14.1777 NA NA NA
## 5 20080108 37.5692 24.1391 14.3531 NA NA NA
## 6 20080109 38.2619 24.2721 14.4663 NA NA NA
# etf6.l <- na.omit(etf6.l)
# head(etf6.l)
str(etf6.l)
## 'data.frame': 3041 obs. of 7 variables:
## $ date : int 20080102 20080103 20080104 20080107 20080108 20080109 20080110 20080111 20080114 20080115 ...
## $ 0050 : num 39.6 39 39 37.2 37.6 ...
## $ 0052 : num 27.1 26.1 25.9 24.1 24.1 ...
## $ 0056 : num 14.6 14.4 14.4 14.2 14.4 ...
## $ 0061 : num NA NA NA NA NA NA NA NA NA NA ...
## $ 006206 : num NA NA NA NA NA NA NA NA NA NA ...
## $ 00638R : num NA NA NA NA NA NA NA NA NA NA ...
# convert into xts
etf6.xts <- xts(etf6.l[, -1], order.by = as.Date(as.character(etf6.l$date), format = '%Y%m%d'))
class(etf6.xts)
## [1] "xts" "zoo"
head(etf6.xts)
## 0050 0052 0056 0061 006206 00638R
## 2008-01-02 39.6472 27.0983 14.5739 NA NA NA
## 2008-01-03 38.9876 26.0676 14.3758 NA NA NA
## 2008-01-04 38.9876 25.9346 14.4041 NA NA NA
## 2008-01-07 37.2064 24.1391 14.1777 NA NA NA
## 2008-01-08 37.5692 24.1391 14.3531 NA NA NA
## 2008-01-09 38.2619 24.2721 14.4663 NA NA NA
# SIT
# con = gzcon(url('http://www.systematicportfolio.com/sit.gz', 'rb'))
# source(con)
# close(con)
#
# devtools::install_github('systematicinvestor/SIT.date', force = T)
# curl::curl_download('https://github.com/systematicinvestor/SIT/raw/master/SIT.tar.gz', 'SIT.tar.gz',mode = 'wb',quiet=T)
# install.packages('SIT.tar.gz', repos = NULL, type='source')
library(SIT)
## Warning: package 'SIT' was built under R version 4.3.3
library(quantmod)
#
# library(SIT)
#
data <- new.env()
# 1. prices; 2. weight; 3. execution.price
# buy and hold
# etf56 <- etf6.xts$`0056`
# head(etf56)
# data$prices = data$weight = data$execution.price = etf56
# data$weight[] <- 1
# data$execution.price[] <- NA
# names(data)
#
# etf52 <- etf6.xts$`0052`
# head(etf52)
# data$prices = data$weight = data$execution.price = etf52
# data$weight[] <- 1
# data$execution.price[] <- NA
# names(data)
#
model <- list()
#
etf3 <- etf6.xts[, 1:3]
head(etf3)
## 0050 0052 0056
## 2008-01-02 39.6472 27.0983 14.5739
## 2008-01-03 38.9876 26.0676 14.3758
## 2008-01-04 38.9876 25.9346 14.4041
## 2008-01-07 37.2064 24.1391 14.1777
## 2008-01-08 37.5692 24.1391 14.3531
## 2008-01-09 38.2619 24.2721 14.4663
names(etf3)
## [1] "0050 " "0052 " "0056 "
colnames(etf3) <- c('e50', 'e52', 'e56')
names(etf3)
## [1] "e50" "e52" "e56"
md = 50
i = 'e50'
# --------------------------------------------------
# Add equal-weighted portfolio for 3 ETFs
# --------------------------------------------------
data$prices = data$weight = data$execution.price = etf3
data$execution.price[] <- NA
prices <- data$prices
n <- ncol(prices)
#
#=============================================================
# MVP investment strategy
#=============================================================
# monthly rebalance
# covariance matrix
# use monthly returns to compute monthly covariance matrix
etf3.m <- to.monthly(etf3, indexAt = 'lastof', OHLC = FALSE)
head(etf3.m)
## e50 e52 e56
## 2008-01-31 36.2499 23.2680 12.8646
## 2008-02-29 40.1420 25.5356 14.0079
## 2008-03-31 39.8781 25.1366 14.4324
## 2008-04-30 42.1541 26.7326 14.8851
## 2008-05-31 41.0326 26.1008 14.5625
## 2008-06-30 36.2828 23.1416 12.9608
#etf3.w <- to.weekly(etf3, indexAt = 'lastof', OHLC = FALSE)
#head(etf3.w)
#
#=================================================================
# MVP portfolio
#=================================================================
# Reset inputs to SIT bt function
data$prices = data$weight = data$execution.price = etf3.m
#data$prices <- industry.price.sample
#data$weight <- industry.price.sample
#data$execution.price <- industry.price.sample
data$execution.price[] <- NA
prices <- data$prices
n <- ncol(prices)
#*****************************************************************
# Create Constraints
#*****************************************************************
# SUM x.i = 1
#
weight = coredata(prices)
weight[] = NA
i = 36
#
weight
## e50 e52 e56
## [1,] NA NA NA
## [2,] NA NA NA
## [3,] NA NA NA
## [4,] NA NA NA
## [5,] NA NA NA
## [6,] NA NA NA
## [7,] NA NA NA
## [8,] NA NA NA
## [9,] NA NA NA
## [10,] NA NA NA
## [11,] NA NA NA
## [12,] NA NA NA
## [13,] NA NA NA
## [14,] NA NA NA
## [15,] NA NA NA
## [16,] NA NA NA
## [17,] NA NA NA
## [18,] NA NA NA
## [19,] NA NA NA
## [20,] NA NA NA
## [21,] NA NA NA
## [22,] NA NA NA
## [23,] NA NA NA
## [24,] NA NA NA
## [25,] NA NA NA
## [26,] NA NA NA
## [27,] NA NA NA
## [28,] NA NA NA
## [29,] NA NA NA
## [30,] NA NA NA
## [31,] NA NA NA
## [32,] NA NA NA
## [33,] NA NA NA
## [34,] NA NA NA
## [35,] NA NA NA
## [36,] NA NA NA
## [37,] NA NA NA
## [38,] NA NA NA
## [39,] NA NA NA
## [40,] NA NA NA
## [41,] NA NA NA
## [42,] NA NA NA
## [43,] NA NA NA
## [44,] NA NA NA
## [45,] NA NA NA
## [46,] NA NA NA
## [47,] NA NA NA
## [48,] NA NA NA
## [49,] NA NA NA
## [50,] NA NA NA
## [51,] NA NA NA
## [52,] NA NA NA
## [53,] NA NA NA
## [54,] NA NA NA
## [55,] NA NA NA
## [56,] NA NA NA
## [57,] NA NA NA
## [58,] NA NA NA
## [59,] NA NA NA
## [60,] NA NA NA
## [61,] NA NA NA
## [62,] NA NA NA
## [63,] NA NA NA
## [64,] NA NA NA
## [65,] NA NA NA
## [66,] NA NA NA
## [67,] NA NA NA
## [68,] NA NA NA
## [69,] NA NA NA
## [70,] NA NA NA
## [71,] NA NA NA
## [72,] NA NA NA
## [73,] NA NA NA
## [74,] NA NA NA
## [75,] NA NA NA
## [76,] NA NA NA
## [77,] NA NA NA
## [78,] NA NA NA
## [79,] NA NA NA
## [80,] NA NA NA
## [81,] NA NA NA
## [82,] NA NA NA
## [83,] NA NA NA
## [84,] NA NA NA
## [85,] NA NA NA
## [86,] NA NA NA
## [87,] NA NA NA
## [88,] NA NA NA
## [89,] NA NA NA
## [90,] NA NA NA
## [91,] NA NA NA
## [92,] NA NA NA
## [93,] NA NA NA
## [94,] NA NA NA
## [95,] NA NA NA
## [96,] NA NA NA
## [97,] NA NA NA
## [98,] NA NA NA
## [99,] NA NA NA
## [100,] NA NA NA
## [101,] NA NA NA
## [102,] NA NA NA
## [103,] NA NA NA
## [104,] NA NA NA
## [105,] NA NA NA
## [106,] NA NA NA
## [107,] NA NA NA
## [108,] NA NA NA
## [109,] NA NA NA
## [110,] NA NA NA
## [111,] NA NA NA
## [112,] NA NA NA
## [113,] NA NA NA
## [114,] NA NA NA
## [115,] NA NA NA
## [116,] NA NA NA
## [117,] NA NA NA
## [118,] NA NA NA
## [119,] NA NA NA
## [120,] NA NA NA
## [121,] NA NA NA
## [122,] NA NA NA
## [123,] NA NA NA
## [124,] NA NA NA
## [125,] NA NA NA
## [126,] NA NA NA
## [127,] NA NA NA
## [128,] NA NA NA
## [129,] NA NA NA
## [130,] NA NA NA
## [131,] NA NA NA
## [132,] NA NA NA
## [133,] NA NA NA
## [134,] NA NA NA
## [135,] NA NA NA
## [136,] NA NA NA
## [137,] NA NA NA
## [138,] NA NA NA
## [139,] NA NA NA
## [140,] NA NA NA
## [141,] NA NA NA
## [142,] NA NA NA
## [143,] NA NA NA
## [144,] NA NA NA
## [145,] NA NA NA
## [146,] NA NA NA
## [147,] NA NA NA
## [148,] NA NA NA
weight <- round(weight, digits = 2)
#format(round(weight, 2), nsmall = 2)
#apply(weight, 1, sum)
data$weight[] = weight
#capital = 100000
#data$weight[] = (capital / prices) * data$weight
#
#====================
# multiple models
#====================
#*****************************************************************
# Create Constraints
#*****************************************************************
# SUM x.i = 1
#*****************************************************************
# Create Portfolios
#*****************************************************************
weight = coredata(prices)
weight[] = NA
#
weights = list()
# Equal Weight 1/N Benchmark
weights$equal.weight = weight
start.i = 35
weights$equal.weight[1:start.i,] = NA
#
weights$min.var = weight
weights$min.maxloss = weight
weights$min.mad = weight
weights$min.cvar = weight
weights$min.cdar = weight
weights$min.cor.insteadof.cov = weight
weights$min.mad.downside = weight
weights$min.risk.downside = weight
#
#
models = list()
# i = "equal.weight"
# Plot performance
# Plot Strategy Statistics Side by Side
You can also embed plots, for example:
Note that the echo = FALSE
parameter was added to the
code chunk to prevent printing of the R code that generated the
plot.