# 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("WMT", "TGT", "LOW", "GOOG", "AMZN")

prices <- tq_get(x = symbols, 
                 get = "stock.prices",
                 from = "2012-12-31",
                 to = "2025-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] "AMZN" "GOOG" "LOW"  "TGT"  "WMT"
# 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 AMZN        0.2
## 2 GOOG        0.2
## 3 LOW         0.2
## 4 TGT         0.2
## 5 WMT         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: 156 × 2
##    date         returns
##    <date>         <dbl>
##  1 2013-01-31  0.0490  
##  2 2013-02-28  0.0223  
##  3 2013-03-28  0.0278  
##  4 2013-04-30  0.0149  
##  5 2013-05-31  0.0328  
##  6 2013-06-28 -0.000319
##  7 2013-07-31  0.0519  
##  8 2013-08-30 -0.0522  
##  9 2013-09-30  0.0405  
## 10 2013-10-31  0.0826  
## # ℹ 146 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
##   `SharpeRatio(Rf=0%,p=95%)`
##                        <dbl>
## 1                      0.273

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: 133 × 2
##    date       rolling_sr
##    <date>          <dbl>
##  1 2014-12-31      0.403
##  2 2015-01-30      0.377
##  3 2015-02-27      0.399
##  4 2015-03-31      0.372
##  5 2015-04-30      0.340
##  6 2015-05-29      0.304
##  7 2015-06-30      0.287
##  8 2015-07-31      0.309
##  9 2015-08-31      0.326
## 10 2015-09-30      0.285
## # ℹ 123 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 = "The portfolio performed
             quite well from 2015 to 2022.",
             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?

The portfolio performed quite well from 2015 to 2022. The rolling sharpe ratio went between 0.2 to 0.55. After late 2022, the sharpe ratio declined, and eventually became negative in 2023. This shows possible low points and weak performance. The lowest point of this portfolio was in late 2023. GOOG and AMZN could have been affected by the downturn of the stock market in 2022. The rest of the portfolio could have fluctuated due to interest rates or inflation rising. The sharpe ratio became positive again in 2024, and had returned to average performance by 2025. The structural break from code along 9 may be from the election in 2016, whereas this stock portfolio declined in 2022 due to other reasons. We can see through both charts how interest rates and inflation affect different stocks variously.