library(quantmod)
## Loading required package: xts
## Loading required package: zoo
## 
## Attaching package: 'zoo'
## The following objects are masked from 'package:base':
## 
##     as.Date, as.Date.numeric
## Loading required package: TTR
## Version 0.4-0 included new data defaults. See ?getSymbols.
#install.package(PerformanceAnalytics)
library(tidyquant)
## Loading required package: lubridate
## 
## Attaching package: 'lubridate'
## The following object is masked from 'package:base':
## 
##     date
## Loading required package: PerformanceAnalytics
## 
## Attaching package: 'PerformanceAnalytics'
## The following object is masked from 'package:graphics':
## 
##     legend
## Loading required package: tidyverse
## -- Attaching packages ---------------------------------------------------- tidyverse 1.2.1 --
## v ggplot2 3.1.0       v purrr   0.3.2  
## v tibble  2.1.1       v dplyr   0.8.0.1
## v tidyr   0.8.3       v stringr 1.4.0  
## v readr   1.3.1       v forcats 0.4.0
## -- Conflicts ------------------------------------------------------- tidyverse_conflicts() --
## x lubridate::as.difftime() masks base::as.difftime()
## x lubridate::date()        masks base::date()
## 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 lubridate::setdiff()     masks base::setdiff()
## x lubridate::union()       masks base::union()
library(lubridate)
library(timetk)
tickers<- c("SPY","QQQ","EEM","IWM","EFA","TLT","IYR","GLD")
getSymbols(tickers, from = "2010-01-01", auto.assign = TRUE)
## '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
## [1] "SPY" "QQQ" "EEM" "IWM" "EFA" "TLT" "IYR" "GLD"
firm_8 <-merge(Ad(SPY), Ad(QQQ), Ad(EEM), Ad(IWM), Ad(EFA), Ad(TLT), Ad(IYR), Ad(GLD))
head(firm_8)
##            SPY.Adjusted QQQ.Adjusted EEM.Adjusted IWM.Adjusted
## 2010-01-04     94.13087     42.07555     35.67281     56.09659
## 2010-01-05     94.38007     42.07555     35.93174     55.90370
## 2010-01-06     94.44649     41.82175     36.00691     55.85109
## 2010-01-07     94.84521     41.84896     35.79811     56.26318
## 2010-01-08     95.16080     42.19340     36.08208     56.57005
## 2010-01-11     95.29370     42.02117     36.00691     56.34210
##            EFA.Adjusted TLT.Adjusted IYR.Adjusted GLD.Adjusted
## 2010-01-04     43.40944     68.21629     32.26275       109.80
## 2010-01-05     43.44770     68.65686     32.34021       109.70
## 2010-01-06     43.63134     67.73775     32.32613       111.51
## 2010-01-07     43.46300     67.85172     32.61488       110.82
## 2010-01-08     43.80734     67.82134     32.39655       111.37
## 2010-01-11     44.16698     67.44915     32.55150       112.85
colnames(firm_8)<-c("SPY", "QQQ", "EEM", "IWM", "EFA","TLT", "IYR","GLD")
head(firm_8)
##                 SPY      QQQ      EEM      IWM      EFA      TLT      IYR
## 2010-01-04 94.13087 42.07555 35.67281 56.09659 43.40944 68.21629 32.26275
## 2010-01-05 94.38007 42.07555 35.93174 55.90370 43.44770 68.65686 32.34021
## 2010-01-06 94.44649 41.82175 36.00691 55.85109 43.63134 67.73775 32.32613
## 2010-01-07 94.84521 41.84896 35.79811 56.26318 43.46300 67.85172 32.61488
## 2010-01-08 95.16080 42.19340 36.08208 56.57005 43.80734 67.82134 32.39655
## 2010-01-11 95.29370 42.02117 36.00691 56.34210 44.16698 67.44915 32.55150
##               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
#========================
#calculate weekly return using log returns
#========================
prices_weekly <- to.weekly(firm_8, indexAt = "last", OHLC =FALSE)
stock_returns_weekly <- na.omit(Return.calculate(prices_weekly, method = "log"))
head(stock_returns_weekly)
##                     SPY         QQQ         EEM         IWM          EFA
## 2010-01-15 -0.008150151 -0.01515199 -0.02936205 -0.01310461 -0.003499458
## 2010-01-22 -0.039762846 -0.03755592 -0.05739643 -0.03110044 -0.057354334
## 2010-01-29 -0.016805790 -0.03151480 -0.03415430 -0.02659380 -0.026141733
## 2010-02-05 -0.006820688  0.00443036 -0.02861874 -0.01407296 -0.019238669
## 2010-02-12  0.012855091  0.01798540  0.03278968  0.02909818  0.005230991
## 2010-02-19  0.028289105  0.02415713  0.02415957  0.03288520  0.022734752
##                      TLT          IYR          GLD
## 2010-01-15  1.984899e-02 -0.006324176 -0.004589865
## 2010-01-22  1.005025e-02 -0.042683035 -0.033851813
## 2010-01-29  3.363481e-03 -0.008483892 -0.011354685
## 2010-02-05 -5.439768e-05  0.003218778 -0.012153577
## 2010-02-12 -1.965291e-02 -0.007602877  0.022294528
## 2010-02-19 -8.238338e-03  0.048966431  0.022447943
#==========================
#calculate monthly return using log returns
#==========================
prices_monthly <- to.monthly(firm_8, indexAt = "last", OHLC = FALSE)
stock_returns_xts <- na.omit(Return.calculate(prices_monthly, method = "log"))
head(stock_returns_xts)
##                    SPY         QQQ          EEM         IWM         EFA
## 2010-02-26  0.03071820  0.04501028  0.017607768  0.04377887  0.00266388
## 2010-03-31  0.05909806  0.07428098  0.077987148  0.07909460  0.06189853
## 2010-04-30  0.01535186  0.02217746 -0.001663121  0.05523082 -0.02844674
## 2010-05-28 -0.08278913 -0.07679835 -0.098645456 -0.07835791 -0.11870236
## 2010-06-30 -0.05312741 -0.06161692 -0.014084732 -0.08059607 -0.02083487
## 2010-07-30  0.06606925  0.07006902  0.103751388  0.06514060  0.10984393
##                     TLT         IYR          GLD
## 2010-02-26 -0.003430628  0.05313394  0.032223420
## 2010-03-31 -0.020788116  0.09302108 -0.004396042
## 2010-04-30  0.032678280  0.06192350  0.057168648
## 2010-05-28  0.049822170 -0.05851430  0.030056874
## 2010-06-30  0.056360158 -0.04782665  0.023280092
## 2010-07-30 -0.009508924  0.08988416 -0.052210719
#=========================
#convert monthly returns into tibble format
#=========================
as_tibble(stock_returns_xts, rownames = 'date')
## Warning: Calling `as_tibble()` on a vector is discouraged, because the behavior is likely to change in the future. Use `tibble::enframe(name = NULL)` instead.
## This warning is displayed once per session.
## # A tibble: 113 x 9
##    date      SPY      QQQ      EEM     IWM      EFA      TLT     IYR
##    <chr>   <dbl>    <dbl>    <dbl>   <dbl>    <dbl>    <dbl>   <dbl>
##  1 2010~  0.0307  0.0450   0.0176   0.0438  0.00266 -0.00343  0.0531
##  2 2010~  0.0591  0.0743   0.0780   0.0791  0.0619  -0.0208   0.0930
##  3 2010~  0.0154  0.0222  -0.00166  0.0552 -0.0284   0.0327   0.0619
##  4 2010~ -0.0828 -0.0768  -0.0986  -0.0784 -0.119    0.0498  -0.0585
##  5 2010~ -0.0531 -0.0616  -0.0141  -0.0806 -0.0208   0.0564  -0.0478
##  6 2010~  0.0661  0.0701   0.104    0.0651  0.110   -0.00951  0.0899
##  7 2010~ -0.0460 -0.0527  -0.0329  -0.0774 -0.0387   0.0806  -0.0131
##  8 2010~  0.0858  0.124    0.111    0.117   0.0951  -0.0255   0.0453
##  9 2010~  0.0375  0.0615   0.0297   0.0406  0.0373  -0.0457   0.0386
## 10 2010~  0      -0.00173 -0.0295   0.0343 -0.0494  -0.0170  -0.0160
## # ... with 103 more rows, and 1 more variable: GLD <dbl>
#========================
#Download Fama French 3 factors data and change to digit numbers 
#========================
library(tidyverse)
retdata = read_csv('FamaFrench_mon_69_98_3stocks.csv')
## Parsed with column specification:
## cols(
##   date = col_double(),
##   `Mkt-RF` = col_double(),
##   SMB = col_double(),
##   HML = col_double(),
##   RF = col_double(),
##   ge = col_double(),
##   ibm = col_double(),
##   mobil = col_double(),
##   CRSP = col_double()
## )
glimpse(retdata)
## Observations: 360
## Variables: 9
## $ date     <dbl> 196901, 196902, 196903, 196904, 196905, 196906, 19690...
## $ `Mkt-RF` <dbl> -1.20, -5.82, 2.59, 1.52, 0.02, -7.25, -7.05, 4.65, -...
## $ SMB      <dbl> -0.80, -3.90, -0.28, -0.85, -0.27, -5.31, -3.27, 0.89...
## $ HML      <dbl> 1.57, 0.93, -0.45, 0.06, 0.74, -1.15, 1.36, -3.83, -3...
## $ RF       <dbl> 0.53, 0.46, 0.46, 0.53, 0.48, 0.51, 0.53, 0.50, 0.62,...
## $ ge       <dbl> -1.1984, -6.0377, 6.6474, 5.9621, -3.5806, -3.8196, -...
## $ ibm      <dbl> -5.9524, -0.7004, 7.0303, 4.4586, -2.5000, 5.8777, -3...
## $ mobil    <dbl> -1.4043, -7.8431, 21.5130, 2.9961, 2.6667, -12.9870, ...
## $ CRSP     <dbl> -0.6714, -5.3641, 3.0505, 2.0528, 0.5038, -6.7388, -6...
colnames(retdata)[2]<- 'Mkt_RF'# Replace 'Mkt-RF' with 'Mkt_RF'