Hint: Import Apple, Google, Netflix, Microsoft and Tesla from “2015-01-01” to “2018-12-31”.
# Load packages
library(tidyquant)
library(tidyverse)
# Asset Period Returns
stock_returns_monthly <- c("AAPL", "GOOG", "NFLX", "MSFT", "TSLA") %>%
tq_get(get = "stock.prices",
from = "2015-01-01",
to = "2018-12-31") %>%
group_by(symbol) %>%
tq_transmute(select = adjusted,
mutate_fun = periodReturn,
period = "monthly",
col_rename = "Ra")
stock_returns_monthly
## # A tibble: 240 x 3
## # Groups: symbol [5]
## symbol date Ra
## <chr> <date> <dbl>
## 1 AAPL 2015-01-30 0.0716
## 2 AAPL 2015-02-27 0.101
## 3 AAPL 2015-03-31 -0.0314
## 4 AAPL 2015-04-30 0.00579
## 5 AAPL 2015-05-29 0.0453
## 6 AAPL 2015-06-30 -0.0372
## 7 AAPL 2015-07-31 -0.0329
## 8 AAPL 2015-08-31 -0.0662
## 9 AAPL 2015-09-30 -0.0218
## 10 AAPL 2015-10-30 0.0834
## # … with 230 more rows
# Baseline Period Returns
baseline_returns_monthly <- "^GSPC" %>%
tq_get(get = "stock.prices",
from = "2015-01-01",
to = "2018-12-31") %>%
tq_transmute(select = adjusted,
mutate_fun = periodReturn,
period = "monthly",
col_rename = "Rb")
baseline_returns_monthly
## # A tibble: 48 x 2
## date Rb
## <date> <dbl>
## 1 2015-01-30 -0.0307
## 2 2015-02-27 0.0549
## 3 2015-03-31 -0.0174
## 4 2015-04-30 0.00852
## 5 2015-05-29 0.0105
## 6 2015-06-30 -0.0210
## 7 2015-07-31 0.0197
## 8 2015-08-31 -0.0626
## 9 2015-09-30 -0.0264
## 10 2015-10-30 0.0830
## # … with 38 more rows
# scaling a single portfolio to many, 3 in this case
stock_returns_monthly_multi <- stock_returns_monthly %>%
tq_repeat_df(n = 3)
stock_returns_monthly_multi
## # A tibble: 720 x 4
## # Groups: portfolio [3]
## portfolio symbol date Ra
## <int> <chr> <date> <dbl>
## 1 1 AAPL 2015-01-30 0.0716
## 2 1 AAPL 2015-02-27 0.101
## 3 1 AAPL 2015-03-31 -0.0314
## 4 1 AAPL 2015-04-30 0.00579
## 5 1 AAPL 2015-05-29 0.0453
## 6 1 AAPL 2015-06-30 -0.0372
## 7 1 AAPL 2015-07-31 -0.0329
## 8 1 AAPL 2015-08-31 -0.0662
## 9 1 AAPL 2015-09-30 -0.0218
## 10 1 AAPL 2015-10-30 0.0834
## # … with 710 more rows
# Create Vector of Weights
# not all symbols need to be specified. Any symbol not specified by default gets a weight of zero.
weights <- c(
0.40, 0.40, 0.40, 0.40, 0.60,
0.40, 0.40, 0.40, 0.60, 0.40,
0.40, 0.40, 0.60, 0.40, 0.40
)
stocks <- c("AAPL", "GOOG", "NFLX", "MSFT", "TSLA")
weights_table <- tibble(stocks) %>%
tq_repeat_df(n = 3) %>%
bind_cols(tibble(weights)) %>%
group_by(portfolio)
weights_table
## # A tibble: 15 x 3
## # Groups: portfolio [3]
## portfolio stocks weights
## <int> <chr> <dbl>
## 1 1 AAPL 0.4
## 2 1 GOOG 0.4
## 3 1 NFLX 0.4
## 4 1 MSFT 0.4
## 5 1 TSLA 0.6
## 6 2 AAPL 0.4
## 7 2 GOOG 0.4
## 8 2 NFLX 0.4
## 9 2 MSFT 0.6
## 10 2 TSLA 0.4
## 11 3 AAPL 0.4
## 12 3 GOOG 0.4
## 13 3 NFLX 0.6
## 14 3 MSFT 0.4
## 15 3 TSLA 0.4
# Aggregate a Portfolio using Vector of Weights
portfolio_returns_monthly_multi <-
stock_returns_monthly_multi %>%
tq_portfolio(assets_col = symbol,
returns_col = Ra,
weights = weights_table,
col_rename = "Ra")
portfolio_returns_monthly_multi
## # A tibble: 144 x 3
## # Groups: portfolio [3]
## portfolio date Ra
## <int> <date> <dbl>
## 1 1 2015-01-30 1.25
## 2 1 2015-02-27 0.0583
## 3 1 2015-03-31 -0.0660
## 4 1 2015-04-30 0.148
## 5 1 2015-05-29 0.0586
## 6 1 2015-06-30 0.0130
## 7 1 2015-07-31 0.0900
## 8 1 2015-08-31 -0.0340
## 9 1 2015-09-30 -0.0370
## 10 1 2015-10-30 0.0409
## # … with 134 more rows
Portfolio 1: 7.16 * 0.4 + 1.85 * 0.4 + 2.66 * 0.4 + -0.14 * 0.4 + -0.07 * 0.6 = 1.24
Portfolio 2: 7.16 * 0.4 + 1.85 * 0.4 + 2.66 * 0.4 + -0.14 * 0.6 + -0.07 * 0.4 = 1.23
Portfolio 3: 7.16 * 0.4 + 1.85 * 0.4 + 2.66 * 0.6 + -0.14 * 0.4 + -0.07 * 0.4 = 1.31
# Merging Ra and Rb
RaRb_single_portfolio <- left_join(portfolio_returns_monthly_multi ,
baseline_returns_monthly,
by = "date")
RaRb_single_portfolio
## # A tibble: 144 x 4
## # Groups: portfolio [?]
## portfolio date Ra Rb
## <int> <date> <dbl> <dbl>
## 1 1 2015-01-30 1.25 -0.0307
## 2 1 2015-02-27 0.0583 0.0549
## 3 1 2015-03-31 -0.0660 -0.0174
## 4 1 2015-04-30 0.148 0.00852
## 5 1 2015-05-29 0.0586 0.0105
## 6 1 2015-06-30 0.0130 -0.0210
## 7 1 2015-07-31 0.0900 0.0197
## 8 1 2015-08-31 -0.0340 -0.0626
## 9 1 2015-09-30 -0.0370 -0.0264
## 10 1 2015-10-30 0.0409 0.0830
## # … with 134 more rows
RaRb_single_portfolio %>%
tq_performance(Ra = Ra, Rb = Rb, performance_fun = table.CAPM) %>%
t()
## [,1] [,2] [,3]
## portfolio 1.0000 2.0000 3.0000
## ActivePremium 0.4703 0.4821 0.5195
## Alpha 0.0448 0.0450 0.0486
## AnnualizedAlpha 0.6922 0.6956 0.7671
## Beta 0.2903 0.3566 0.3421
## Beta- 1.1252 1.1487 1.2885
## Beta+ 0.8219 1.0242 0.9765
## Correlation 0.0521 0.0647 0.0578
## Correlationp-value 0.7252 0.6624 0.6965
## InformationRatio 0.7158 0.7432 0.7463
## R-squared 0.0027 0.0042 0.0033
## TrackingError 0.6571 0.6486 0.6961
## TreynorRatio 1.7862 1.4873 1.6597
The portfolios have a beta of 0.29, 0.36. and 0.34 which means compared to the market as a whole they are less risky because they are less than 1 but also have a higher chance of having a lower return. Portfolio 1 is 29% as volatile as the market, Portfolio 2 is 36% as volatile and Portfolio 3 is 34% as volatile as the market. These portfolios would be good for a risk averse investor.
THe portfolios have alpha of 0.0448, 0.0450, and 0.0486 respectively. This means all of the portfolios did about 0.5% better than the S&P 500.
Annualize Alpha is equal to 12 times the monthly alpha value. This means it will determne the amount above or below the portfolio performed beyont the market index over the year period. In the portfolios this is 69%, 70%, and 77% respectively.