Question 1-4

# Load libraries
library(quantmod)
## Warning: package 'quantmod' was built under R version 4.3.3
## Loading required package: xts
## Warning: package 'xts' was built under R version 4.3.3
## Loading required package: zoo
## Warning: package 'zoo' was built under R version 4.3.3
## 
## Attaching package: 'zoo'
## The following objects are masked from 'package:base':
## 
##     as.Date, as.Date.numeric
## Loading required package: TTR
## Warning: package 'TTR' was built under R version 4.3.3
## Registered S3 method overwritten by 'quantmod':
##   method            from
##   as.zoo.data.frame zoo
library(tidyquant)
## Warning: package 'tidyquant' was built under R version 4.3.3
## Loading required package: lubridate
## Warning: package 'lubridate' was built under R version 4.3.3
## 
## Attaching package: 'lubridate'
## The following objects are masked from 'package:base':
## 
##     date, intersect, setdiff, union
## Loading required package: PerformanceAnalytics
## Warning: package 'PerformanceAnalytics' was built under R version 4.3.3
## 
## Attaching package: 'PerformanceAnalytics'
## The following object is masked from 'package:graphics':
## 
##     legend
library(lubridate)
library(timetk)
## Warning: package 'timetk' was built under R version 4.3.3
library(purrr)
## Warning: package 'purrr' was built under R version 4.3.3
library(tibble)
## Warning: package 'tibble' was built under R version 4.3.3
library(PerformanceAnalytics)
library(magrittr)
## Warning: package 'magrittr' was built under R version 4.3.3
## 
## Attaching package: 'magrittr'
## The following object is masked from 'package:purrr':
## 
##     set_names
library(readr)
## Warning: package 'readr' was built under R version 4.3.3
library(xts)
library(dplyr)
## Warning: package 'dplyr' was built under R version 4.3.3
## 
## ######################### Warning from 'xts' package ##########################
## #                                                                             #
## # The dplyr lag() function breaks how base R's lag() function is supposed to  #
## # work, which breaks lag(my_xts). Calls to lag(my_xts) that you type or       #
## # source() into this session won't work correctly.                            #
## #                                                                             #
## # Use stats::lag() to make sure you're not using dplyr::lag(), or you can add #
## # conflictRules('dplyr', exclude = 'lag') to your .Rprofile to stop           #
## # dplyr from breaking base R's lag() function.                                #
## #                                                                             #
## # Code in packages is not affected. It's protected by R's namespace mechanism #
## # Set `options(xts.warn_dplyr_breaks_lag = FALSE)` to suppress this warning.  #
## #                                                                             #
## ###############################################################################
## 
## Attaching package: 'dplyr'
## 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(ggplot2)
## Warning: package 'ggplot2' was built under R version 4.3.3
# Define the ticker names and the time frame
tickers <- c("SPY", "QQQ", "EEM", "IWM", "EFA", "TLT", "IYR", "GLD")
data = new.env()
getSymbols(tickers, src = 'yahoo', from = '2010-01-01', to = Sys.Date(), auto.assign = TRUE)
## [1] "SPY" "QQQ" "EEM" "IWM" "EFA" "TLT" "IYR" "GLD"
ETFList <- merge(Ad(SPY), Ad(QQQ),Ad(EEM), Ad(IWM),Ad(EFA),Ad(TLT),Ad(IYR),Ad(GLD))
colnames(ETFList) <- c("SPY", "QQQ", "EEM", "IWM", "EFA", "TLT", "IYR", "GLD")
head(ETFList)
##                 SPY      QQQ      EEM      IWM      EFA      TLT      IYR
## 2010-01-04 86.86007 40.73328 31.82711 52.51540 37.52378 61.13185 28.10298
## 2010-01-05 87.09000 40.73328 32.05812 52.33484 37.55685 61.52662 28.17046
## 2010-01-06 87.15131 40.48756 32.12519 52.28559 37.71561 60.70299 28.15819
## 2010-01-07 87.51920 40.51390 31.93890 52.67134 37.57009 60.80514 28.40972
## 2010-01-08 87.81041 40.84734 32.19226 52.95864 37.86773 60.77792 28.21954
## 2010-01-11 87.93307 40.68063 32.12519 52.74523 38.17863 60.44437 28.35450
##               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(ETFList)
##               SPY    QQQ   EEM    IWM   EFA   TLT   IYR    GLD
## 2024-04-05 518.43 440.47 41.25 204.45 78.97 91.39 87.19 215.14
## 2024-04-08 518.72 440.60 41.52 205.57 79.36 91.38 88.17 216.48
## 2024-04-09 519.32 442.23 41.80 206.38 79.35 92.23 89.23 217.67
## 2024-04-10 514.12 438.37 41.23 200.93 78.30 90.22 85.61 215.61
## 2024-04-11 518.00 445.37 41.48 202.29 78.51 89.81 85.71 219.80
## 2024-04-12 510.85 438.27 40.53 198.69 77.24 90.29 84.80 216.89
ETFList.xts <- xts(ETFList)
head(ETFList.xts)
##                 SPY      QQQ      EEM      IWM      EFA      TLT      IYR
## 2010-01-04 86.86007 40.73328 31.82711 52.51540 37.52378 61.13185 28.10298
## 2010-01-05 87.09000 40.73328 32.05812 52.33484 37.55685 61.52662 28.17046
## 2010-01-06 87.15131 40.48756 32.12519 52.28559 37.71561 60.70299 28.15819
## 2010-01-07 87.51920 40.51390 31.93890 52.67134 37.57009 60.80514 28.40972
## 2010-01-08 87.81041 40.84734 32.19226 52.95864 37.86773 60.77792 28.21954
## 2010-01-11 87.93307 40.68063 32.12519 52.74523 38.17863 60.44437 28.35450
##               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
ETFList.weekly <- to.weekly(ETFList.xts, indexAt = "last", OHLC = FALSE)
ETFList.weekly
##                  SPY       QQQ      EEM       IWM      EFA      TLT      IYR
## 2010-01-08  87.81041  40.84734 32.19226  52.95864 37.86773 60.77792 28.21954
## 2010-01-15  87.09766  40.23312 31.26077  52.26917 37.73545 61.99635 28.04163
## 2010-01-22  83.70236  38.75016 29.51702  50.66857 35.63206 62.62255 26.86991
## 2010-01-29  82.30744  37.54796 28.52592  49.33887 34.71264 62.83350 26.64293
## 2010-02-05  81.74796  37.71469 27.72112  48.64941 34.05120 62.83013 26.72881
## 2010-02-12  82.80562  38.39915 28.64514  50.08582 34.22978 61.60743 26.52637
## 2010-02-19  85.18158  39.33805 29.34563  51.76025 35.01691 61.10194 27.85759
## 2010-02-26  84.87502  39.27664 29.03264  51.54684 34.80524 62.61837 28.09685
## 2010-03-05  87.56519  40.75082 30.51558  54.68235 36.36626 61.85777 29.10293
## 2010-03-12  88.49256  41.55812 30.82856  55.58524 36.81604 62.00163 30.09061
##        ...                                                                  
## 2024-02-09 499.64758 436.47284 39.58000 198.83511 75.30000 93.24754 86.81923
## 2024-02-16 497.96283 430.00143 40.08000 201.14925 76.07000 92.16454 86.76942
## 2024-02-23 506.27698 436.20322 40.60000 199.38373 77.40000 93.26742 87.43687
## 2024-03-01 511.26147 445.02155 40.48000 205.36853 78.00000 94.15850 89.22008
## 2024-03-08 510.13498 438.44025 40.82000 206.30615 79.25000 95.41434 90.50518
## 2024-03-15 509.82999 433.34702 40.77000 201.89734 78.89000 92.63354 87.90509
## 2024-03-22 521.21002 446.38000 40.86000 205.07001 79.64000 93.67011 87.89000
## 2024-03-28 523.07001 444.01001 41.08000 210.30000 79.86000 94.30801 89.90000
## 2024-04-05 518.42999 440.47000 41.25000 204.45000 78.97000 91.39000 87.19000
## 2024-04-12 510.85001 438.26999 40.53000 198.69000 77.24000 90.29000 84.80000
##               GLD
## 2010-01-08 111.37
## 2010-01-15 110.86
## 2010-01-22 107.17
## 2010-01-29 105.96
## 2010-02-05 104.68
## 2010-02-12 107.04
## 2010-02-19 109.47
## 2010-02-26 109.43
## 2010-03-05 110.81
## 2010-03-12 107.95
##        ...       
## 2024-02-09 187.60
## 2024-02-16 186.34
## 2024-02-23 188.62
## 2024-03-01 192.89
## 2024-03-08 201.63
## 2024-03-15 199.71
## 2024-03-22 200.35
## 2024-03-28 205.72
## 2024-04-05 215.14
## 2024-04-12 216.89
ETFList.monthly <- to.monthly(ETFList.xts, indexAt = "last", OHLC = FALSE)
ETFList.monthly
##                  SPY       QQQ      EEM       IWM      EFA      TLT      IYR
## 2010-01-29  82.30744  37.54796 28.52592  49.33887 34.71264 62.83350 26.64293
## 2010-02-26  84.87502  39.27664 29.03264  51.54684 34.80524 62.61837 28.09685
## 2010-03-31  90.04217  42.30521 31.38745  55.78952 37.02769 61.33014 30.83585
## 2010-04-30  91.43511  43.25393 31.33529  58.95749 35.98923 63.36737 32.80570
## 2010-05-28  84.17018  40.05643 28.39178  54.51409 31.96103 66.60445 30.94116
## 2010-06-30  79.81516  37.66280 27.99468  50.29284 31.30201 70.46602 29.49617
## 2010-07-30  85.26658  40.39646 31.05520  53.67801 34.93630 69.79914 32.27023
## 2010-08-31  81.43123  38.32417 30.05004  49.68229 33.61047 75.65596 31.85163
## 2010-09-30  88.72376  43.37254 33.58312  55.86542 36.96209 73.74915 33.32625
## 2010-10-29  92.11318  46.12144 34.59579  58.18279 38.36869 70.45305 34.63710
##        ...                                                                  
## 2023-07-31 452.93155 381.65601 41.17138 196.56013 73.53755 97.25170 86.00314
## 2023-08-31 445.57053 375.99597 38.44297 186.56940 70.64384 94.19599 83.35612
## 2023-09-29 424.43509 356.89594 37.24562 175.64836 68.06618 86.70634 77.19147
## 2023-10-31 415.22119 349.52429 36.01882 163.50385 66.09096 81.96941 74.41558
## 2023-11-30 453.14908 387.33871 38.82574 178.55032 71.52282 90.10396 83.56317
## 2023-12-29 473.83777 408.97919 40.21000 200.20164 75.35000 97.93017 91.06306
## 2024-01-31 481.38434 416.41937 38.39000 192.39148 75.01000 95.73149 86.42075
## 2024-02-29 506.50626 438.42029 39.99000 203.21399 77.25000 93.57542 88.26373
## 2024-03-28 523.07001 444.01001 41.08000 210.30000 79.86000 94.30801 89.90000
## 2024-04-12 510.85001 438.26999 40.53000 198.69000 77.24000 90.29000 84.80000
##               GLD
## 2010-01-29 105.96
## 2010-02-26 109.43
## 2010-03-31 108.95
## 2010-04-30 115.36
## 2010-05-28 118.88
## 2010-06-30 121.68
## 2010-07-30 115.49
## 2010-08-31 122.08
## 2010-09-30 127.91
## 2010-10-29 132.62
##        ...       
## 2023-07-31 182.35
## 2023-08-31 180.02
## 2023-09-29 171.45
## 2023-10-31 184.09
## 2023-11-30 188.75
## 2023-12-29 191.17
## 2024-01-31 188.45
## 2024-02-29 189.31
## 2024-03-28 205.72
## 2024-04-12 216.89
ETFList.price <- cumprod(ETFList.monthly+1)*100
head(ETFList.price)
##                     SPY          QQQ          EEM          IWM          EFA
## 2010-01-29 8.330744e+03 3.854796e+03 2.952592e+03 5.033887e+03 3.571264e+03
## 2010-02-26 7.154028e+05 1.552582e+05 8.867414e+04 2.645149e+05 1.278700e+05
## 2010-03-31 6.513182e+07 6.723490e+06 2.871929e+06 1.502167e+07 4.862600e+06
## 2010-04-30 6.020467e+09 2.975409e+08 9.286466e+07 9.006618e+08 1.798638e+08
## 2010-05-28 5.127643e+11 1.221597e+10 2.729458e+09 4.999942e+10 5.928496e+09
## 2010-06-30 4.143912e+13 4.723034e+11 7.913976e+10 2.564612e+12 1.915024e+11
##                     TLT          IYR          GLD
## 2010-01-29 6.383350e+03 2.764293e+03 1.069600e+04
## 2010-02-26 4.060983e+05 8.043223e+04 1.181159e+06
## 2010-03-31 2.531216e+07 2.560628e+06 1.298685e+08
## 2010-04-30 1.629277e+09 8.656383e+07 1.511149e+10
## 2010-05-28 1.101464e+11 2.764949e+09 1.811566e+12
## 2010-06-30 7.871725e+12 8.432037e+10 2.222429e+14
tail(ETFList.price)
##            SPY QQQ           EEM IWM           EFA TLT           IYR GLD
## 2023-11-30 Inf Inf 7.698281e+262 Inf 4.006449e+288 Inf 6.428236e+299 Inf
## 2023-12-29 Inf Inf 3.172462e+264 Inf 3.058924e+290 Inf 5.918031e+301 Inf
## 2024-01-31 Inf Inf 1.249633e+266 Inf 2.325088e+292 Inf 5.173587e+303 Inf
## 2024-02-29 Inf Inf 5.122244e+267 Inf 1.819381e+294 Inf 4.618136e+305 Inf
## 2024-03-28 Inf Inf 2.155440e+269 Inf 1.471152e+296 Inf 4.197886e+307 Inf
## 2024-04-12 Inf Inf 8.951544e+270 Inf 1.151029e+298 Inf           Inf Inf
ETFList.price.sample <- ETFList.price['201001/202105']
ETFList.price.sample
##                      SPY           QQQ           EEM           IWM
## 2010-01-29  8.330744e+03  3.854796e+03  2.952592e+03  5.033887e+03
## 2010-02-26  7.154028e+05  1.552582e+05  8.867414e+04  2.645149e+05
## 2010-03-31  6.513182e+07  6.723490e+06  2.871929e+06  1.502167e+07
## 2010-04-30  6.020467e+09  2.975409e+08  9.286466e+07  9.006618e+08
## 2010-05-28  5.127643e+11  1.221597e+10  2.729458e+09  4.999942e+10
## 2010-06-30  4.143912e+13  4.723034e+11  7.913976e+10  2.564612e+12
## 2010-07-30  3.574811e+15  1.955169e+13  2.536841e+12  1.402279e+14
## 2010-08-31  2.946761e+17  7.688541e+14  7.876900e+13  7.107072e+15
## 2010-09-30  2.643945e+19  3.411601e+16  2.724078e+15  4.041466e+17
## 2010-10-29  2.461861e+21  1.607596e+18  9.696570e+16  2.391852e+19
##        ...                                                        
## 2020-08-31 1.742973e+286 2.982290e+255 1.374234e+199 3.070979e+257
## 2020-09-30 5.559950e+288 8.134166e+257 5.733180e+200 4.431667e+259
## 2020-10-30 1.729498e+291 2.151280e+260 2.424659e+202 6.535164e+261
## 2020-11-30 5.963161e+293 6.325870e+262 1.115448e+204 1.138337e+264
## 2020-12-31 2.131998e+296 1.951014e+265 5.489447e+205 2.153290e+266
## 2021-01-29 7.545036e+298 6.032958e+267 2.785520e+207 4.269507e+268
## 2021-02-26 2.744186e+301 1.863039e+270 1.424378e+209 8.987934e+270
## 2021-03-31 1.043269e+304 5.851705e+272 7.231735e+210 1.918361e+273
## 2021-04-30 4.175542e+306 1.946264e+275 3.714823e+212 4.167358e+275
## 2021-05-28           Inf 6.395710e+277 1.939093e+214 9.077417e+277
##                      EFA           TLT           IYR           GLD
## 2010-01-29  3.571264e+03  6.383350e+03  2.764293e+03  1.069600e+04
## 2010-02-26  1.278700e+05  4.060983e+05  8.043223e+04  1.181159e+06
## 2010-03-31  4.862600e+06  2.531216e+07  2.560628e+06  1.298685e+08
## 2010-04-30  1.798638e+08  1.629277e+09  8.656383e+07  1.511149e+10
## 2010-05-28  5.928496e+09  1.101464e+11  2.764949e+09  1.811566e+12
## 2010-06-30  1.915024e+11  7.871725e+12  8.432037e+10  2.222429e+14
## 2010-07-30  6.881887e+12  5.573114e+14  2.805358e+12  2.588907e+16
## 2010-08-31  2.381853e+14  4.272124e+16  9.216056e+13  3.186427e+18
## 2010-09-30  9.042012e+15  3.193376e+18  3.163527e+15  4.107624e+20
## 2010-10-29  3.559722e+17  2.281765e+20  1.127389e+17  5.488607e+22
##        ...                                                        
## 2020-08-31 1.069981e+217 2.825092e+256 8.236429e+223 1.319472e+273
## 2020-09-30 6.275087e+218 4.258082e+258 6.085279e+225 2.350243e+275
## 2020-10-30 3.551690e+220 6.202117e+260 4.366526e+227 4.164631e+277
## 2020-11-30 2.292035e+222 9.182986e+262 3.398295e+229 6.982837e+279
## 2020-12-31 1.552169e+224 1.343073e+265 2.710117e+231 1.252442e+282
## 2021-01-29 1.043040e+226 1.893463e+267 2.152080e+233 2.174364e+284
## 2021-02-26 7.163631e+227 2.517451e+269 1.749906e+235 3.540082e+286
## 2021-03-31 5.041852e+229 3.172832e+271 1.504037e+237 5.698116e+288
## 2021-04-30 3.651796e+231 4.097813e+273 1.393466e+239 9.496480e+290
## 2021-05-28 2.735817e+233 5.292570e+275 1.303899e+241 1.703479e+293
ETF.monthly.returns <- na.omit(Return.calculate(ETFList.monthly, method = "log"))
head(ETF.monthly.returns)
##                    SPY         QQQ          EEM         IWM          EFA
## 2010-02-26  0.03071824  0.04501088  0.017607685  0.04377884  0.002664116
## 2010-03-31  0.05909832  0.07428045  0.077987373  0.07909505  0.061898170
## 2010-04-30  0.01535147  0.02217783 -0.001663323  0.05523068 -0.028446486
## 2010-05-28 -0.08278885 -0.07679893 -0.098645082 -0.07835750 -0.118702393
## 2010-06-30 -0.05312732 -0.06161647 -0.014085189 -0.08059645 -0.020834838
## 2010-07-30  0.06606917  0.07006943  0.103751649  0.06514070  0.109844045
##                     TLT         IYR          GLD
## 2010-02-26 -0.003429683  0.05313338  0.032223422
## 2010-03-31 -0.020787237  0.09302058 -0.004396045
## 2010-04-30  0.032677681  0.06192427  0.057168645
## 2010-05-28  0.049822383 -0.05851483  0.030056879
## 2010-06-30  0.056359136 -0.04782691  0.023280093
## 2010-07-30 -0.009508887  0.08988450 -0.052210723
tail(ETF.monthly.returns)
##                    SPY         QQQ         EEM         IWM          EFA
## 2023-11-30  0.08740979  0.10272648  0.07504172  0.08803398  0.078984614
## 2023-12-29  0.04464384  0.05436473  0.03503235  0.11445460  0.052127352
## 2024-01-31  0.01580099  0.01802859 -0.04631871 -0.03979283 -0.004522438
## 2024-02-29  0.05087068  0.05148515  0.04083247  0.05472731  0.029425449
## 2024-03-28  0.03217864  0.01266909  0.02689196  0.03427554  0.033228193
## 2024-04-12 -0.02363930 -0.01301197 -0.01347902 -0.05678926 -0.033357679
##                     TLT         IYR          GLD
## 2023-11-30  0.094617919  0.11593755  0.024998640
## 2023-12-29  0.083290561  0.08594939  0.012739687
## 2024-01-31 -0.022707350 -0.05232452 -0.014330371
## 2024-02-29 -0.022779518  0.02110145  0.004553167
## 2024-03-28  0.007798301  0.01836875  0.083130157
## 2024-04-12 -0.043539366 -0.05840238  0.052874283
ETF.monthly.returns.tibble <- as_tibble(ETF.monthly.returns)
ETF.monthly.returns.tibble
## # A tibble: 171 × 8
##        SPY      QQQ      EEM     IWM      EFA      TLT     IYR      GLD
##      <dbl>    <dbl>    <dbl>   <dbl>    <dbl>    <dbl>   <dbl>    <dbl>
##  1  0.0307  0.0450   0.0176   0.0438  0.00266 -0.00343  0.0531  0.0322 
##  2  0.0591  0.0743   0.0780   0.0791  0.0619  -0.0208   0.0930 -0.00440
##  3  0.0154  0.0222  -0.00166  0.0552 -0.0284   0.0327   0.0619  0.0572 
##  4 -0.0828 -0.0768  -0.0986  -0.0784 -0.119    0.0498  -0.0585  0.0301 
##  5 -0.0531 -0.0616  -0.0141  -0.0806 -0.0208   0.0564  -0.0478  0.0233 
##  6  0.0661  0.0701   0.104    0.0651  0.110   -0.00951  0.0899 -0.0522 
##  7 -0.0460 -0.0527  -0.0329  -0.0774 -0.0387   0.0806  -0.0131  0.0555 
##  8  0.0858  0.124    0.111    0.117   0.0951  -0.0255   0.0453  0.0467 
##  9  0.0375  0.0615   0.0297   0.0406  0.0373  -0.0457   0.0386  0.0362 
## 10  0      -0.00173 -0.0295   0.0343 -0.0494  -0.0170  -0.0160  0.0209 
## # ℹ 161 more rows
setwd("D:/School Folder/HW/Investment")
famafrench <- read.csv("F-F_Research_Data_Factors.csv",  header = TRUE)
str(famafrench)
## 'data.frame':    1172 obs. of  5 variables:
##  $ date  : int  192607 192608 192609 192610 192611 192612 192701 192702 192703 192704 ...
##  $ Mkt.RF: num  2.96 2.64 0.36 -3.24 2.53 2.62 -0.06 4.18 0.13 0.46 ...
##  $ SMB   : num  -2.56 -1.17 -1.4 -0.09 -0.1 -0.03 -0.37 0.04 -1.65 0.3 ...
##  $ HML   : num  -2.43 3.82 0.13 0.7 -0.51 -0.05 4.54 2.94 -2.61 0.81 ...
##  $ RF    : num  0.22 0.25 0.23 0.32 0.31 0.28 0.25 0.26 0.3 0.25 ...
head(famafrench)
##     date Mkt.RF   SMB   HML   RF
## 1 192607   2.96 -2.56 -2.43 0.22
## 2 192608   2.64 -1.17  3.82 0.25
## 3 192609   0.36 -1.40  0.13 0.23
## 4 192610  -3.24 -0.09  0.70 0.32
## 5 192611   2.53 -0.10 -0.51 0.31
## 6 192612   2.62 -0.03 -0.05 0.28
colnames(famafrench) <- paste(c("date","Mkt-RF","SMB","HML","RF"))
famafrench.digit <- famafrench %>% mutate(date = as.character(date))%>% 
  mutate(date=ymd(parse_date(date,format="%Y%m"))) %>%
  mutate(date=rollback(date))
head(famafrench.digit)
##         date Mkt-RF   SMB   HML   RF
## 1 1926-06-30   2.96 -2.56 -2.43 0.22
## 2 1926-07-31   2.64 -1.17  3.82 0.25
## 3 1926-08-31   0.36 -1.40  0.13 0.23
## 4 1926-09-30  -3.24 -0.09  0.70 0.32
## 5 1926-10-31   2.53 -0.10 -0.51 0.31
## 6 1926-11-30   2.62 -0.03 -0.05 0.28
famafrench.digit.xts <- xts(famafrench.digit[,-1],order.by=as.Date(famafrench.digit$date))
head(famafrench.digit.xts)
##            Mkt-RF   SMB   HML   RF
## 1926-06-30   2.96 -2.56 -2.43 0.22
## 1926-07-31   2.64 -1.17  3.82 0.25
## 1926-08-31   0.36 -1.40  0.13 0.23
## 1926-09-30  -3.24 -0.09  0.70 0.32
## 1926-10-31   2.53 -0.10 -0.51 0.31
## 1926-11-30   2.62 -0.03 -0.05 0.28
#MERGING
final.data <- merge(famafrench.digit,ETF.monthly.returns)
tail(final.data)
##              date Mkt-RF   SMB   HML   RF        SPY         QQQ         EEM
## 200407 2023-08-31  -5.24 -2.51  1.52 0.43 -0.0236393 -0.01301197 -0.01347902
## 200408 2023-09-30  -3.19 -3.87  0.19 0.47 -0.0236393 -0.01301197 -0.01347902
## 200409 2023-10-31   8.84 -0.02  1.64 0.44 -0.0236393 -0.01301197 -0.01347902
## 200410 2023-11-30   4.87  6.34  4.93 0.43 -0.0236393 -0.01301197 -0.01347902
## 200411 2023-12-31   0.71 -5.09 -2.38 0.47 -0.0236393 -0.01301197 -0.01347902
## 200412 2024-01-31   5.06 -0.24 -3.48 0.42 -0.0236393 -0.01301197 -0.01347902
##                IWM         EFA         TLT         IYR        GLD
## 200407 -0.05678926 -0.03335768 -0.04353937 -0.05840238 0.05287428
## 200408 -0.05678926 -0.03335768 -0.04353937 -0.05840238 0.05287428
## 200409 -0.05678926 -0.03335768 -0.04353937 -0.05840238 0.05287428
## 200410 -0.05678926 -0.03335768 -0.04353937 -0.05840238 0.05287428
## 200411 -0.05678926 -0.03335768 -0.04353937 -0.05840238 0.05287428
## 200412 -0.05678926 -0.03335768 -0.04353937 -0.05840238 0.05287428
final.data.tibble <- as_tibble(final.data)
head(final.data.tibble)
## # A tibble: 6 × 13
##   date       `Mkt-RF`   SMB   HML    RF    SPY    QQQ    EEM    IWM     EFA
##   <date>        <dbl> <dbl> <dbl> <dbl>  <dbl>  <dbl>  <dbl>  <dbl>   <dbl>
## 1 1926-06-30     2.96 -2.56 -2.43  0.22 0.0307 0.0450 0.0176 0.0438 0.00266
## 2 1926-07-31     2.64 -1.17  3.82  0.25 0.0307 0.0450 0.0176 0.0438 0.00266
## 3 1926-08-31     0.36 -1.4   0.13  0.23 0.0307 0.0450 0.0176 0.0438 0.00266
## 4 1926-09-30    -3.24 -0.09  0.7   0.32 0.0307 0.0450 0.0176 0.0438 0.00266
## 5 1926-10-31     2.53 -0.1  -0.51  0.31 0.0307 0.0450 0.0176 0.0438 0.00266
## 6 1926-11-30     2.62 -0.03 -0.05  0.28 0.0307 0.0450 0.0176 0.0438 0.00266
## # ℹ 3 more variables: TLT <dbl>, IYR <dbl>, GLD <dbl>

Question 5

final.data2 <- final.data.tibble[final.data.tibble$date>="2019-03-01"&final.data.tibble$date<="2024-02-29",]
head(final.data2)
## # A tibble: 6 × 13
##   date       `Mkt-RF`   SMB   HML    RF    SPY    QQQ    EEM    IWM     EFA
##   <date>        <dbl> <dbl> <dbl> <dbl>  <dbl>  <dbl>  <dbl>  <dbl>   <dbl>
## 1 2019-03-31     3.97 -1.74  2.15  0.21 0.0307 0.0450 0.0176 0.0438 0.00266
## 2 2019-04-30    -6.94 -1.32 -2.37  0.21 0.0307 0.0450 0.0176 0.0438 0.00266
## 3 2019-05-31     6.93  0.29 -0.71  0.18 0.0307 0.0450 0.0176 0.0438 0.00266
## 4 2019-06-30     1.19 -1.93  0.48  0.19 0.0307 0.0450 0.0176 0.0438 0.00266
## 5 2019-07-31    -2.58 -2.38 -4.78  0.16 0.0307 0.0450 0.0176 0.0438 0.00266
## 6 2019-08-31     1.43 -0.96  6.75  0.18 0.0307 0.0450 0.0176 0.0438 0.00266
## # ℹ 3 more variables: TLT <dbl>, IYR <dbl>, GLD <dbl>
#BETA
spy_rf <- final.data.tibble$SPY-final.data.tibble$RF
qqq_rf <- final.data.tibble$QQQ-final.data.tibble$RF
eem_rf <- final.data.tibble$EEM-final.data.tibble$RF
iwm_rf <- final.data.tibble$IWM-final.data.tibble$RF
efa_rf <- final.data.tibble$EFA-final.data.tibble$RF
tlt_rf <- final.data.tibble$TLT-final.data.tibble$RF
iyr_rf <- final.data.tibble$IYR-final.data.tibble$RF
gld_rf <- final.data.tibble$GLD-final.data.tibble$RF
y <- cbind(spy_rf,qqq_rf,eem_rf,iwm_rf,efa_rf,tlt_rf,iyr_rf,gld_rf)
n <- nrow(y)
one.vec <- rep(1,n)
x <- cbind(one.vec,final.data.tibble$`Mkt-RF`)
x.mat <- as.matrix(x)
beta <- solve(t(x)%*%x)%*%t(x)%*%y
beta
##               spy_rf       qqq_rf       eem_rf       iwm_rf       efa_rf
## one.vec -0.259386424 -0.255692847 -0.268008560 -0.261916137 -0.265385260
##          0.003069948  0.003069948  0.003069948  0.003069948  0.003069948
##               tlt_rf       iyr_rf       gld_rf
## one.vec -0.267942425 -0.263291938 -0.265873476
##          0.003069948  0.003069948  0.003069948
#RESIDUAL
e.hat <- y - x%*%beta
res.var <- diag(t(e.hat)%*%e.hat)/(n-2)
d <- diag(res.var);d
##            [,1]       [,2]       [,3]       [,4]      [,5]       [,6]
## [1,] 0.06426389 0.00000000 0.00000000 0.00000000 0.0000000 0.00000000
## [2,] 0.00000000 0.06499292 0.00000000 0.00000000 0.0000000 0.00000000
## [3,] 0.00000000 0.00000000 0.06532816 0.00000000 0.0000000 0.00000000
## [4,] 0.00000000 0.00000000 0.00000000 0.06573423 0.0000000 0.00000000
## [5,] 0.00000000 0.00000000 0.00000000 0.00000000 0.0646135 0.00000000
## [6,] 0.00000000 0.00000000 0.00000000 0.00000000 0.0000000 0.06405192
## [7,] 0.00000000 0.00000000 0.00000000 0.00000000 0.0000000 0.00000000
## [8,] 0.00000000 0.00000000 0.00000000 0.00000000 0.0000000 0.00000000
##            [,7]       [,8]
## [1,] 0.00000000 0.00000000
## [2,] 0.00000000 0.00000000
## [3,] 0.00000000 0.00000000
## [4,] 0.00000000 0.00000000
## [5,] 0.00000000 0.00000000
## [6,] 0.00000000 0.00000000
## [7,] 0.06491261 0.00000000
## [8,] 0.00000000 0.06453739
#COVARIANCE MATRIX_Single Factor Model
cov.mat <- var(final.data.tibble$`Mkt-RF`)*t(beta)%*%beta + d
cov.mat
##          spy_rf   qqq_rf   eem_rf   iwm_rf   efa_rf   tlt_rf   iyr_rf   gld_rf
## spy_rf 1.982596 1.891019 1.982089 1.937038 1.962691 1.981600 1.947212 1.966301
## qqq_rf 1.891019 1.929089 1.953869 1.909459 1.934747 1.953387 1.919488 1.938306
## eem_rf 1.982089 1.953869 2.113294 2.001417 2.027923 2.047461 2.011929 2.031653
## iwm_rf 1.937038 1.909459 2.001417 2.021661 1.981830 2.000924 1.966200 1.985475
## efa_rf 1.962691 1.934747 2.027923 1.981830 2.072690 2.027423 1.992239 2.011770
## tlt_rf 1.981600 1.953387 2.047461 2.000924 2.027423 2.111008 2.011433 2.031152
## iyr_rf 1.947212 1.919488 2.011929 1.966200 1.992239 2.011433 2.041439 1.995903
## gld_rf 1.966301 1.938306 2.031653 1.985475 2.011770 2.031152 1.995903 2.080008
#MVP MONTHLY RETURNS OF 8 ASSET_CAPM
one.vec2 <- rep(1,8)
top <- solve(cov.mat)%*%one.vec2
bot <- t(one.vec2)%*%top
mvp_capm <- top/as.numeric(bot)
mvp_capm
##               [,1]
## spy_rf  0.57446784
## qqq_rf  0.97179999
## eem_rf -0.37261239
## iwm_rf  0.28819265
## efa_rf -0.08827469
## tlt_rf -0.37270073
## iyr_rf  0.14125384
## gld_rf -0.14212650

Question 6

t <- dim(final.data2)[1]
markets <- final.data2[,c(2,3,4)]
final.data3 <- final.data2[,c(-1,-2,-3,-4,-5)]
head(final.data3)
## # A tibble: 6 × 8
##      SPY    QQQ    EEM    IWM     EFA      TLT    IYR    GLD
##    <dbl>  <dbl>  <dbl>  <dbl>   <dbl>    <dbl>  <dbl>  <dbl>
## 1 0.0307 0.0450 0.0176 0.0438 0.00266 -0.00343 0.0531 0.0322
## 2 0.0307 0.0450 0.0176 0.0438 0.00266 -0.00343 0.0531 0.0322
## 3 0.0307 0.0450 0.0176 0.0438 0.00266 -0.00343 0.0531 0.0322
## 4 0.0307 0.0450 0.0176 0.0438 0.00266 -0.00343 0.0531 0.0322
## 5 0.0307 0.0450 0.0176 0.0438 0.00266 -0.00343 0.0531 0.0322
## 6 0.0307 0.0450 0.0176 0.0438 0.00266 -0.00343 0.0531 0.0322
final.data3 <- as.matrix(final.data3)
n <- dim(final.data3)[2]
one_vec <- rep(1,t)
p <- cbind(one_vec,markets)
p <- as.matrix(p)
b.hat <- solve(t(p)%*%p)%*%t(p)%*%final.data3
res <- final.data3-p%*%b.hat
diag.d <- diag(t(res)%*%res)/(t-6)
diag.d
##         SPY         QQQ         EEM         IWM         EFA         TLT 
## 0.001785743 0.002515203 0.002850641 0.003256948 0.002135560 0.001573651 
##         IYR         GLD 
## 0.002434840 0.002059405
#R-SQUARE
retvar <- apply(final.data3,2,var)
rsq <- 1-diag(t(res)%*%res)/((t-1)/retvar)
res.stdev <- sqrt(diag.d)
factor.cov <- var(final.data3)*t(b.hat)%*%b.hat+diag(diag.d)
stdev <- sqrt(diag(factor.cov))
factor.cor <- factor.cov/(stdev%*%t(stdev))
factor.cor
##               SPY           QQQ           EEM           IWM           EFA
## SPY  1.000000e+00  1.410862e-04  1.596317e-05  7.714674e-05  4.371073e-05
## QQQ  1.410862e-04  1.000000e+00  1.945526e-05  9.073677e-05  5.249569e-05
## EEM  1.596317e-05  1.945526e-05  1.000000e+00  1.163057e-05  8.107627e-06
## IWM  7.714674e-05  9.073677e-05  1.163057e-05  1.000000e+00  2.998374e-05
## EFA  4.371073e-05  5.249569e-05  8.107627e-06  2.998374e-05  1.000000e+00
## TLT -2.705240e-06 -3.872729e-07 -4.404614e-07 -3.400379e-06 -1.303920e-06
## IYR  5.583792e-05  6.459816e-05  8.618905e-06  4.010433e-05  2.263226e-05
## GLD  4.451258e-06  7.390218e-06  2.575482e-06  1.293593e-06  3.027566e-06
##               TLT          IYR          GLD
## SPY -2.705240e-06 5.583792e-05 4.451258e-06
## QQQ -3.872729e-07 6.459816e-05 7.390218e-06
## EEM -4.404614e-07 8.618905e-06 2.575482e-06
## IWM -3.400379e-06 4.010433e-05 1.293593e-06
## EFA -1.303920e-06 2.263226e-05 3.027566e-06
## TLT  1.000000e+00 2.773788e-06 2.335800e-06
## IYR  2.773788e-06 1.000000e+00 5.337380e-06
## GLD  2.335800e-06 5.337380e-06 1.000000e+00
#SAMPLE VARIANCE & CORRELATION
sample.cov <- cov(final.data3)
sample.cor <- cor(final.data3)
sample.cov
##               SPY           QQQ           EEM           IWM           EFA
## SPY  0.0017848578  1.949350e-03  0.0016425477  2.139406e-03  0.0017095320
## QQQ  0.0019493497  2.513956e-03  0.0017652194  2.218818e-03  0.0018104046
## EEM  0.0016425477  1.765219e-03  0.0028492277  2.118034e-03  0.0020822805
## IWM  0.0021394056  2.218818e-03  0.0021180341  3.255334e-03  0.0020754297
## EFA  0.0017095320  1.810405e-03  0.0020822805  2.075430e-03  0.0021345014
## TLT -0.0002003662 -2.529289e-05 -0.0002142312 -4.457372e-04 -0.0002410550
## IYR  0.0016109011  1.643322e-03  0.0016328566  2.047689e-03  0.0016297248
## GLD  0.0001908809  2.794472e-04  0.0007252614  9.817717e-05  0.0003240559
##               TLT          IYR          GLD
## SPY -2.003662e-04 0.0016109011 1.908809e-04
## QQQ -2.529289e-05 0.0016433220 2.794472e-04
## EEM -2.142312e-04 0.0016328566 7.252614e-04
## IWM -4.457372e-04 0.0020476891 9.817717e-05
## EFA -2.410550e-04 0.0016297248 3.240559e-04
## TLT  1.572871e-03 0.0003782588 4.734690e-04
## IYR  3.782588e-04 0.0024336337 4.214102e-04
## GLD  4.734690e-04 0.0004214102 2.058384e-03
#MVP MONTHLY RETURNS OF 8 ASSET_FF 3 FACTOR
one <- rep(1,8)
top.mat <- solve(factor.cov)%*%one
bot.mat <- t(one)%*%top.mat
MVP_FF3 <- top.mat/as.numeric(bot.mat)
MVP_FF3
##           [,1]
## SPY 0.15486361
## QQQ 0.10992687
## EEM 0.09704260
## IWM 0.08491187
## EFA 0.12952449
## TLT 0.17580407
## IYR 0.11359495
## GLD 0.13433155

Question 7

# Calculate the average monthly returns for the past year (March 2019 - February 2024)
final.data4 <- final.data.tibble[final.data.tibble$date>="2019-03-01"&final.data.tibble$date<="2024-03-31",]
average_returns <- colMeans(final.data4[final.data4$date >= "2019-03-01" & final.data4$date <= "2024-02-29", (ncol(final.data4)-7):ncol(final.data4)])

# Estimate the portfolio return for March 2024 using the weights from question 5 (CAPM Model)
estimated_portfolio_return_march_2024_CAPM <- sum(mvp_capm * average_returns)

# Estimate the portfolio return for March 2024 using the weights from question 6 (FF 3 Factor Model)
estimated_portfolio_return_march_2024_FF3 <- sum(MVP_FF3 * average_returns)

# Print or store the realized portfolio returns
print(paste("Realized portfolio return in March 2024 (CAPM model):", estimated_portfolio_return_march_2024_CAPM))
## [1] "Realized portfolio return in March 2024 (CAPM model): 0.0208378822306224"
print(paste("Realized portfolio return in March 2024 (FF 3-factor model):", estimated_portfolio_return_march_2024_FF3))
## [1] "Realized portfolio return in March 2024 (FF 3-factor model): 0.00643437622958887"