# 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", "NVDA", "LLY", "HD", "UAA")
prices <- tq_get(x = symbols,
get. = "stock.prices",
from = "2012-12-31",
to = Sys.Date())
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] "HD" "LLY" "NVDA" "TSLA" "UAA"
# 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 HD 0.2
## 2 LLY 0.2
## 3 NVDA 0.2
## 4 TSLA 0.2
## 5 UAA 0.2
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: 154 × 2
## date returns
## <date> <dbl>
## 1 2013-01-31 0.0626
## 2 2013-02-28 -0.00345
## 3 2013-03-28 0.0396
## 4 2013-04-30 0.112
## 5 2013-05-31 0.154
## 6 2013-06-28 -0.0127
## 7 2013-07-31 0.0934
## 8 2013-08-30 0.0505
## 9 2013-09-30 0.0560
## 10 2013-10-31 -0.0353
## # ℹ 144 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.312
# 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: 131 × 2
## date rolling_sr
## <date> <dbl>
## 1 2014-12-31 0.637
## 2 2015-01-30 0.582
## 3 2015-02-27 0.630
## 4 2015-03-31 0.586
## 5 2015-04-30 0.546
## 6 2015-05-29 0.529
## 7 2015-06-30 0.563
## 8 2015-07-31 0.542
## 9 2015-08-31 0.496
## 10 2015-09-30 0.472
## # ℹ 121 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("2018-06-01"), y = 0,
label = str_glue("This portfolio had both strong and
weak periods of performance 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?
Based on the plot generated, my portfolio had significant fluctuations over time, showing signs of strength and weakness from 2015-2025
2015–2017: Sharpe ratio trended downward from around 0.6 to near 0.3 — the first structural break occurs around mid-2016, signaling a decline in risk-adjusted performance.
2018–2019: Another dip toward 0.2, suggesting a weaker performance phase.
2020–2021: Sharp recovery, with the Sharpe ratio climbing back near 0.6, likely during favorable market conditions post-COVID correction — a second structural break upward around early 2020.
2022–2023: Noticeable decline again, even dipping close to 0.0, showing poor performance relative to risk — a third break downward around mid-2022.
2024–2025: A partial rebound with Sharpe improving toward 0.4, but volatility remains visible.
The changes in my portfolio’s Sharpe ratio likely reflect shifts in market conditions over time. Around mid-2016, the decline may have been caused by the Federal Reserve raising interest rates for the first time in years, which increased market volatility and hurt returns. In early 2020, the Sharpe ratio improved sharply after COVID-19, as massive government stimulus and falling interest rates led to a strong market rebound. Around mid-2022, performance weakened again when high inflation and aggressive rate hikes caused both stocks and bonds to fall. More recently, between 2024 and 2025, the Sharpe ratio began to recover as inflation cooled, interest rates stabilized, and markets became more stable, improving returns relative to risk.
My portfolio showed volatile performance with clear sturctural breaks in mid-2016, early 2020, and mid-2022. After these breaks, the p[ortfolio started to grow back towards its normal volatility around 2025.