# Load packages

# Core
library(tidyverse)
library(tidyquant)

Goal

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

1 Import stock prices

symbols <- c("TSLA", "NVDA", "LLY", "HD", "UAA")
prices <- tq_get(x    = symbols, 
                 get. = "stock.prices",
                 from = "2012-12-31",
                 to   = Sys.Date())

2 Convert prices to returns (monthly)

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"))

3 Assign a weight to each asset (change the weigting scheme)

# 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

4 Build a 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: 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

5 Compute Sharpe Ratio

# 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

6 Plot: Rolling Sharpe Ratio

Rolling Sharpe Ratio

# 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?

Potfolio Analysis

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.

Possible Reasons for SB

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.

Summary

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.