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.10, 0.10, 0.10, 0.10, 0.60,
0.10, 0.10, 0.10, 0.60, 0.10,
0.10, 0.10, 0.60, 0.10, 0.10
)
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.1
## 2 1 GOOG 0.1
## 3 1 NFLX 0.1
## 4 1 MSFT 0.1
## 5 1 TSLA 0.6
## 6 2 AAPL 0.1
## 7 2 GOOG 0.1
## 8 2 NFLX 0.1
## 9 2 MSFT 0.6
## 10 2 TSLA 0.1
## 11 3 AAPL 0.1
## 12 3 GOOG 0.1
## 13 3 NFLX 0.6
## 14 3 MSFT 0.1
## 15 3 TSLA 0.1
# 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 -0.0210
## 2 1 2015-02-27 0.0329
## 3 1 2015-03-31 -0.0683
## 4 1 2015-04-30 0.168
## 5 1 2015-05-29 0.0801
## 6 1 2015-06-30 0.0375
## 7 1 2015-07-31 0.0463
## 8 1 2015-08-31 -0.0468
## 9 1 2015-09-30 -0.0227
## 10 1 2015-10-30 -0.0472
## # ... with 134 more rows
Portfolio 1- -2.1% is the first period return.
It’s computed by using the portfolio weights and multiplying them by each portfolio’s return for that period then adding each of them together.
# 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 -0.0210 -0.0307
## 2 1 2015-02-27 0.0329 0.0549
## 3 1 2015-03-31 -0.0683 -0.0174
## 4 1 2015-04-30 0.168 0.00852
## 5 1 2015-05-29 0.0801 0.0105
## 6 1 2015-06-30 0.0375 -0.0210
## 7 1 2015-07-31 0.0463 0.0197
## 8 1 2015-08-31 -0.0468 -0.0626
## 9 1 2015-09-30 -0.0227 -0.0264
## 10 1 2015-10-30 -0.0472 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.1431 0.2005 0.3499
## Alpha 0.0132 0.0149 0.0275
## AnnualizedAlpha 0.1709 0.1937 0.3856
## Beta 0.8465 1.2389 1.2484
## Beta- 0.8137 1.0441 1.6631
## Beta+ 0.0575 1.2787 0.9734
## Correlation 0.4093 0.6901 0.4150
## Correlationp-value 0.0039 0.0000 0.0034
## InformationRatio 0.6457 1.2965 1.0878
## R-squared 0.1675 0.4763 0.1722
## TrackingError 0.2216 0.1546 0.3217
## TreynorRatio 0.2261 0.2008 0.3190
If Beta is above 1 it is more volitile than the market, and if it is below 1 it is less volitle than the market. Portfolio 1- Beta = 0.8465 is less than 1 meaning it is less volitile Portfolio 2- Beta = 1.2389 is more than 1 meaning it is more volitile Portfolio 3- Beta = 1.2484 is more than 1 meaning it is more volitile
If Alpha is positive it is seen as doing better than the market. Portfolio 1- Alpha = 0.0132 Seen as doing better than the benchmark Portfolio 2- Alpha = 0.0149 Seen as doing better than the benchmark Portfolio 3- Alpha = 0.0275 Seen as doing better than the benchmark
If AnnualizedAlpha is positive it is seen as doing better than the market on an annual basis. Portfolio 1- AnnualizedAlpha = 0.1709 Seen as doing better than the benchmark Portfolio 2- AnnualizedAlpha = 0.1937 Seen as doing better than the benchmark Portfolio 3- AnnualizedAlpha = 0.3856 Seen as doing better than the benchmark