Question 1-5

# Load libraries
library(quantmod)
## 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
library(tidyverse)
## Warning: package 'tidyverse' was built under R version 4.3.3
## Warning: package 'tidyr' was built under R version 4.3.3
## Warning: package 'stringr' was built under R version 4.3.3
## Warning: package 'forcats' was built under R version 4.3.3
## ── Attaching core tidyverse packages ──────────────────────── tidyverse 2.0.0 ──
## ✔ forcats 1.0.0     ✔ tidyr   1.3.1
## ✔ stringr 1.5.1
## ── Conflicts ────────────────────────────────────────── tidyverse_conflicts() ──
## ✖ tidyr::extract()      masks magrittr::extract()
## ✖ dplyr::filter()       masks stats::filter()
## ✖ dplyr::first()        masks xts::first()
## ✖ dplyr::lag()          masks stats::lag()
## ✖ dplyr::last()         masks xts::last()
## ✖ magrittr::set_names() masks purrr::set_names()
## ℹ Use the conflicted package (<http://conflicted.r-lib.org/>) to force all conflicts to become errors
# 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.86006 40.73328 31.82712 52.51540 37.52378 60.71099 28.10297
## 2010-01-05 87.08998 40.73328 32.05812 52.33484 37.55686 61.10305 28.17046
## 2010-01-06 87.15130 40.48757 32.12518 52.28558 37.71560 60.28511 28.15820
## 2010-01-07 87.51920 40.51391 31.93890 52.67136 37.57008 60.38649 28.40972
## 2010-01-08 87.81045 40.84735 32.19226 52.95864 37.86773 60.35943 28.21955
## 2010-01-11 87.93305 40.68064 32.12518 52.74524 38.17862 60.02822 28.35451
##               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-05-31 527.37 450.71 41.79 205.77 81.18 90.142 86.67 215.30
## 2024-06-03 527.80 453.13 42.23 204.61 81.41 91.600 86.43 217.22
## 2024-06-04 528.39 454.37 41.64 201.97 81.31 92.670 87.20 215.27
## 2024-06-05 534.67 463.53 42.31 205.06 81.88 93.350 86.99 217.82
## 2024-06-06 534.66 463.37 42.52 203.59 82.16 93.210 87.13 219.43
## 2024-06-07 534.01 462.96 42.04 201.20 81.27 91.500 86.43 211.60
ETFList.xts <- xts(ETFList)
head(ETFList.xts)
##                 SPY      QQQ      EEM      IWM      EFA      TLT      IYR
## 2010-01-04 86.86006 40.73328 31.82712 52.51540 37.52378 60.71099 28.10297
## 2010-01-05 87.08998 40.73328 32.05812 52.33484 37.55686 61.10305 28.17046
## 2010-01-06 87.15130 40.48757 32.12518 52.28558 37.71560 60.28511 28.15820
## 2010-01-07 87.51920 40.51391 31.93890 52.67136 37.57008 60.38649 28.40972
## 2010-01-08 87.81045 40.84735 32.19226 52.95864 37.86773 60.35943 28.21955
## 2010-01-11 87.93305 40.68064 32.12518 52.74524 38.17862 60.02822 28.35451
##               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
#weekly returns
weekly.returns <- to.weekly(ETFList.xts, indexAt = "last", OHLC = FALSE)
ETF.weekly.returns <- na.omit(Return.calculate(weekly.returns, method = "log"))
head(ETF.weekly.returns)
##                     SPY         QQQ         EEM         IWM          EFA
## 2010-01-15 -0.008150338 -0.01515182 -0.02936239 -0.01310463 -0.003499387
## 2010-01-22 -0.039763317 -0.03755546 -0.05739658 -0.03110041 -0.057354489
## 2010-01-29 -0.016805493 -0.03151508 -0.03415404 -0.02659405 -0.026141539
## 2010-02-05 -0.006820449  0.00443019 -0.02861857 -0.01407286 -0.019238663
## 2010-02-12  0.012855113  0.01798514  0.03278944  0.02909817  0.005230899
## 2010-02-19  0.028289024  0.02415761  0.02415974  0.03288516  0.022734796
##                      TLT          IYR          GLD
## 2010-01-15  1.984958e-02 -0.006324720 -0.004589867
## 2010-01-22  1.004959e-02 -0.042682928 -0.033851808
## 2010-01-29  3.364491e-03 -0.008483327 -0.011354686
## 2010-02-05 -5.483692e-05  0.003218196 -0.012153575
## 2010-02-12 -1.965246e-02 -0.007602759  0.022294524
## 2010-02-19 -8.238372e-03  0.048966221  0.022447945
tail(ETF.weekly.returns)
##                      SPY         QQQ           EEM          IWM          EFA
## 2024-05-03  5.943814e-03  0.01034081  0.0310881818  0.017688930  0.012238795
## 2024-05-10  1.850598e-02  0.01499672  0.0007061029  0.011865941  0.017832925
## 2024-05-17  1.639581e-02  0.02170547  0.0299014258  0.018284194  0.016051747
## 2024-05-24 -1.890615e-05  0.01360895 -0.0177403672 -0.012768598 -0.007253045
## 2024-05-31 -3.917469e-03 -0.01593594 -0.0290080361  0.001605029  0.001602629
## 2024-06-07  1.251220e-02  0.02681654  0.0059644694 -0.022459638  0.001107988
##                      TLT          IYR          GLD
## 2024-05-03  0.0214673251  0.014550063 -0.017040258
## 2024-05-10  0.0031118742  0.020856044  0.026642296
## 2024-05-17  0.0139938967  0.024058882  0.022380376
## 2024-05-24 -0.0001094056 -0.037483488 -0.035219098
## 2024-05-31 -0.0102294348  0.018398305 -0.002875542
## 2024-06-07  0.0149527865 -0.002772941 -0.017334690
#monthly returns 
monthly.returns <- to.monthly(ETFList.xts, indexAt = "last", OHLC = FALSE)
ETF.monthly.returns <- na.omit(Return.calculate(monthly.returns, method = "log"))
head(ETF.monthly.returns)
##                    SPY         QQQ          EEM         IWM          EFA
## 2010-02-26  0.03071834  0.04501066  0.017607946  0.04377892  0.002664225
## 2010-03-31  0.05909808  0.07428033  0.077987288  0.07909504  0.061898054
## 2010-04-30  0.01535189  0.02217782 -0.001663262  0.05523035 -0.028446271
## 2010-05-28 -0.08278866 -0.07679853 -0.098645453 -0.07835765 -0.118702711
## 2010-06-30 -0.05312769 -0.06161713 -0.014084918 -0.08059625 -0.020834899
## 2010-07-30  0.06606953  0.07006915  0.103751199  0.06514078  0.109844324
##                     TLT         IYR          GLD
## 2010-02-26 -0.003430554  0.05313345  0.032223422
## 2010-03-31 -0.020787982  0.09302078 -0.004396045
## 2010-04-30  0.032678472  0.06192379  0.057168645
## 2010-05-28  0.049822038 -0.05851448  0.030056879
## 2010-06-30  0.056359320 -0.04782659  0.023280093
## 2010-07-30 -0.009508422  0.08988442 -0.052210723
tail(ETF.monthly.returns)
##                    SPY         QQQ          EEM         IWM          EFA
## 2024-01-31  0.01580099  0.01802859 -0.046318705 -0.03979283 -0.004522438
## 2024-02-29  0.05087068  0.05148515  0.040832472  0.05472731  0.029425449
## 2024-03-28  0.03217864  0.01266909  0.026891965  0.03427554  0.033228193
## 2024-04-30 -0.04115501 -0.04472312 -0.002193254 -0.07093080 -0.032969371
## 2024-05-31  0.04934208  0.05970011  0.019328923  0.04915477  0.049363177
## 2024-06-07  0.01251220  0.02681654  0.005964469 -0.02245964  0.001107988
##                     TLT          IYR          GLD
## 2024-01-31 -0.022707273 -0.052324523 -0.014330371
## 2024-02-29 -0.022779564  0.021101450  0.004553167
## 2024-03-28  0.007798144  0.018368747  0.083130157
## 2024-04-30 -0.066732274 -0.084688296  0.029456829
## 2024-05-31  0.028460902  0.048098120  0.016059563
## 2024-06-07  0.014952787 -0.002772941 -0.017334690
#tibble format
ETF.monthly.returns.tibble <- as_tibble(ETF.monthly.returns)
ETF.monthly.returns.tibble
## # A tibble: 173 × 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 
## # ℹ 163 more rows
setwd("D:/School Folder/HW/Investment")
ff3 <- read.csv("F-F_Research_Data_Factors.csv",  header = TRUE)
str(ff3)
## 'data.frame':    1174 obs. of  5 variables:
##  $ X     : 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(ff3)
##        X 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
tail(ff3)
##           X Mkt.RF   SMB   HML   RF
## 1169 202311   8.84 -0.02  1.64 0.44
## 1170 202312   4.87  6.34  4.93 0.43
## 1171 202401   0.70 -5.09 -2.38 0.47
## 1172 202402   5.06 -0.24 -3.49 0.42
## 1173 202403   2.83 -2.49  4.19 0.43
## 1174 202404  -4.67 -2.39 -0.51 0.47
glimpse(ff3)
## Rows: 1,174
## Columns: 5
## $ X      <int> 192607, 192608, 192609, 192610, 192611, 192612, 192701, 192702,…
## $ Mkt.RF <dbl> 2.96, 2.64, 0.36, -3.24, 2.53, 2.62, -0.06, 4.18, 0.13, 0.46, 5…
## $ SMB    <dbl> -2.56, -1.17, -1.40, -0.09, -0.10, -0.03, -0.37, 0.04, -1.65, 0…
## $ HML    <dbl> -2.43, 3.82, 0.13, 0.70, -0.51, -0.05, 4.54, 2.94, -2.61, 0.81,…
## $ RF     <dbl> 0.22, 0.25, 0.23, 0.32, 0.31, 0.28, 0.25, 0.26, 0.30, 0.25, 0.3…
colnames(ff3) <- paste(c("date","Mkt-RF","SMB","HML","RF"))
ff3.digit <- ff3 %>% mutate(date = as.character(date))%>% 
  mutate(date=ymd(parse_date(date,format="%Y%m"))) %>%
  mutate(date = rollback(date))
head(ff3.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
ff3.digit.xts <- xts(ff3.digit[,-1],order.by=as.Date(ff3.digit$date))
head(ff3.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
#merge of monthly returns and fama french
final.data <- merge(ff3.digit,ETF.monthly.returns)
tail(final.data)
##              date Mkt-RF   SMB   HML   RF       SPY        QQQ         EEM
## 203097 2023-10-31   8.84 -0.02  1.64 0.44 0.0125122 0.02681654 0.005964469
## 203098 2023-11-30   4.87  6.34  4.93 0.43 0.0125122 0.02681654 0.005964469
## 203099 2023-12-31   0.70 -5.09 -2.38 0.47 0.0125122 0.02681654 0.005964469
## 203100 2024-01-31   5.06 -0.24 -3.49 0.42 0.0125122 0.02681654 0.005964469
## 203101 2024-02-29   2.83 -2.49  4.19 0.43 0.0125122 0.02681654 0.005964469
## 203102 2024-03-31  -4.67 -2.39 -0.51 0.47 0.0125122 0.02681654 0.005964469
##                IWM         EFA        TLT          IYR         GLD
## 203097 -0.02245964 0.001107988 0.01495279 -0.002772941 -0.01733469
## 203098 -0.02245964 0.001107988 0.01495279 -0.002772941 -0.01733469
## 203099 -0.02245964 0.001107988 0.01495279 -0.002772941 -0.01733469
## 203100 -0.02245964 0.001107988 0.01495279 -0.002772941 -0.01733469
## 203101 -0.02245964 0.001107988 0.01495279 -0.002772941 -0.01733469
## 203102 -0.02245964 0.001107988 0.01495279 -0.002772941 -0.01733469
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 6 & 7

## # 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 2010-02-28     6.31  1.48  2.21  0.01 0.0307 0.0450 0.0176 0.0438 0.00266
## 2 2010-03-31     2     4.87  2.89  0.01 0.0307 0.0450 0.0176 0.0438 0.00266
## 3 2010-04-30    -7.89  0.09 -2.44  0.01 0.0307 0.0450 0.0176 0.0438 0.00266
## 4 2010-05-31    -5.57 -1.82 -4.7   0.01 0.0307 0.0450 0.0176 0.0438 0.00266
## 5 2010-06-30     6.93  0.2  -0.31  0.01 0.0307 0.0450 0.0176 0.0438 0.00266
## 6 2010-07-31    -4.77 -3    -1.9   0.01 0.0307 0.0450 0.0176 0.0438 0.00266
## # ℹ 3 more variables: TLT <dbl>, IYR <dbl>, GLD <dbl>
## # 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 2014-08-31    -1.97 -3.71 -1.34     0 0.0125 0.0268 0.00596 -0.0225 0.00111
## 2 2014-09-30     2.52  4.21 -1.81     0 0.0125 0.0268 0.00596 -0.0225 0.00111
## 3 2014-10-31     2.55 -2.06 -3.09     0 0.0125 0.0268 0.00596 -0.0225 0.00111
## 4 2014-11-30    -0.06  2.49  2.27     0 0.0125 0.0268 0.00596 -0.0225 0.00111
## 5 2014-12-31    -3.11 -0.56 -3.58     0 0.0125 0.0268 0.00596 -0.0225 0.00111
## 6 2015-01-31     6.13  0.63 -1.86     0 0.0125 0.0268 0.00596 -0.0225 0.00111
## # ℹ 3 more variables: TLT <dbl>, IYR <dbl>, GLD <dbl>
##               spy_rf       qqq_rf       eem_rf       iwm_rf       efa_rf
## one.vec -0.259568090 -0.255856715 -0.268135401 -0.262252286 -0.265459883
##          0.003088849  0.003088849  0.003088849  0.003088849  0.003088849
##               tlt_rf       iyr_rf       gld_rf
## one.vec -0.268164593 -0.263574692 -0.266379172
##          0.003088849  0.003088849  0.003088849
##            [,1]       [,2]       [,3]       [,4]       [,5]       [,6]
## [1,] 0.06420763 0.00000000 0.00000000 0.00000000 0.00000000 0.00000000
## [2,] 0.00000000 0.06493947 0.00000000 0.00000000 0.00000000 0.00000000
## [3,] 0.00000000 0.00000000 0.06524272 0.00000000 0.00000000 0.00000000
## [4,] 0.00000000 0.00000000 0.00000000 0.06567052 0.00000000 0.00000000
## [5,] 0.00000000 0.00000000 0.00000000 0.00000000 0.06454722 0.00000000
## [6,] 0.00000000 0.00000000 0.00000000 0.00000000 0.00000000 0.06400105
## [7,] 0.00000000 0.00000000 0.00000000 0.00000000 0.00000000 0.00000000
## [8,] 0.00000000 0.00000000 0.00000000 0.00000000 0.00000000 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.06486568 0.00000000
## [8,] 0.00000000 0.06445405
##          spy_rf   qqq_rf   eem_rf   iwm_rf   efa_rf   tlt_rf   iyr_rf   gld_rf
## spy_rf 1.983866 1.892215 1.983010 1.939507 1.963226 1.983226 1.949286 1.970023
## qqq_rf 1.892215 1.930103 1.954660 1.911779 1.935159 1.954873 1.921418 1.941859
## eem_rf 1.983010 1.954660 2.113695 2.003513 2.028015 2.048675 2.013615 2.035037
## iwm_rf 1.939507 1.911779 2.003513 2.025231 1.983525 2.003731 1.969440 1.990393
## efa_rf 1.963226 1.935159 2.028015 1.983525 2.072329 2.028236 1.993525 2.014734
## tlt_rf 1.983226 1.954873 2.048675 2.003731 2.028236 2.112899 2.013834 2.035259
## iyr_rf 1.949286 1.921418 2.013615 1.969440 1.993525 2.013834 2.044236 2.000428
## gld_rf 1.970023 1.941859 2.035037 1.990393 2.014734 2.035259 2.000428 2.086164
##               [,1]
## spy_rf  0.58088073
## qqq_rf  0.98030171
## eem_rf -0.36111131
## iwm_rf  0.27759956
## efa_rf -0.07056337
## tlt_rf -0.37135717
## iyr_rf  0.13622854
## gld_rf -0.17197868
## # 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
##         SPY         QQQ         EEM         IWM         EFA         TLT 
## 0.001782445 0.002514703 0.002818127 0.003246167 0.002122233 0.001575754 
##         IYR         GLD 
## 0.002440870 0.002029005
##               SPY           QQQ           EEM           IWM           EFA
## SPY  0.0017815864  1.949328e-03  0.0016256243  0.0021343253  0.0017034183
## QQQ  0.0019493276  2.513491e-03  0.0017485787  0.0022184439  0.0018077272
## EEM  0.0016256243  1.748579e-03  0.0028167696  0.0020930633  0.0020600487
## IWM  0.0021343253  2.218444e-03  0.0020930633  0.0032446029  0.0020655945
## EFA  0.0017034183  1.807727e-03  0.0020600487  0.0020655945  0.0021212102
## TLT -0.0001804656 -8.941720e-07 -0.0002112614 -0.0004222726 -0.0002268051
## IYR  0.0016158810  1.655385e-03  0.0016142741  0.0020528433  0.0016273199
## GLD  0.0001932115  2.768812e-04  0.0007213616  0.0001103868  0.0003290715
##               TLT          IYR          GLD
## SPY -1.804656e-04 0.0016158810 0.0001932115
## QQQ -8.941720e-07 0.0016553845 0.0002768812
## EEM -2.112614e-04 0.0016142741 0.0007213616
## IWM -4.222726e-04 0.0020528433 0.0001103868
## EFA -2.268051e-04 0.0016273199 0.0003290715
## TLT  1.574995e-03 0.0003986690 0.0004710157
## IYR  3.986690e-04 0.0024396939 0.0004255504
## GLD  4.710157e-04 0.0004255504 0.0020280272
##               SPY           QQQ           EEM           IWM           EFA
## SPY  1.000000e+00  1.444855e-04  1.757362e-05  7.791548e-05  4.654653e-05
## QQQ  1.444855e-04  1.000000e+00  2.137780e-05  9.159009e-05  5.586448e-05
## EEM  1.757362e-05  2.137780e-05  1.000000e+00  1.260329e-05  9.285001e-06
## IWM  7.791548e-05  9.159009e-05  1.260329e-05  1.000000e+00  3.143922e-05
## EFA  4.654653e-05  5.586448e-05  9.285001e-06  3.143922e-05  1.000000e+00
## TLT -2.575009e-06 -1.442920e-08 -4.972136e-07 -3.356123e-06 -1.349275e-06
## IYR  5.695592e-05  6.598804e-05  9.385237e-06  4.030380e-05  2.391476e-05
## GLD  4.390063e-06  7.114889e-06  2.703518e-06  1.397062e-06  3.117393e-06
##               TLT          IYR          GLD
## SPY -2.575009e-06 5.695592e-05 4.390063e-06
## QQQ -1.442920e-08 6.598804e-05 7.114889e-06
## EEM -4.972136e-07 9.385237e-06 2.703518e-06
## IWM -3.356123e-06 4.030380e-05 1.397062e-06
## EFA -1.349275e-06 2.391476e-05 3.117393e-06
## TLT  1.000000e+00 3.059312e-06 2.329995e-06
## IYR  3.059312e-06 1.000000e+00 5.200149e-06
## GLD  2.329995e-06 5.200149e-06 1.000000e+00
##           [,1]
## SPY 0.15452810
## QQQ 0.10950732
## EEM 0.09776899
## IWM 0.08485289
## EFA 0.12981529
## TLT 0.17486741
## IYR 0.11286063
## GLD 0.13579937

Question 8

library(quadprog)
## Warning: package 'quadprog' was built under R version 4.3.1
# Function to compute GMV portfolio weights
gmv_weights <- function(cov_matrix) {
  n <- ncol(cov_matrix)
  dvec <- rep(0, n)
  Amat <- cbind(rep(1, n), diag(1, n))
  bvec <- c(1, rep(0, n))
  solve.QP(Dmat = cov_matrix, dvec = dvec, Amat = Amat, bvec = bvec, meq = 1)$solution
}

# Compute GMV weights based on CAPM covariance matrix
gmv_weights_capm <- gmv_weights(cov.mat)
gmv_weights_capm
## [1]  2.924819e-01  7.075181e-01  2.212694e-17  0.000000e+00 -5.570596e-18
## [6]  2.652168e-16  4.000363e-20 -4.627909e-17
# Compute GMV weights based on FF 3-factor model covariance matrix
gmv_weights_ff <- gmv_weights(cov.matff)
gmv_weights_ff
## [1]  3.479828e-01  2.503504e-17 -7.020989e-20  0.000000e+00  4.859816e-02
## [6]  4.120940e-01 -5.082782e-18  1.913251e-01
# Prepare data for SIT
returns <- final.data.tibble %>% select(date, starts_with("SPY"), starts_with("QQQ"), starts_with("EEM"), starts_with("IWM"), starts_with("EFA"), starts_with("TLT"), starts_with("IYR"), starts_with("GLD"))
returns_xts <- xts(returns[,-1], order.by = returns$date)

# GMV portfolio weights function
gmv_weights <- function(cov_matrix) {
  n <- ncol(cov_matrix)
  dvec <- rep(0, n)
  Amat <- cbind(rep(1, n), diag(1, n))
  bvec <- c(1, rep(0, n))
  solve.QP(Dmat = cov_matrix, dvec = dvec, Amat = Amat, bvec = bvec, meq = 1)$solution
}

Question 9

# Calculate the average monthly returns for the past year (2010 - May 2024)
final.data4 <- final.data.tibble[final.data.tibble$date>="2010-01-01"&final.data.tibble$date<="2024-05-31",]
average_returns <- colMeans(final.data4[final.data4$date >= "2010-01-01" & final.data4$date <= "2024-05-31", (ncol(final.data4)-7):ncol(final.data4)])

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

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

# Print or store the realized portfolio returns
print(paste("Realized portfolio return in May 2024 (CAPM model):", estimated_portfolio_return_may_2024_CAPM))
## [1] "Realized portfolio return in May 2024 (CAPM model): 0.0210295315987746"