# Load packages
# Core
library(tidyverse)
library(tidyquant)
Collect individual returns into a portfolio by assigning a weight to each stock
five stocks: “SPY”, “EFA”, “IJS”, “EEM”, “AGG”
from 2012-12-31 to 2017-12-31
symbols <- c("NVDA", "NFLX", "MSFT", "TSLA", "SPY")
prices <- tq_get(x = symbols,
from = "2012-12-31",
to = "2017-12-31")
asset_returns_tbl <- prices %>%
group_by(symbol) %>%
tq_transmute (select = adjusted,
mutate_fun = periodReturn,
period = "monthly",
type = "log") %>%
slice(-1) %>%
ungroup() %>%
set_names(c("asset","date","returns"))
#symbols
symbols <- asset_returns_tbl %>% distinct (asset) %>% pull()
symbols
## [1] "MSFT" "NFLX" "NVDA" "SPY" "TSLA"
#weights
weight <- c(0.25,0.25,0.2,0.2,0.1)
weight
## [1] 0.25 0.25 0.20 0.20 0.10
w_tbl <- tibble(symbols,weight)
w_tbl
## # A tibble: 5 × 2
## symbols weight
## <chr> <dbl>
## 1 MSFT 0.25
## 2 NFLX 0.25
## 3 NVDA 0.2
## 4 SPY 0.2
## 5 TSLA 0.1
#?tq_portfolio
portfolio_returns_tbl <- asset_returns_tbl %>%
tq_portfolio(assets_col = asset,
returns_col = returns,
weights = w_tbl,
rebalance_on = "months", col_rename = "returns")
portfolio_returns_tbl
## # A tibble: 60 × 2
## date returns
## <date> <dbl>
## 1 2013-01-31 0.172
## 2 2013-02-28 0.0404
## 3 2013-03-28 0.0273
## 4 2013-04-30 0.123
## 5 2013-05-31 0.101
## 6 2013-06-28 -0.0193
## 7 2013-07-31 0.0544
## 8 2013-08-30 0.0733
## 9 2013-09-30 0.0508
## 10 2013-10-31 0.0113
## # ℹ 50 more rows
#Define RFR
rfr <- 0.0003
portfolio_sharpe <- portfolio_returns_tbl %>%
tq_performance(Ra = returns,
performance_fun = SharpeRatio,
Rf = rfr,
FUN = "StdDev")
portfolio_sharpe
## # A tibble: 1 × 1
## `SharpeRatio(Rf=0%,p=95%)`
## <dbl>
## 1 0.573
portfolio_returns_tbl %>%
ggplot(aes(x = returns)) +
geom_histogram(binwidth = 0.01, fill = "cornflowerblue", alpha = 0.5) +
geom_vline(xintercept = rfr, color = "green", size = 1) +
annotate(geom = "text", x = rfr, y = 13, label = "risk free rate",
angle = 90) +
labs(y = "count")
portfolio_returns_tbl %>%
mutate(excess_returns = if_else(returns > rfr,
"rfr_above",
"rfr_below")) %>%
# Plot
ggplot(aes(x = date, y = returns)) +
geom_point(aes(color = excess_returns)) +
geom_hline(yintercept = rfr, color = "cornflowerblue", linetype = 3, size = 1) +
geom_vline(xintercept = as.Date("2016-11-01"),
color = "cornflowerblue", size = 1) +
theme(legend.position = "none") +
annotate( geom = "text",
x = as.Date("2016-12-01"), y = -0.04, label = "Election", size = 5, angle = 90) +
annotate( geom = "text",
x = as.Date("2017-05-01"), y = -0.01, label = str_glue("No Returns below RFR after the 2016 election"), color = "green") +
labs(y = "monthly returns", x = NULL)
#Create custom function
Rolling_Sharpe <- function(data) {
rolling_SR <- SharpeRatio(R = data,
Rf = rfr,
FUN = "StdDev")
return(rolling_SR)
}
#Set Window
window <- 24
rolling_sr_tbl <- portfolio_returns_tbl %>%
tq_mutate(select = returns,mutate_fun = rollapply,
width = window,
FUN = Rolling_Sharpe,
col_rename = ("Rolling SR")) %>%
select(-returns) %>%
na.omit()
rolling_sr_tbl
## # A tibble: 37 × 2
## date `Rolling SR`
## <date> <dbl>
## 1 2014-12-31 0.620
## 2 2015-01-30 0.576
## 3 2015-02-27 0.597
## 4 2015-03-31 0.474
## 5 2015-04-30 0.475
## 6 2015-05-29 0.442
## 7 2015-06-30 0.443
## 8 2015-07-31 0.449
## 9 2015-08-31 0.391
## 10 2015-09-30 0.344
## # ℹ 27 more rows
rolling_sr_tbl %>%
ggplot(aes(x = date, y = `Rolling SR`)) +
geom_line(color = "cornflowerblue") +
labs(x = NULL,
y = "Rolling Sharpe Ratio") +
annotate(geom = "text",
x = as.Date("2016-06-01"), y = 0.5, label = "This portfolio has done well since 2016",
color = "red", size = 2)
How has your portfolio performed over time? Provide dates of the
structural breaks, if any. The Code Along Assignment 9 had one
structural break in November 2016. What do you think the reason
is?
This portfolio has underperformed over the period of time examined,
returning a negative result. The largest structural break came early
2016 where the downtrend reversed and the average monthly return rose
significantly and the volatilty decreased. The initial downward movement
can be partially attributed to low oil prices and Brexit vote/weakening
currencies in the UK according to Wikipedia. The Wall Street Journal
suggests the recovery was largely due to strong U.S. economic data that
compensated for the negative global factors.