#BT02_MVP.R is the backtesting reference # Load libraries

library(tidyquant)
## Loading required package: lubridate
## 
## Attaching package: 'lubridate'
## The following objects are masked from 'package:base':
## 
##     date, intersect, setdiff, union
## Loading required package: PerformanceAnalytics
## Loading required package: xts
## Loading required package: zoo
## 
## Attaching package: 'zoo'
## The following objects are masked from 'package:base':
## 
##     as.Date, as.Date.numeric
## 
## Attaching package: 'PerformanceAnalytics'
## The following object is masked from 'package:graphics':
## 
##     legend
## Loading required package: quantmod
## Loading required package: TTR
## Registered S3 method overwritten by 'quantmod':
##   method            from
##   as.zoo.data.frame zoo
## ══ Need to Learn tidyquant? ════════════════════════════════════════════════════
## Business Science offers a 1-hour course - Learning Lab #9: Performance Analysis & Portfolio Optimization with tidyquant!
## </> Learn more at: https://university.business-science.io/p/learning-labs-pro </>
library(lubridate)
library(timetk)
library(purrr)
library(pacman)
p_load(quantmod, quadprog, lpSolve)
library(SIT)
## Loading required package: SIT.date
## 
## Attaching package: 'SIT'
## The following object is masked from 'package:purrr':
## 
##     cross
## The following object is masked from 'package:TTR':
## 
##     DVI
## The following object is masked from 'package:base':
## 
##     close
library(readr)
library(xts)
library(PerformanceAnalytics)
library(magrittr)
## 
## Attaching package: 'magrittr'
## The following object is masked from 'package:SIT':
## 
##     add
## The following object is masked from 'package:purrr':
## 
##     set_names
library(tidyr)
## 
## Attaching package: 'tidyr'
## The following object is masked from 'package:magrittr':
## 
##     extract
library(magrittr)
library(dplyr)
## 
## Attaching package: 'dplyr'
## The following objects are masked from 'package:SIT':
## 
##     count, lst
## The following objects are masked from 'package:xts':
## 
##     first, last
## The following objects are masked from 'package:stats':
## 
##     filter, lag
## The following objects are masked from 'package:base':
## 
##     intersect, setdiff, setequal, union
library(tidyverse)
## ── Attaching packages ─────────────────────────────────────── tidyverse 1.3.1 ──
## ✓ ggplot2 3.3.3     ✓ stringr 1.4.0
## ✓ tibble  3.1.1     ✓ forcats 0.5.1
## ── Conflicts ────────────────────────────────────────── tidyverse_conflicts() ──
## x magrittr::add()          masks SIT::add()
## x lubridate::as.difftime() masks base::as.difftime()
## x dplyr::count()           masks SIT::count()
## x SIT::cross()             masks purrr::cross()
## x lubridate::date()        masks base::date()
## x tidyr::extract()         masks magrittr::extract()
## x dplyr::filter()          masks stats::filter()
## x dplyr::first()           masks xts::first()
## x lubridate::intersect()   masks base::intersect()
## x dplyr::lag()             masks stats::lag()
## x dplyr::last()            masks xts::last()
## x tibble::lst()            masks dplyr::lst(), SIT::lst()
## x magrittr::set_names()    masks purrr::set_names()
## x lubridate::setdiff()     masks base::setdiff()
## x lubridate::union()       masks base::union()

1. Import data

#Download ETF daily data from yahoo with ticker names of SPY, QQQ, EEM, IWM, EFA, TLT, IYR and GLD from 2010 to current date (See http://etfdb.com/ for ETF information). (Hint: Use library quantmod to help you to download these prices and use adjusted prices for your computation.)

symbols <- c("SPY", "QQQ", "EEM", "IWM", "EFA", "TLT", "IYR", "GLD")

prices <-
  getSymbols(symbols, src = 'yahoo', from = "2010-01-01",
             auto.assign = TRUE, warnings = FALSE) %>%
  map(~Ad(get(.))) %>%
  reduce(merge) %>%
  `colnames<-`(symbols)
## 'getSymbols' currently uses auto.assign=TRUE by default, but will
## use auto.assign=FALSE in 0.5-0. You will still be able to use
## 'loadSymbols' to automatically load data. getOption("getSymbols.env")
## and getOption("getSymbols.auto.assign") will still be checked for
## alternate defaults.
## 
## This message is shown once per session and may be disabled by setting 
## options("getSymbols.warning4.0"=FALSE). See ?getSymbols for details.
## pausing 1 second between requests for more than 5 symbols
## pausing 1 second between requests for more than 5 symbols
## pausing 1 second between requests for more than 5 symbols
## pausing 1 second between requests for more than 5 symbols
head(prices)
##                 SPY      QQQ      EEM      IWM      EFA      TLT      IYR
## 2010-01-04 90.79006 41.51847 34.10928 54.61730 41.03314 66.13428 30.41554
## 2010-01-05 91.03041 41.51847 34.35684 54.42949 41.06930 66.56142 30.48858
## 2010-01-06 91.09449 41.26806 34.42872 54.37827 41.24289 65.67038 30.47530
## 2010-01-07 91.47905 41.29489 34.22906 54.77949 41.08377 65.78078 30.74751
## 2010-01-08 91.78343 41.63475 34.50059 55.07827 41.40926 65.75137 30.54169
## 2010-01-11 91.91164 41.46482 34.42872 54.85632 41.74921 65.39054 30.68776
##               GLD
## 2010-01-04 109.80
## 2010-01-05 109.70
## 2010-01-06 111.51
## 2010-01-07 110.82
## 2010-01-08 111.37
## 2010-01-11 112.85
tail(prices)
##               SPY    QQQ   EEM    IWM   EFA    TLT   IYR    GLD
## 2021-04-26 417.61 341.63 54.70 228.11 79.13 139.86 98.36 166.84
## 2021-04-27 417.52 340.15 54.67 228.45 78.87 138.64 98.39 166.42
## 2021-04-28 417.40 339.00 55.08 228.84 79.07 138.73 97.98 166.91
## 2021-04-29 420.06 340.22 54.95 227.99 79.10 138.32 98.78 166.22
## 2021-04-30 417.30 337.99 53.98 224.89 78.11 138.64 99.19 165.66
## 2021-05-03 418.20 336.19 53.98 225.99 78.97 138.52 99.03 167.81
monthlyReturn(prices)
##            monthly.returns
## 2010-01-29   -0.0524132917
## 2010-02-26    0.0447512492
## 2010-03-31    0.0823067676
## 2010-04-30    0.0567843904
## 2010-05-28   -0.0753663437
## 2010-06-30   -0.0774338459
## 2010-07-30    0.0673090738
## 2010-08-31   -0.0744384416
## 2010-09-30    0.1244528243
## 2010-10-29    0.0414818460
## 2010-11-30    0.0348504384
## 2010-12-31    0.0803336160
## 2011-01-31   -0.0037067212
## 2011-02-28    0.0554206490
## 2011-03-31    0.0252307252
## 2011-04-29    0.0263747203
## 2011-05-31   -0.0179414792
## 2011-06-30   -0.0240459710
## 2011-07-29   -0.0340614820
## 2011-08-31   -0.0889140326
## 2011-09-30   -0.1115029947
## 2011-10-31    0.1510108213
## 2011-11-30   -0.0037834497
## 2011-12-30    0.0051507644
## 2012-01-31    0.0714574484
## 2012-02-29    0.0256898946
## 2012-03-30    0.0248470759
## 2012-04-30   -0.0161814758
## 2012-05-31   -0.0657912300
## 2012-06-29    0.0505211081
## 2012-07-31   -0.0152085341
## 2012-08-31    0.0353539445
## 2012-09-28    0.0326095426
## 2012-10-31   -0.0216924239
## 2012-11-30    0.0055129115
## 2012-12-31    0.0361885782
## 2013-01-31    0.0623813210
## 2013-02-28    0.0100467651
## 2013-03-28    0.0465905319
## 2013-04-30   -0.0034946852
## 2013-05-31    0.0393199470
## 2013-06-28   -0.0081799857
## 2013-07-31    0.0733414138
## 2013-08-30   -0.0316416930
## 2013-09-30    0.0648911375
## 2013-10-31    0.0242002000
## 2013-11-29    0.0395642008
## 2013-12-31    0.0202111391
## 2014-01-31   -0.0277390187
## 2014-02-28    0.0477887177
## 2014-03-31   -0.0074845109
## 2014-04-30   -0.0374763800
## 2014-05-30    0.0078584500
## 2014-06-30    0.0527200084
## 2014-07-31   -0.0605429638
## 2014-08-29    0.0482955046
## 2014-09-30   -0.0592788067
## 2014-10-31    0.0659350405
## 2014-11-28    0.0011152097
## 2014-12-31    0.0289294267
## 2015-01-30   -0.0327706154
## 2015-02-27    0.0594639903
## 2015-03-31    0.0177000106
## 2015-04-30   -0.0256492091
## 2015-05-29    0.0223633155
## 2015-06-30    0.0078295903
## 2015-07-31   -0.0110393695
## 2015-08-31   -0.0631101999
## 2015-09-30   -0.0493628086
## 2015-10-30    0.0562269865
## 2015-11-30    0.0325991141
## 2015-12-31   -0.0503039739
## 2016-01-29   -0.0857753039
## 2016-02-29   -0.0022336808
## 2016-03-31    0.0801344107
## 2016-04-29    0.0167223563
## 2016-05-31    0.0224040061
## 2016-06-30   -0.0001739483
## 2016-07-29    0.0587488019
## 2016-08-31    0.0178408150
## 2016-09-30    0.0107385875
## 2016-10-31   -0.0459706971
## 2016-11-30    0.1106331057
## 2016-12-30    0.0288442862
## 2017-01-31    0.0028180715
## 2017-02-28    0.0193002807
## 2017-03-31    0.0002603814
## 2017-04-28    0.0114924850
## 2017-05-31   -0.0197035783
## 2017-06-30    0.0337439284
## 2017-07-31    0.0085247566
## 2017-08-31   -0.0125784197
## 2017-09-29    0.0630411005
## 2017-10-31    0.0072884359
## 2017-11-30    0.0294119412
## 2017-12-29   -0.0039849392
## 2018-01-31    0.0255803707
## 2018-02-28   -0.0384368815
## 2018-03-29    0.0121749945
## 2018-04-30    0.0098139832
## 2018-05-31    0.0616352933
## 2018-06-29    0.0061438531
## 2018-07-31    0.0164906555
## 2018-08-31    0.0431059385
## 2018-09-28   -0.0232499889
## 2018-10-31   -0.1098783582
## 2018-11-30    0.0172631975
## 2018-12-31   -0.1197215118
## 2019-01-31    0.1132188330
## 2019-02-28    0.0517912487
## 2019-03-29   -0.0209331372
## 2019-04-30    0.0339668717
## 2019-05-31   -0.0785267279
## 2019-06-28    0.0698489643
## 2019-07-31    0.0068167518
## 2019-08-30   -0.0493102771
## 2019-09-30    0.0203706265
## 2019-10-31    0.0271575237
## 2019-11-29    0.0406561044
## 2019-12-31    0.0278652504
## 2020-01-31   -0.0310255378
## 2020-02-28   -0.0884569167
## 2020-03-31   -0.2147708424
## 2020-04-30    0.1384764180
## 2020-05-29    0.0659194910
## 2020-06-30    0.0342994588
## 2020-07-31    0.0291940561
## 2020-08-31    0.0547637963
## 2020-09-30   -0.0326131661
## 2020-10-30    0.0220309097
## 2020-11-30    0.1824417738
## 2020-12-31    0.0864644723
## 2021-01-29    0.0484546056
## 2021-02-26    0.0620256408
## 2021-03-31    0.0139503253
## 2021-04-30    0.0178781432
## 2021-05-03    0.0048913069
weeklyReturn(prices, subset = NULL, type = "log", leading = TRUE)
##            weekly.returns
## 2010-01-08   1.088197e-02
## 2010-01-15  -1.310462e-02
## 2010-01-22  -3.110062e-02
## 2010-01-29  -2.659356e-02
## 2010-02-05  -1.407321e-02
## 2010-02-12   2.909861e-02
## 2010-02-19   3.288489e-02
## 2010-02-26  -4.131467e-03
## 2010-03-05   5.904963e-02
## 2010-03-12   1.637655e-02
## 2010-03-19  -4.588075e-03
## 2010-03-26   8.403932e-03
## 2010-04-01   9.101740e-03
## 2010-04-09   2.624877e-02
## 2010-04-16   1.707786e-02
## 2010-04-23   3.668208e-02
## 2010-04-30  -3.402713e-02
## 2010-05-07  -9.188251e-02
## 2010-05-14   6.227923e-02
## 2010-05-21  -6.672631e-02
## 2010-05-28   1.797193e-02
## 2010-06-04  -4.145092e-02
## 2010-06-11   2.147957e-02
## 2010-06-18   2.823924e-02
## 2010-06-25  -3.302450e-02
## 2010-07-02  -7.405379e-02
## 2010-07-09   5.084191e-02
## 2010-07-16  -3.016102e-02
## 2010-07-23   6.205860e-02
## 2010-07-30   6.153102e-04
## 2010-08-06   1.843787e-03
## 2010-08-13  -6.451770e-02
## 2010-08-20   1.308956e-03
## 2010-08-27   8.143500e-03
## 2010-09-03   4.255260e-02
## 2010-09-10  -9.527429e-03
## 2010-09-17   2.311420e-02
## 2010-09-24   2.943962e-02
## 2010-10-01   1.290375e-02
## 2010-10-08   2.070927e-02
## 2010-10-15   1.447366e-02
## 2010-10-22   4.266983e-04
## 2010-10-29  -2.844673e-04
## 2010-11-05   4.817953e-02
## 2010-11-12  -2.386925e-02
## 2010-11-19   5.814266e-03
## 2010-11-26   1.057227e-02
## 2010-12-03   3.291322e-02
## 2010-12-10   2.711618e-02
## 2010-12-17   3.466900e-03
## 2010-12-23   1.344974e-02
## 2010-12-31  -6.116048e-03
## 2011-01-07   3.572220e-03
## 2011-01-14   2.540073e-02
## 2011-01-21  -4.248403e-02
## 2011-01-28   2.845804e-03
## 2011-02-04   3.128446e-02
## 2011-02-11   2.717239e-02
## 2011-02-18   1.547600e-02
## 2011-02-25  -1.413675e-02
## 2011-03-04   3.158747e-03
## 2011-03-11  -2.779670e-02
## 2011-03-18  -9.020210e-03
## 2011-03-25   3.623031e-02
## 2011-04-01   2.782649e-02
## 2011-04-08  -6.645930e-03
## 2011-04-15  -5.612772e-03
## 2011-04-21   1.119316e-02
## 2011-04-29   2.271248e-02
## 2011-05-06  -3.678373e-02
## 2011-05-13   2.878083e-03
## 2011-05-20  -7.813957e-03
## 2011-05-27   9.489138e-03
## 2011-06-03  -3.367468e-02
## 2011-06-10  -3.625807e-02
## 2011-06-17   2.944517e-03
## 2011-06-24   2.162322e-02
## 2011-07-01   5.061109e-02
## 2011-07-08   1.529320e-02
## 2011-07-15  -2.763063e-02
## 2011-07-22   1.486313e-02
## 2011-07-29  -5.264059e-02
## 2011-08-05  -1.114542e-01
## 2011-08-12  -2.182611e-02
## 2011-08-19  -6.680522e-02
## 2011-08-26   5.701369e-02
## 2011-09-02  -9.450085e-03
## 2011-09-09  -1.412189e-02
## 2011-09-16   5.784957e-02
## 2011-09-23  -8.956861e-02
## 2011-09-30  -1.297912e-02
## 2011-10-07   1.849049e-02
## 2011-10-14   8.259985e-02
## 2011-10-21  -1.411840e-04
## 2011-10-28   6.661923e-02
## 2011-11-04  -1.898754e-02
## 2011-11-11  -2.953368e-03
## 2011-11-18  -3.279882e-02
## 2011-11-25  -7.738319e-02
## 2011-12-02   9.828019e-02
## 2011-12-09   1.405047e-02
## 2011-12-16  -3.106530e-02
## 2011-12-23   3.606590e-02
## 2011-12-30  -1.078928e-02
## 2012-01-06   1.400326e-02
## 2012-01-13   2.116717e-02
## 2012-01-20   2.405798e-02
## 2012-01-27   1.861126e-02
## 2012-02-03   3.971769e-02
## 2012-02-10  -2.046130e-02
## 2012-02-17   1.853011e-02
## 2012-02-24  -1.813304e-03
## 2012-03-02  -2.934697e-02
## 2012-03-09   1.668277e-02
## 2012-03-16   1.701102e-02
## 2012-03-23  -8.019919e-04
## 2012-03-30   1.570975e-03
## 2012-04-05  -1.496464e-02
## 2012-04-13  -2.532432e-02
## 2012-04-20   8.388408e-03
## 2012-04-27   2.669459e-02
## 2012-05-04  -4.075637e-02
## 2012-05-11  -2.405124e-03
## 2012-05-18  -5.483513e-02
## 2012-05-25   2.512028e-02
## 2012-06-01  -3.683666e-02
## 2012-06-08   4.178581e-02
## 2012-06-15   3.242590e-03
## 2012-06-22   3.490642e-03
## 2012-06-29   3.131710e-02
## 2012-07-06   1.211816e-02
## 2012-07-13  -9.481825e-03
## 2012-07-20  -1.058598e-02
## 2012-07-27   4.928861e-03
## 2012-08-03  -8.991532e-03
## 2012-08-10   1.652685e-02
## 2012-08-17   2.215056e-02
## 2012-08-24  -1.194231e-02
## 2012-08-31   4.695193e-03
## 2012-09-07   3.797792e-02
## 2012-09-14   2.508028e-02
## 2012-09-21  -1.047097e-02
## 2012-09-28  -2.049810e-02
## 2012-10-05   7.997576e-03
## 2012-10-12  -2.418741e-02
## 2012-10-19  -3.049968e-03
## 2012-10-26  -8.712003e-03
## 2012-11-02   6.158945e-04
## 2012-11-09  -2.254574e-02
## 2012-11-16  -2.422639e-02
## 2012-11-23   3.786461e-02
## 2012-11-30   1.981005e-02
## 2012-12-07   1.217097e-03
## 2012-12-14   2.188496e-03
## 2012-12-21   3.060044e-02
## 2012-12-28  -1.991416e-02
## 2013-01-04   5.550094e-02
## 2013-01-11   1.145673e-03
## 2013-01-18   1.398446e-02
## 2013-01-25   1.534958e-02
## 2013-02-01   4.769836e-03
## 2013-02-08   4.746910e-03
## 2013-02-15   1.029912e-02
## 2013-02-22  -7.769150e-03
## 2013-03-01  -1.539224e-03
## 2013-03-08   3.076828e-02
## 2013-03-15   1.082359e-02
## 2013-03-22  -6.246638e-03
## 2013-03-28   5.671226e-03
## 2013-04-05  -2.900926e-02
## 2013-04-12   2.060812e-02
## 2013-04-19  -3.289319e-02
## 2013-04-26   2.495931e-02
## 2013-05-03   1.982343e-02
## 2013-05-10   2.160956e-02
## 2013-05-17   2.266785e-02
## 2013-05-24  -1.188243e-02
## 2013-05-31  -8.175868e-04
## 2013-06-07   4.081527e-03
## 2013-06-14  -5.002270e-03
## 2013-06-21  -1.796840e-02
## 2013-06-28   1.067552e-02
## 2013-07-05   3.152510e-02
## 2013-07-12   2.975261e-02
## 2013-07-19   1.575005e-02
## 2013-07-26  -1.823368e-03
## 2013-08-02   9.938994e-03
## 2013-08-09  -1.070762e-02
## 2013-08-16  -2.294456e-02
## 2013-08-23   1.454727e-02
## 2013-08-30  -2.741498e-02
## 2013-09-06   1.982577e-02
## 2013-09-13   2.336043e-02
## 2013-09-20   1.684037e-02
## 2013-09-27   2.564451e-03
## 2013-10-04   4.119907e-03
## 2013-10-11   6.148209e-03
## 2013-10-18   2.756943e-02
## 2013-10-25   3.517412e-03
## 2013-11-01  -2.147503e-02
## 2013-11-08   4.680054e-03
## 2013-11-15   1.454175e-02
## 2013-11-22   9.161037e-03
## 2013-11-29   1.473239e-02
## 2013-12-06  -9.115383e-03
## 2013-12-13  -2.047875e-02
## 2013-12-20   3.328725e-02
## 2013-12-27   1.458134e-02
## 2014-01-03  -4.089531e-03
## 2014-01-10   7.210790e-03
## 2014-01-17   3.543047e-03
## 2014-01-24  -2.162429e-02
## 2014-01-31  -1.143588e-02
## 2014-02-07  -1.265101e-02
## 2014-02-14   2.944919e-02
## 2014-02-21   1.393032e-02
## 2014-02-28   1.595346e-02
## 2014-03-07   1.838022e-02
## 2014-03-14  -1.821000e-02
## 2014-03-21   9.062115e-03
## 2014-03-28  -3.452291e-02
## 2014-04-04   1.748391e-03
## 2014-04-11  -3.628670e-02
## 2014-04-17   2.247863e-02
## 2014-04-25  -1.166886e-02
## 2014-05-02   3.755905e-03
## 2014-05-09  -1.801346e-02
## 2014-05-16  -4.189253e-03
## 2014-05-23   2.166723e-02
## 2014-05-30   7.917103e-03
## 2014-06-06   2.640699e-02
## 2014-06-13  -2.505462e-03
## 2014-06-20   2.275136e-02
## 2014-06-27   7.608446e-04
## 2014-07-03   1.626049e-02
## 2014-07-11  -4.018939e-02
## 2014-07-18  -7.587192e-03
## 2014-07-25  -5.530629e-03
## 2014-08-01  -2.604023e-02
## 2014-08-08   1.426335e-02
## 2014-08-15   9.926763e-03
## 2014-08-22   1.592316e-02
## 2014-08-29   1.164957e-02
## 2014-09-05  -1.545444e-03
## 2014-09-12  -8.716226e-03
## 2014-09-19  -1.220899e-02
## 2014-09-26  -2.258099e-02
## 2014-10-03  -1.331715e-02
## 2014-10-10  -4.581269e-02
## 2014-10-17   2.582407e-02
## 2014-10-24   3.285558e-02
## 2014-10-31   4.824577e-02
## 2014-11-07   1.285893e-03
## 2014-11-14  -1.713052e-04
## 2014-11-21  -9.430921e-04
## 2014-11-28   9.430921e-04
## 2014-12-05   8.533224e-03
## 2014-12-12  -2.564698e-02
## 2014-12-19   3.587587e-02
## 2014-12-26   1.741830e-02
## 2015-01-02  -1.344675e-02
## 2015-01-09  -1.150127e-02
## 2015-01-16  -7.427272e-03
## 2015-01-23   1.209468e-02
## 2015-01-30  -2.070053e-02
## 2015-02-06   3.490654e-02
## 2015-02-13   1.425407e-02
## 2015-02-20   6.969789e-03
## 2015-02-27   1.632717e-03
## 2015-03-06  -1.156920e-02
## 2015-03-13   1.181408e-02
## 2015-03-20   2.719386e-02
## 2015-03-27  -2.015736e-02
## 2015-04-02   1.251256e-02
## 2015-04-10   7.751929e-03
## 2015-04-17  -9.518376e-03
## 2015-04-24   1.142693e-02
## 2015-05-01  -3.139505e-02
## 2015-05-08   5.478003e-03
## 2015-05-15   8.201845e-03
## 2015-05-22   6.288267e-03
## 2015-05-29  -4.349269e-03
## 2015-06-05   1.211472e-02
## 2015-06-12   4.217351e-03
## 2015-06-19   1.520980e-02
## 2015-06-26  -2.819404e-03
## 2015-07-02  -2.537747e-02
## 2015-07-10   2.823440e-03
## 2015-07-17   1.304599e-02
## 2015-07-24  -3.380280e-02
## 2015-07-31   1.128672e-02
## 2015-08-07  -2.536788e-02
## 2015-08-14   3.995982e-03
## 2015-08-21  -4.529448e-02
## 2015-08-28   5.116071e-03
## 2015-09-04  -2.407218e-02
## 2015-09-11   2.025937e-02
## 2015-09-18   4.677410e-03
## 2015-09-25  -3.500112e-02
## 2015-10-02  -7.115557e-03
## 2015-10-09   4.515502e-02
## 2015-10-16  -2.768572e-03
## 2015-10-23   3.718625e-03
## 2015-10-30  -4.411972e-03
## 2015-11-06   3.308599e-02
## 2015-11-13  -4.415802e-02
## 2015-11-20   2.373650e-02
## 2015-11-27   2.377137e-02
## 2015-12-04  -1.550144e-02
## 2015-12-11  -5.112376e-02
## 2015-12-18  -3.849731e-03
## 2015-12-24   3.106017e-02
## 2015-12-31  -1.655537e-02
## 2016-01-08  -8.107172e-02
## 2016-01-15  -3.657819e-02
## 2016-01-22   1.240764e-02
## 2016-01-29   1.556337e-02
## 2016-02-05  -4.896483e-02
## 2016-02-12  -1.490041e-02
## 2016-02-19   3.918468e-02
## 2016-02-26   2.691215e-02
## 2016-03-04   4.296311e-02
## 2016-03-11   4.446020e-03
## 2016-03-18   1.294739e-02
## 2016-03-24  -1.923398e-02
## 2016-04-01   3.591465e-02
## 2016-04-08  -1.825428e-02
## 2016-04-15   3.015207e-02
## 2016-04-22   1.465425e-02
## 2016-04-29  -1.438744e-02
## 2016-05-06  -1.405635e-02
## 2016-05-13  -1.151671e-02
## 2016-05-20   1.043415e-02
## 2016-05-27   3.381127e-02
## 2016-06-03   1.188377e-02
## 2016-06-10   8.619018e-04
## 2016-06-17  -1.746888e-02
## 2016-06-24  -1.483863e-02
## 2016-07-01   2.643174e-02
## 2016-07-08   1.753698e-02
## 2016-07-15   2.461113e-02
## 2016-07-22   5.830952e-03
## 2016-07-29   5.549283e-03
## 2016-08-05   1.010827e-02
## 2016-08-12  -8.998968e-04
## 2016-08-19   6.119297e-03
## 2016-08-26   9.755013e-04
## 2016-09-02   1.171417e-02
## 2016-09-09  -2.653173e-02
## 2016-09-16   5.018362e-03
## 2016-09-23   2.391985e-02
## 2016-09-30  -2.058946e-03
## 2016-10-07  -1.117238e-02
## 2016-10-14  -1.973247e-02
## 2016-10-21   5.299966e-03
## 2016-10-28  -2.543000e-02
## 2016-11-04  -1.959256e-02
## 2016-11-11   9.567152e-02
## 2016-11-18   2.810324e-02
## 2016-11-25   2.324086e-02
## 2016-12-02  -2.392831e-02
## 2016-12-09   5.506400e-02
## 2016-12-16  -1.750445e-02
## 2016-12-23   5.072036e-03
## 2016-12-30  -8.786011e-03
## 2017-01-06   6.209919e-03
## 2017-01-13   4.191643e-03
## 2017-01-20  -1.344645e-02
## 2017-01-27   1.293275e-02
## 2017-02-03   4.980846e-03
## 2017-02-10   7.787022e-03
## 2017-02-17   8.446328e-03
## 2017-02-24  -3.312293e-03
## 2017-03-03   0.000000e+00
## 2017-03-10  -1.959201e-02
## 2017-03-17   1.822074e-02
## 2017-03-24  -2.621624e-02
## 2017-03-31   2.198860e-02
## 2017-04-07  -1.435920e-02
## 2017-04-13  -1.337107e-02
## 2017-04-21   2.576434e-02
## 2017-04-28   1.339288e-02
## 2017-05-05  -5.032889e-04
## 2017-05-12  -1.070533e-02
## 2017-05-19  -1.082130e-02
## 2017-05-26   1.103911e-02
## 2017-06-02   1.665614e-02
## 2017-06-09   1.250607e-02
## 2017-06-16  -1.007787e-02
## 2017-06-23   5.122798e-03
## 2017-06-30   7.047818e-05
## 2017-07-07   1.254652e-03
## 2017-07-14   8.787415e-03
## 2017-07-21   5.769131e-03
## 2017-07-28  -4.147648e-03
## 2017-08-04  -1.240393e-02
## 2017-08-11  -2.703652e-02
## 2017-08-18  -1.142296e-02
## 2017-08-25   1.442274e-02
## 2017-09-01   2.624541e-02
## 2017-09-08  -9.294555e-03
## 2017-09-15   2.265458e-02
## 2017-09-22   1.318455e-02
## 2017-09-29   2.895133e-02
## 2017-10-06   1.254079e-02
## 2017-10-13  -4.542107e-03
## 2017-10-20   4.075525e-03
## 2017-10-27  -1.267751e-03
## 2017-11-03  -7.908814e-03
## 2017-11-10  -1.382236e-02
## 2017-11-17   1.274509e-02
## 2017-11-24   1.670066e-02
## 2017-12-01   1.361989e-02
## 2017-12-08  -1.057702e-02
## 2017-12-15   5.466603e-03
## 2017-12-22   1.000284e-02
## 2017-12-29  -4.776526e-03
## 2018-01-05   1.516697e-02
## 2018-01-12   2.153760e-02
## 2018-01-19   2.778308e-03
## 2018-01-26   6.285512e-03
## 2018-02-02  -3.682266e-02
## 2018-02-09  -4.698131e-02
## 2018-02-16   4.379063e-02
## 2018-02-23   4.165137e-03
## 2018-03-02  -1.064213e-02
## 2018-03-09   4.222033e-02
## 2018-03-16  -7.072343e-03
## 2018-03-23  -4.805387e-02
## 2018-03-29   1.179289e-02
## 2018-04-06  -9.728862e-03
## 2018-04-13   2.359545e-02
## 2018-04-20   1.033938e-02
## 2018-04-27  -5.544254e-03
## 2018-05-04   6.700625e-03
## 2018-05-11   2.604962e-02
## 2018-05-18   1.262008e-02
## 2018-05-25  -8.032524e-04
## 2018-06-01   1.290037e-02
## 2018-06-08   1.622500e-02
## 2018-06-15   7.716917e-03
## 2018-06-22   5.946808e-05
## 2018-06-29  -2.442890e-02
## 2018-07-06   3.060267e-02
## 2018-07-13  -4.945323e-03
## 2018-07-20   6.311467e-03
## 2018-07-27  -1.929706e-02
## 2018-08-03   6.814378e-03
## 2018-08-10   6.828089e-03
## 2018-08-17   4.882651e-03
## 2018-08-24   1.906275e-02
## 2018-08-31   8.299284e-03
## 2018-09-07  -1.443732e-02
## 2018-09-14   4.913550e-03
## 2018-09-21  -5.734890e-03
## 2018-09-28  -8.265870e-03
## 2018-10-05  -3.864907e-02
## 2018-10-12  -5.423160e-02
## 2018-10-19  -1.563798e-03
## 2018-10-26  -3.909548e-02
## 2018-11-02   4.325982e-02
## 2018-11-09   5.193443e-04
## 2018-11-16  -1.398610e-02
## 2018-11-23  -2.701695e-02
## 2018-11-30   3.148256e-02
## 2018-12-07  -5.799910e-02
## 2018-12-14  -2.396192e-02
## 2018-12-21  -8.773245e-02
## 2018-12-28   3.437905e-02
## 2019-01-04   3.207119e-02
## 2019-01-11   4.622158e-02
## 2019-01-18   2.508643e-02
## 2019-01-25   6.783468e-05
## 2019-02-01   1.241076e-02
## 2019-02-08   4.481102e-03
## 2019-02-15   4.163066e-02
## 2019-02-22   1.227861e-02
## 2019-03-01   5.688742e-04
## 2019-03-08  -4.260357e-02
## 2019-03-15   2.036623e-02
## 2019-03-22  -3.111435e-02
## 2019-03-29   2.292711e-02
## 2019-04-05   2.763722e-02
## 2019-04-12   1.904465e-03
## 2019-04-18  -1.302191e-02
## 2019-04-26   1.675672e-02
## 2019-05-03   1.417824e-02
## 2019-05-10  -2.465819e-02
## 2019-05-17  -2.443090e-02
## 2019-05-24  -1.350358e-02
## 2019-05-31  -3.324082e-02
## 2019-06-07   3.370509e-02
## 2019-06-14   5.750186e-03
## 2019-06-21   1.804433e-02
## 2019-06-28   1.001788e-02
## 2019-07-05   7.559714e-03
## 2019-07-12  -3.644553e-03
## 2019-07-19  -1.477780e-02
## 2019-07-26   2.173572e-02
## 2019-08-02  -2.982990e-02
## 2019-08-09  -1.292882e-02
## 2019-08-16  -1.330009e-02
## 2019-08-23  -2.176503e-02
## 2019-08-30   2.317684e-02
## 2019-09-06   7.096535e-03
## 2019-09-13   4.825010e-02
## 2019-09-20  -1.202305e-02
## 2019-09-27  -2.434770e-02
## 2019-10-04  -1.345343e-02
## 2019-10-11   7.215475e-03
## 2019-10-18   1.578464e-02
## 2019-10-25   1.553955e-02
## 2019-11-01   1.980270e-02
## 2019-11-08   6.179406e-03
## 2019-11-15  -1.006363e-03
## 2019-11-22  -4.414412e-03
## 2019-11-29   2.218917e-02
## 2019-12-06   6.469750e-03
## 2019-12-13   3.127352e-03
## 2019-12-20   1.969625e-02
## 2019-12-27  -6.630555e-04
## 2020-01-03  -4.410897e-03
## 2020-01-10  -1.454411e-03
## 2020-01-17   2.503404e-02
## 2020-01-24  -2.200648e-02
## 2020-01-31  -2.982550e-02
## 2020-02-07   2.673728e-02
## 2020-02-14   1.815048e-02
## 2020-02-21  -4.776049e-03
## 2020-02-28  -1.327281e-01
## 2020-03-06  -1.327727e-02
## 2020-03-13  -1.895218e-01
## 2020-03-20  -1.639921e-01
## 2020-03-27   1.082724e-01
## 2020-04-03  -7.315160e-02
## 2020-04-09   1.676862e-01
## 2020-04-17  -1.350825e-02
## 2020-04-24   2.863400e-03
## 2020-05-01   2.205695e-02
## 2020-05-08   5.609254e-02
## 2020-05-15  -5.657198e-02
## 2020-05-22   7.550605e-02
## 2020-05-29   2.929448e-02
## 2020-06-05   7.808039e-02
## 2020-06-12  -8.262622e-02
## 2020-06-19   2.285662e-02
## 2020-06-26  -3.111977e-02
## 2020-07-02   4.107067e-02
## 2020-07-10  -7.683889e-03
## 2020-07-17   3.668344e-02
## 2020-07-24  -3.485101e-03
## 2020-07-31   8.724239e-03
## 2020-08-07   5.806656e-02
## 2020-08-14   5.873741e-03
## 2020-08-21  -1.591302e-02
## 2020-08-28   1.610399e-02
## 2020-09-04  -2.788003e-02
## 2020-09-11  -2.417738e-02
## 2020-09-18   2.737912e-02
## 2020-09-25  -4.211625e-02
## 2020-10-02   4.304612e-02
## 2020-10-09   6.245091e-02
## 2020-10-16  -2.153489e-03
## 2020-10-23   4.425077e-03
## 2020-10-30  -6.315360e-02
## 2020-11-06   6.652059e-02
## 2020-11-13   5.863104e-02
## 2020-11-20   2.279292e-02
## 2020-11-27   3.797406e-02
## 2020-12-04   2.056059e-02
## 2020-12-11   1.109663e-02
## 2020-12-18   2.925550e-02
## 2020-12-24   1.861339e-02
## 2020-12-31  -1.493432e-02
## 2021-01-08   5.777033e-02
## 2021-01-15   1.448155e-02
## 2021-01-22   1.996542e-02
## 2021-01-29  -4.490002e-02
## 2021-02-05   7.536153e-02
## 2021-02-12   2.499519e-02
## 2021-02-19  -9.150186e-03
## 2021-02-26  -3.102846e-02
## 2021-03-05  -2.752115e-03
## 2021-03-12   7.040352e-02
## 2021-03-19  -2.888175e-02
## 2021-03-26  -2.641048e-02
## 2021-04-01   1.408824e-02
## 2021-04-09  -5.153190e-03
## 2021-04-16   9.212113e-03
## 2021-04-23   4.928857e-03
## 2021-04-30  -3.861077e-03
## 2021-05-03   4.879383e-03

#Calculate weekly and monthly returns using log returns

prices_weekly <- to.weekly(prices, indexAt = "last", OHLC = FALSE)
weekly_Return_xts <- na.omit(Return.calculate(prices_weekly, method = "log"))
head(weekly_Return_xts)
##                     SPY          QQQ         EEM         IWM          EFA
## 2010-01-15 -0.008150165 -0.015151916 -0.02936168 -0.01310462 -0.003499562
## 2010-01-22 -0.039762828 -0.037555380 -0.05739709 -0.03110062 -0.057354555
## 2010-01-29 -0.016805812 -0.031515101 -0.03415421 -0.02659356 -0.026141568
## 2010-02-05 -0.006820546  0.004430648 -0.02861835 -0.01407321 -0.019238635
## 2010-02-12  0.012854811  0.017985357  0.03278946  0.02909861  0.005230847
## 2010-02-19  0.028289444  0.024157168  0.02415967  0.03288489  0.022734954
##                      TLT          IYR          GLD
## 2010-01-15  0.0198483225 -0.006324356 -0.004589865
## 2010-01-22  0.0100512027 -0.042683345 -0.033851813
## 2010-01-29  0.0033633583 -0.008483115 -0.011354685
## 2010-02-05 -0.0000540947  0.003218256 -0.012153577
## 2010-02-12 -0.0196525984 -0.007602937  0.022294528
## 2010-02-19 -0.0082390553  0.048966490  0.022447943
prices_monthly <- to.monthly(prices, indexAt = "last", OHLC = FALSE)
monthly_Return_xts <- na.omit(Return.calculate(prices_monthly, method = "log"))
head(monthly_Return_xts)
##                    SPY         QQQ         EEM         IWM          EFA
## 2010-02-26  0.03071793  0.04501044  0.01760802  0.04377882  0.002664268
## 2010-03-31  0.05909865  0.07428087  0.07798729  0.07909466  0.061898269
## 2010-04-30  0.01535150  0.02217754 -0.00166310  0.05523070 -0.028446722
## 2010-05-28 -0.08278878 -0.07679864 -0.09864508 -0.07835767 -0.118702355
## 2010-06-30 -0.05312741 -0.06161677 -0.01408547 -0.08059619 -0.020834896
## 2010-07-30  0.06606917  0.07006933  0.10375152  0.06514060  0.109844203
##                     TLT         IYR          GLD
## 2010-02-26 -0.003430817  0.05313334  0.032223420
## 2010-03-31 -0.020787064  0.09302102 -0.004396042
## 2010-04-30  0.032678511  0.06192375  0.057168648
## 2010-05-28  0.049821843 -0.05851441  0.030056874
## 2010-06-30  0.056358956 -0.04782683  0.023280092
## 2010-07-30 -0.009508418  0.08988455 -0.052210719

#Convert monthly returns into tibble format

monthly_Return_tbl<-monthly_Return_xts %>% as_tibble(rownames = 'date') %>%
  mutate(date = as.yearmon(date) %>% as.Date(frac = 1))
monthly_Return_tbl
## # A tibble: 136 x 9
##    date           SPY      QQQ      EEM     IWM      EFA      TLT     IYR
##    <date>       <dbl>    <dbl>    <dbl>   <dbl>    <dbl>    <dbl>   <dbl>
##  1 2010-02-28  0.0307  0.0450   0.0176   0.0438  0.00266 -0.00343  0.0531
##  2 2010-03-31  0.0591  0.0743   0.0780   0.0791  0.0619  -0.0208   0.0930
##  3 2010-04-30  0.0154  0.0222  -0.00166  0.0552 -0.0284   0.0327   0.0619
##  4 2010-05-31 -0.0828 -0.0768  -0.0986  -0.0784 -0.119    0.0498  -0.0585
##  5 2010-06-30 -0.0531 -0.0616  -0.0141  -0.0806 -0.0208   0.0564  -0.0478
##  6 2010-07-31  0.0661  0.0701   0.104    0.0651  0.110   -0.00951  0.0899
##  7 2010-08-31 -0.0460 -0.0527  -0.0329  -0.0774 -0.0387   0.0806  -0.0131
##  8 2010-09-30  0.0858  0.124    0.111    0.117   0.0951  -0.0255   0.0453
##  9 2010-10-31  0.0375  0.0615   0.0297   0.0406  0.0373  -0.0457   0.0386
## 10 2010-11-30  0      -0.00173 -0.0295   0.0343 -0.0494  -0.0170  -0.0160
## # … with 126 more rows, and 1 more variable: GLD <dbl>

#download 3 Fama French 3 factors data and change to digit numbers (not in percentage)

ffdata <- read_csv("F-F_Research_Data_Factors.csv")
## Warning: Missing column names filled in: 'X1' [1]
## 
## ── Column specification ────────────────────────────────────────────────────────
## cols(
##   X1 = col_double(),
##   `Mkt-RF` = col_double(),
##   SMB = col_double(),
##   HML = col_double(),
##   RF = col_double()
## )
str(ffdata)
## spec_tbl_df[,5] [1,136 × 5] (S3: spec_tbl_df/tbl_df/tbl/data.frame)
##  $ X1    : num [1:1136] 192607 192608 192609 192610 192611 ...
##  $ Mkt-RF: num [1:1136] 2.96 2.64 0.36 -3.24 2.53 2.62 -0.06 4.18 0.13 0.46 ...
##  $ SMB   : num [1:1136] -2.3 -1.4 -1.32 0.04 -0.2 -0.04 -0.56 -0.1 -1.6 0.43 ...
##  $ HML   : num [1:1136] -2.87 4.19 0.01 0.51 -0.35 -0.02 4.83 3.17 -2.67 0.6 ...
##  $ RF    : num [1:1136] 0.22 0.25 0.23 0.32 0.31 0.28 0.25 0.26 0.3 0.25 ...
##  - attr(*, "spec")=
##   .. cols(
##   ..   X1 = col_double(),
##   ..   `Mkt-RF` = col_double(),
##   ..   SMB = col_double(),
##   ..   HML = col_double(),
##   ..   RF = col_double()
##   .. )
head(ffdata)
## # A tibble: 6 x 5
##       X1 `Mkt-RF`   SMB   HML    RF
##    <dbl>    <dbl> <dbl> <dbl> <dbl>
## 1 192607     2.96 -2.3  -2.87  0.22
## 2 192608     2.64 -1.4   4.19  0.25
## 3 192609     0.36 -1.32  0.01  0.23
## 4 192610    -3.24  0.04  0.51  0.32
## 5 192611     2.53 -0.2  -0.35  0.31
## 6 192612     2.62 -0.04 -0.02  0.28
colnames(ffdata) <- paste(c("date","Mkt-RF","SMB","HML","RF"))
ffdata.digit <- ffdata %>% mutate(date = as.character(date))%>% 
  mutate(date=ymd(parse_date(date,format="%Y%m"))) %>%
  mutate(date=rollback(date))
ffdata.digit.1 <- ffdata.digit %>% select(c(2,3,4,5))/100
head(ffdata.digit.1)
##    Mkt-RF     SMB     HML     RF
## 1  0.0296 -0.0230 -0.0287 0.0022
## 2  0.0264 -0.0140  0.0419 0.0025
## 3  0.0036 -0.0132  0.0001 0.0023
## 4 -0.0324  0.0004  0.0051 0.0032
## 5  0.0253 -0.0020 -0.0035 0.0031
## 6  0.0262 -0.0004 -0.0002 0.0028
ffdata.digit.xts <- xts(ffdata.digit.1,order.by=as.Date(ffdata.digit$date))
head(ffdata.digit.xts)
##             Mkt-RF     SMB     HML     RF
## 1926-06-30  0.0296 -0.0230 -0.0287 0.0022
## 1926-07-31  0.0264 -0.0140  0.0419 0.0025
## 1926-08-31  0.0036 -0.0132  0.0001 0.0023
## 1926-09-30 -0.0324  0.0004  0.0051 0.0032
## 1926-10-31  0.0253 -0.0020 -0.0035 0.0031
## 1926-11-30  0.0262 -0.0004 -0.0002 0.0028
ffdata.digit_tbl<-ffdata.digit.xts %>% as_tibble(rownames = 'date') %>%
  mutate(date = as.yearmon(date) %>% as.Date(frac = 1))
ffdata.digit_tbl
## # A tibble: 1,136 x 5
##    date       `Mkt-RF`     SMB     HML     RF
##    <date>        <dbl>   <dbl>   <dbl>  <dbl>
##  1 1926-06-30   0.0296 -0.023  -0.0287 0.0022
##  2 1926-07-31   0.0264 -0.014   0.0419 0.0025
##  3 1926-08-31   0.0036 -0.0132  0.0001 0.0023
##  4 1926-09-30  -0.0324  0.0004  0.0051 0.0032
##  5 1926-10-31   0.0253 -0.002  -0.0035 0.0031
##  6 1926-11-30   0.0262 -0.0004 -0.0002 0.0028
##  7 1926-12-31  -0.0006 -0.0056  0.0483 0.0025
##  8 1927-01-31   0.0418 -0.001   0.0317 0.0026
##  9 1927-02-28   0.0013 -0.016  -0.0267 0.003 
## 10 1927-03-31   0.0046  0.0043  0.006  0.0025
## # … with 1,126 more rows

#Merge monthly return data in question 3 and 4 into tibble format.

all.ret.merge <- monthly_Return_tbl %>% left_join(ffdata.digit_tbl)
## Joining, by = "date"
glimpse(all.ret.merge)
## Rows: 136
## Columns: 13
## $ date     <date> 2010-02-28, 2010-03-31, 2010-04-30, 2010-05-31, 2010-06-30, …
## $ SPY      <dbl> 0.0307179263, 0.0590986496, 0.0153514997, -0.0827887765, -0.0…
## $ QQQ      <dbl> 0.045010440, 0.074280867, 0.022177539, -0.076798640, -0.06161…
## $ EEM      <dbl> 0.0176080160, 0.0779872921, -0.0016631002, -0.0986450835, -0.…
## $ IWM      <dbl> 0.043778818, 0.079094659, 0.055230704, -0.078357667, -0.08059…
## $ EFA      <dbl> 0.002664268, 0.061898269, -0.028446722, -0.118702355, -0.0208…
## $ TLT      <dbl> -0.0034308174, -0.0207870639, 0.0326785109, 0.0498218431, 0.0…
## $ IYR      <dbl> 0.053133344, 0.093021018, 0.061923748, -0.058514411, -0.04782…
## $ GLD      <dbl> 0.032223420, -0.004396042, 0.057168648, 0.030056874, 0.023280…
## $ `Mkt-RF` <dbl> 0.0631, 0.0200, -0.0789, -0.0557, 0.0693, -0.0477, 0.0954, 0.…
## $ SMB      <dbl> 0.0144, 0.0486, 0.0014, -0.0184, 0.0018, -0.0302, 0.0393, 0.0…
## $ HML      <dbl> 0.0211, 0.0291, -0.0239, -0.0452, -0.0036, -0.0190, -0.0323, …
## $ RF       <dbl> 1e-04, 1e-04, 1e-04, 1e-04, 1e-04, 1e-04, 1e-04, 1e-04, 1e-04…

1. Based on CAPM model, compute MVP monthly returns based on estimated covariance matrix for the 8-asset portfolio by using past 60-month returns from 2015/01 - 2021/03. (Hint: you can use SIT package or portfolioBacktest package to help you to run backtesting!)

n <- 60
ones = rep(1,n)
Y <- all.ret.merge %>% select(2:9) %>% slice (1:60) %>% as.matrix
X <- all.ret.merge %>% select(`Mkt-RF`) %>% slice (1:60) %>% cbind(ones, .) %>% as.matrix
b_hat.1 = solve(t(X)%*%X)%*%t(X)%*%Y
E_hat = Y - X%*%b_hat.1
res_var.1 = diag(t(E_hat)%*%E_hat)/(n-2)
diagD_hat.1 = diag(res_var.1)
cov_factor.1 = var(X[,2])*t(b_hat.1)%*%b_hat.1 + diagD_hat.1
cov_factor.1
##               SPY           QQQ           EEM           IWM           EFA
## SPY  1.402632e-03  1.860517e-05  2.702352e-05  3.980220e-05  9.068661e-06
## QQQ  1.860517e-05  1.793847e-03  2.164992e-05  3.196972e-05  7.305086e-06
## EEM  2.702352e-05  2.164992e-05  3.448101e-03  4.670743e-05  1.059675e-05
## IWM  3.980220e-05  3.196972e-05  4.670743e-05  2.708017e-03  1.561394e-05
## EFA  9.068661e-06  7.305086e-06  1.059675e-05  1.561394e-05  2.467212e-03
## TLT -1.855051e-05 -1.476642e-05 -2.205654e-05 -3.220752e-05 -7.266941e-06
## IYR  2.572364e-05  2.071248e-05  3.007689e-05  4.430283e-05  1.009497e-05
## GLD  7.943893e-05  6.361483e-05  9.363341e-05  1.373443e-04  3.114832e-05
##               TLT           IYR           GLD
## SPY -1.855051e-05  2.572364e-05  7.943893e-05
## QQQ -1.476642e-05  2.071248e-05  6.361483e-05
## EEM -2.205654e-05  3.007689e-05  9.363341e-05
## IWM -3.220752e-05  4.430283e-05  1.373443e-04
## EFA -7.266941e-06  1.009497e-05  3.114832e-05
## TLT  1.572948e-03 -2.064257e-05 -6.493212e-05
## IYR -2.064257e-05  2.028834e-03  8.841353e-05
## GLD -6.493212e-05  8.841353e-05  2.947990e-03
one.vec2 <- rep(1,8)
top <- solve(cov_factor.1)%*%one.vec2
bot <- t(one.vec2)%*%top
capm.mvp <- top/as.numeric(bot)
capm.mvp
##           [,1]
## SPY 0.18597710
## QQQ 0.14638573
## EEM 0.07412321
## IWM 0.09182335
## EFA 0.10898674
## TLT 0.18748897
## IYR 0.12715485
## GLD 0.07806005
w.gmin.si = solve(cov_factor.1)%*%rep(1,nrow(cov_factor.1))
w.gmin.si = w.gmin.si/sum(w.gmin.si)
colnames(w.gmin.si) = "CAPM.MVP"
w.gmin.si
##       CAPM.MVP
## SPY 0.18597710
## QQQ 0.14638573
## EEM 0.07412321
## IWM 0.09182335
## EFA 0.10898674
## TLT 0.18748897
## IYR 0.12715485
## GLD 0.07806005

2. Based on FF 3-factor model, compute MVP monthly returns covariance matrix for the 8-asset portfolio by using past 60-month returns from 2015/01 - 2021/03.

X.3 <- all.ret.merge %>% select(`Mkt-RF`, SMB, HML) %>% slice(1:60) %>% cbind(ones, .) %>% as.matrix
sigF3 <- X.3[,-1] %>% var()
b_hat.3 = solve(t(X.3)%*%X.3)%*%t(X.3)%*%Y
E_hat = Y - X.3%*%b_hat.3
res_var.3 = diag(t(E_hat)%*%E_hat)/(n-4)
diagD_hat.3 = diag(res_var.3)
b_hat.3 <- b_hat.3[-1,]
cov_factor.3 = t(b_hat.3)%*%sigF3%*%b_hat.3 + diagD_hat.3
cov_factor.3
##               SPY           QQQ           EEM           IWM           EFA
## SPY  1.445420e-03  1.149788e-04  0.0001666431  0.0001614018  1.548080e-04
## QQQ  1.149788e-04  1.852165e-03  0.0001068636  0.0001233903  1.209652e-04
## EEM  1.666431e-04  1.068636e-04  0.0035546027  0.0002328885  2.183187e-04
## IWM  1.614018e-04  1.233903e-04  0.0002328885  0.0027943672  1.795276e-04
## EFA  1.548080e-04  1.209652e-04  0.0002183187  0.0001795276  2.544845e-03
## TLT -1.289990e-04 -1.191879e-04 -0.0001101008 -0.0001340646 -1.346680e-04
## IYR  8.287286e-05  6.114867e-05  0.0001271028  0.0001135234  8.972864e-05
## GLD  4.878199e-05  1.145580e-05  0.0001572394  0.0001375263  1.889377e-05
##               TLT           IYR          GLD
## SPY -1.289990e-04  8.287286e-05 4.878199e-05
## QQQ -1.191879e-04  6.114867e-05 1.145580e-05
## EEM -1.101008e-04  1.271028e-04 1.572394e-04
## IWM -1.340646e-04  1.135234e-04 1.375263e-04
## EFA -1.346680e-04  8.972864e-05 1.889377e-05
## TLT  1.621917e-03 -6.526025e-05 1.940474e-06
## IYR -6.526025e-05  2.098028e-03 9.617295e-05
## GLD  1.940474e-06  9.617295e-05 3.038401e-03
one <- rep(1,8)
top.mat <- solve(cov_factor.3)%*%one
bot.mat <- t(one)%*%top.mat
FF3F.MVP <- top.mat/as.numeric(bot.mat)
FF3F.MVP
##           [,1]
## SPY 0.17982237
## QQQ 0.14540973
## EEM 0.05914220
## IWM 0.08104801
## EFA 0.09609111
## TLT 0.23263834
## IYR 0.12233833
## GLD 0.08350992

Compute global minimum variance portfolio weights of CAPM and FamaFrench

one.vec <- rep(1, 8)
a.1 <- solve(cov_factor.1)%*%one.vec
b.1 <- t(one.vec)%*%a.1
mvp.weight.1 <- a.1/as.numeric(b.1)
mvp.weight.1
##           [,1]
## SPY 0.18597710
## QQQ 0.14638573
## EEM 0.07412321
## IWM 0.09182335
## EFA 0.10898674
## TLT 0.18748897
## IYR 0.12715485
## GLD 0.07806005

3. Based on PCA with 3 factors, compute MVP monthly returns covariance matrix for the 8-asset portfolio by using past 60-month returns from 2015/01 - 2021/03. (Hint: you can use package factorAnalytics or covFactorModel to extract covariance matrix based on 3-factor PCA analysis!)