# 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", "AMZN", "AAPL", "NVDA", "PG")

prices <- tq_get(x    = symbols, 
                 get. = "stock.prices",
                 from = "2012-12-31", 
                 to   = "2017-12-31")

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

4 Build a portfolio

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

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.556

6 Plot: 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: 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?

Portfolio discussion

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.

Structural Breaks and Possible Reasons

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.

Summary

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.