# 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("TSLA", "AMZN", "AAPL", "NVDA", "PG")
prices <- tq_get(x = symbols,
get. = "stock.prices",
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] "AAPL" "AMZN" "NVDA" "PG" "TSLA"
# weights
weights <- c(0.2, 0.2, 0.2, 0.2, 0.2)
weights
## [1] 0.2 0.2 0.2 0.2 0.2
w_tbl <- tibble(symbols, weights)
w_tbl
## # A tibble: 5 × 2
## symbols weights
## <chr> <dbl>
## 1 AAPL 0.2
## 2 AMZN 0.2
## 3 NVDA 0.2
## 4 PG 0.2
## 5 TSLA 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.0226
## 2 2013-02-28 -0.0105
## 3 2013-03-28 0.0240
## 4 2013-04-30 0.0760
## 5 2013-05-31 0.146
## 6 2013-06-28 -0.00567
## 7 2013-07-31 0.103
## 8 2013-08-30 0.0473
## 9 2013-09-30 0.0486
## 10 2013-10-31 0.0208
## # ℹ 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.556
# 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.530
## 2 2015-01-30 0.508
## 3 2015-02-27 0.567
## 4 2015-03-31 0.494
## 5 2015-04-30 0.492
## 6 2015-05-29 0.455
## 7 2015-06-30 0.448
## 8 2015-07-31 0.412
## 9 2015-08-31 0.340
## 10 2015-09-30 0.315
## # ℹ 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.1,
label = str_glue("This portfolio had both strong and
weak periods of performance since 2016."), color = "red", size = 4)
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?
Based on the plot, my portfolio experienced both strong and weak periods of risk-adjusted performance between 2015 and 2018.
Dec 2014 – Late 2015: The rolling Sharpe ratio started high, around 0.5–0.6, showing strong risk-adjusted performance.
2016: Performance declined steadily, reaching a structural break around November 2016, where the Sharpe ratio dropped to about 0.2, marking the weakest period.
Early 2017 – Late 2017: The Sharpe ratio rose sharply to about 0.6, showing improved risk-adjusted returns and a recovery phase.
2018: The ratio stabilized at moderate levels around 0.5 before tapering slightly toward the end of the period, suggesting consistent but slightly weaker performance.
The main structural break occurred in November 2016, where the Sharpe ratio reached its lowest point before rebounding. This likely reflects major market volatility during that time, possibly related to global uncertainty and reactions to the U.S. presidential election. The recovery afterward could be due to stronger market sentiment and growth expectations that followed in 2017.
Overall, my portfolio showed fluctuating performance with one clear structural break in late 2016. After this point, performance improved and stabilized, indicating stronger risk-adjusted returns and better market conditions.