Data Preparation

# Read data
df <- read.csv("myetf4.csv", stringsAsFactors = FALSE)
df$Index <- as.Date(df$Index, format="%Y/%m/%d")

# Filter in-sample data
df_insample <- df[df$Index >= as.Date("2015-12-14") & df$Index <= as.Date("2018-12-28"), ]
prices_xts <- xts(df_insample[, -1], order.by = df_insample$Index)

Question 1: Daily GMVP

# Q1
ret_daily <- na.omit(diff(prices_xts) / lag(prices_xts))
mean_daily <- colMeans(ret_daily)
cov_daily <- cov(ret_daily)
ones <- rep(1, ncol(cov_daily))

# Solve for weights
inv_cov_daily <- solve(cov_daily)
w_gmvp_daily <- inv_cov_daily %*% ones / as.numeric(t(ones) %*% inv_cov_daily %*% ones)
w_gmvp_daily <- as.vector(w_gmvp_daily)
names(w_gmvp_daily) <- colnames(prices_xts)

# Performance
ret_gmvp_daily <- sum(w_gmvp_daily * mean_daily)
sd_gmvp_daily <- sqrt(as.numeric(t(w_gmvp_daily) %*% cov_daily %*% w_gmvp_daily))

print(round(w_gmvp_daily, 4))
##   tw0050   tw0056 tw006205  tw00646 
##  -0.2194   0.7284   0.1076   0.3834

Daily Return: 2.54^{-4}

Daily Std Dev: 0.005905

Question 2: Monthly GMVP

# Q2
prices_monthly <- prices_xts[endpoints(prices_xts, on = "months")]
ret_monthly <- na.omit(diff(prices_monthly) / lag(prices_monthly))
mean_monthly <- colMeans(ret_monthly)
cov_monthly <- cov(ret_monthly)

inv_cov_monthly <- solve(cov_monthly)
w_gmvp_monthly <- inv_cov_monthly %*% ones / as.numeric(t(ones) %*% inv_cov_monthly %*% ones)
w_gmvp_monthly <- as.vector(w_gmvp_monthly)
names(w_gmvp_monthly) <- colnames(prices_xts)

ret_gmvp_monthly <- sum(w_gmvp_monthly * mean_monthly)
sd_gmvp_monthly <- sqrt(as.numeric(t(w_gmvp_monthly) %*% cov_monthly %*% w_gmvp_monthly))

print(round(w_gmvp_monthly, 4))
##   tw0050   tw0056 tw006205  tw00646 
##   0.0032   0.4740   0.0012   0.5216

Monthly Return: 0.005734

Monthly Std Dev: 0.024904

Question 3: Monthly Tangency Portfolio

# Q3
w_tp_monthly <- inv_cov_monthly %*% mean_monthly / as.numeric(t(ones) %*% inv_cov_monthly %*% mean_monthly)
w_tp_monthly <- as.vector(w_tp_monthly)
names(w_tp_monthly) <- colnames(prices_xts)

ret_tp_monthly <- sum(w_tp_monthly * mean_monthly)
sd_tp_monthly <- sqrt(as.numeric(t(w_tp_monthly) %*% cov_monthly %*% w_tp_monthly))

print(round(w_tp_monthly, 4))
##   tw0050   tw0056 tw006205  tw00646 
##   1.3051  -0.1577  -0.8475   0.7002

Tangency Monthly Return: 0.01809

Tangency Monthly Std Dev: 0.044236