Import data

library(readr)
library(xts)
## Loading required package: zoo
## 
## Attaching package: 'zoo'
## The following objects are masked from 'package:base':
## 
##     as.Date, as.Date.numeric
hw5 <- read_csv("C:/Users/DELL/Downloads/hw5.csv")
## Rows: 751 Columns: 5
## ── Column specification ────────────────────────────────────────────────────────
## Delimiter: ","
## chr (1): Index
## dbl (4): tw0050, tw0056, tw006205, tw00646
## 
## ℹ Use `spec()` to retrieve the full column specification for this data.
## ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.
head(hw5)
## # A tibble: 6 × 5
##   Index      tw0050 tw0056 tw006205 tw00646
##   <chr>       <dbl>  <dbl>    <dbl>   <dbl>
## 1 2015/12/14   53.3   18.2     31.1    19.6
## 2 2015/12/15   53.3   18.4     31.6    19.6
## 3 2015/12/16   54.1   18.6     31.6    19.9
## 4 2015/12/17   54.8   18.8     32.2    20.0
## 5 2015/12/18   54.5   19.0     32.2    19.8
## 6 2015/12/21   54.4   19.0     33      19.6
hw5.xts <- as.xts(hw5[,-1], order.by = as.POSIXct(hw5$Index) )
head(hw5.xts)
##            tw0050 tw0056 tw006205 tw00646
## 2015-12-14  53.29  18.25    31.06   19.61
## 2015-12-15  53.33  18.38    31.59   19.63
## 2015-12-16  54.14  18.56    31.60   19.89
## 2015-12-17  54.77  18.81    32.23   20.05
## 2015-12-18  54.50  18.95    32.18   19.85
## 2015-12-21  54.41  19.02    33.00   19.64

Q1:Daily return

library(magrittr)
library(PerformanceAnalytics)
## 
## Attaching package: 'PerformanceAnalytics'
## The following object is masked from 'package:graphics':
## 
##     legend
library(fBasics)
## 
## Attaching package: 'fBasics'
## The following objects are masked from 'package:PerformanceAnalytics':
## 
##     kurtosis, skewness
s1 <- cov(hw5[,2:5])      
ones1 <- rep(1,4)
one.vec1 <- matrix(ones1,ncol =1)
a1 <- inv(s1)%*%one.vec1
b2 <- t(one.vec1)%*%a1
mvp_d <- a1 / as.numeric(b2)
head(mvp_d)
##                 [,1]
## tw0050   -0.28080456
## tw0056    1.07989097
## tw006205  0.13606491
## tw00646   0.06484868
mean_return <- colMeans(hw5[,2:5])
mean <- t(as.matrix(mean_return))
realized_return <- mean%*%mvp_d
head(realized_return)
##          [,1]
## [1,] 9.892485
colnames(realized_return) = "Daily Realized Return"
head(realized_return)
##      Daily Realized Return
## [1,]              9.892485

Q2:By Q1, use monthly returns to recalculate the answers to Q1.

month.r <- to.monthly(hw5.xts)
colnames(month.r) = c("tw0050","tw0056","tw006205","tw00646")
head(month.r)
##          tw0050 tw0056 tw006205 tw00646
## Dec 2015  53.29  19.02    31.06   20.06
## Jan 2016  53.42  18.60    25.40   19.28
## Feb 2016  53.42  19.41    25.46   19.21
## Mar 2016  55.49  19.70    25.41   19.71
## Apr 2016  57.32  19.23    26.98   19.90
## May 2016  54.50  18.95    26.02   20.34
s2 <- cov(month.r[,1:4])      
ones2 <- rep(1,4)
one.vec2 <- matrix(ones2,ncol =1)
a2 <- inv(s2)%*%one.vec2
b2 <- t(one.vec2)%*%a2
mvp_m <- a2 / as.numeric(b2)
head(mvp_m)
##                [,1]
## tw0050   -0.2689932
## tw0056    1.0143129
## tw006205  0.1268862
## tw00646   0.1277941
mean_return_m <- colMeans(month.r[,1:4])
mean_mon <- t(as.matrix(mean_return_m))
realized_return_m <- mean_mon%*%mvp_m
head(realized_return_m)
##          [,1]
## [1,] 10.74154
colnames(realized_return_m) = "Monthly Realized Return"
head(realized_return_m)
##      Monthly Realized Return
## [1,]                10.74154

Q3:Find the tangency portfolio based on Q2. Risk-free rate is assumed to be zero.

a3 <- inv(s2)%*%mean_return_m 
b3 <- t(one.vec2)%*%a3
c3 <- a3/as.vector(b3)
head(c3)
##                [,1]
## tw0050   -0.2359199
## tw0056    0.8827621
## tw006205  0.1923066
## tw00646   0.1608512