# Load packages
# Core
library(tidyverse)
library(tidyquant)
Visualize and examine changes in the underlying trend in the performance of your portfolio in terms of Sharpe Ratio.
Choose your stocks.
from 2012-12-31 to present
symbols <- c("SPY", "WMT", "COST", "AMZN")
prices <- tq_get(x = symbols,
get = "stock.prices",
from = "2012-12-31",
to = "2017-12-31")
asset_returns_tbl <- prices %>%
# I added asset_returns_tbl here (wasn't in video) otherwise the code would not run, and mistake code wouldn't be fixable
# In video
group_by(symbol) %>%
tq_transmute(select = adjusted,
mutate_fun = periodReturn,
period = "monthly",
type = "log") %>%
slice(-1) %>%
#Remove the first row, but since data is group, it will remove the first line of each group
ungroup() %>%
set_names(c("asset", "date", "returns"))
# symbols
symbols <- asset_returns_tbl %>% distinct(asset) %>% pull()
symbols
## [1] "AMZN" "COST" "SPY" "WMT"
# weights
weights <- c(0.30, 0.30, 0.20, 0.20)
weights
## [1] 0.3 0.3 0.2 0.2
w_tbl <- tibble(symbols, weights)
w_tbl
## # A tibble: 4 × 2
## symbols weights
## <chr> <dbl>
## 1 AMZN 0.3
## 2 COST 0.3
## 3 SPY 0.2
## 4 WMT 0.2
# ?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.0427
## 2 2013-02-28 0.00121
## 3 2013-03-28 0.0363
## 4 2013-04-30 0.00325
## 5 2013-05-31 0.0201
## 6 2013-06-28 0.00825
## 7 2013-07-31 0.0616
## 8 2013-08-30 -0.0526
## 9 2013-09-30 0.0497
## 10 2013-10-31 0.0694
## # ℹ 50 more rows
# Define risk free rate
rfr <- 0.0003
portfolio_SharpeRatio_tbl <- portfolio_returns_tbl %>%
tq_performance(Ra = returns,
performance_fun = SharpeRatio,
Rf = rfr,
FUN = "StdDev")
portfolio_SharpeRatio_tbl
## # A tibble: 1 × 1
## `StdDevSharpe(Rf=0%,p=95%)`
## <dbl>
## 1 0.410
# Create a custom function to calculate rolling SR
Calculate_rolling_SharpeRatio <- function(data) {
rolling_SR <- SharpeRatio(R = data,
Rf = rfr,
FUN = "StdDev")
return(rolling_SR)
}
# Define window
window <- 24
# Transform data: calculate rolling Sharpe ratio
rolling_sr_tbl <- portfolio_returns_tbl %>%
tq_mutate(select = returns,
mutate_fun = rollapply,
width = window,
FUN = Calculate_rolling_SharpeRatio,
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.338
## 2 2015-01-30 0.331
## 3 2015-02-27 0.377
## 4 2015-03-31 0.335
## 5 2015-04-30 0.346
## 6 2015-05-29 0.321
## 7 2015-06-30 0.278
## 8 2015-07-31 0.294
## 9 2015-08-31 0.289
## 10 2015-09-30 0.248
## # ℹ 27 more rows
rolling_sr_tbl %>%
ggplot(aes(x = date, y = rolling_sr)) +
geom_line(color = "cornflowerblue") +
# Labeling
labs(x = NULL, y = "Rolling Sharpe Ratio") +
annotate(geom = "text",
x = as.Date("2016-06-01"), y = 0.5,
label = "This portfolio has done quite well since 2016.",
color = "red", size = 5)
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?
My portfolio had been declining pretty steadily until around February 2016 where it change its trend and started to rise, without going as low as it did in Feb 2016. Hence, the main structural break is at that time as it the lowest Rolling Sharpe Ratio my portfolio ever experienced in that time frame. That being said, after that time, my portfolio saw a growing trend (upward), a few drops happened but they always stayed above 2016’s level. Given the global market had some important turbulence in 2015 and early 2016 due, in part, to the price of oil collapsing, and the economic slowdown of China. Since all of my stocks are US equities, they were greatly impacted by those turbulence since their performance is mostly linked to the overall market conditions (due to volatility spike and risk-off sentiment). The global concerns ended up negatively impacted all of them. The lowest structural breaks in early 2016, more particularly, was the lowest since that was the end of the mini-bear market, and the market re-stabilized.