R Markdown

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

Including Plots

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.