# 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

# Choose stocks

symbols <- c("AAPL", "ROKU", "CL=F")

# Using tq_get() ----
prices <- tq_get(x    = symbols,
                 get  = "stock.prices",
                 from = "2012-12-31",
                 to   = "2023-10-22")

2 Convert prices to returns (monthly)

asset_returns_tbl <- prices %>%
  
  # Calculate monthly returns
  group_by(symbol) %>%
  tq_transmute(select     = adjusted,
               mutate_fun = periodReturn,
               period     = "monthly",
               type       = "log") %>%
  slice (-1) %>%
  ungroup() %>%
  
  # rename
  set_names(c("asset", "date", "returns"))

# period_returns = c("yearly", "quarterly", "monthly", "weekly")

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

symbols <- asset_returns_tbl %>% distinct(asset) %>% pull()

w <- c(0.15,
       0.35,
       0.50)

w_tbl <- tibble(symbols, w)

4 Build a portfolio

portfolio_returns_tbl <- asset_returns_tbl %>%
  
  tq_portfolio(assets_col   = asset,
               returns_col  = returns,
               weights      = w_tbl,
               col_rename   = "returns",
               rebalance_on = "months")

portfolio_returns_tbl
## # A tibble: 130 × 2
##    date        returns
##    <date>        <dbl>
##  1 2013-01-31 -0.00237
##  2 2013-02-28 -0.0239 
##  3 2013-03-28  0.0196 
##  4 2013-04-30 -0.0138 
##  5 2013-05-31 -0.00230
##  6 2013-06-28 -0.00184
##  7 2013-07-31  0.0492 
##  8 2013-08-30  0.0207 
##  9 2013-09-30 -0.0210 
## 10 2013-10-31 -0.00716
## # ℹ 120 more rows

5 Compute Sharpe Ratio

# Define risk free rate
rfr <- 0.0003

portfolio_SharpeRatio_tbl <- portfolio_returns_tbl %>%
  
  tq_performance(Ra              = returns,
                 Rf              = rfr,
                 performance_fun = SharpeRatio,
                 FUN             = "StdDev")

portfolio_SharpeRatio_tbl
## # A tibble: 1 × 1
##   `StdDevSharpe(Rf=0%,p=95%)`
##                         <dbl>
## 1                      0.0505

6 Plot: Rolling Sharpe Ratio

Rolling Sharpe Ratio

# Create a custom function to calculate rolling Sharpe Ratio
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: 107 × 2
##    date       rolling_sr
##    <date>          <dbl>
##  1 2014-12-31    -0.198 
##  2 2015-01-30    -0.230 
##  3 2015-02-27    -0.156 
##  4 2015-03-31    -0.215 
##  5 2015-04-30    -0.0688
##  6 2015-05-29    -0.0527
##  7 2015-06-30    -0.0634
##  8 2015-07-31    -0.216 
##  9 2015-08-31    -0.237 
## 10 2015-09-30    -0.249 
## # ℹ 97 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("2019-06-01"), y = 0.5,
           label = "This portfolio did quite well from 2017 - mid 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 the early stages of 2016. What do you think the reason is?

My portfolio performed quite well from 2017 until the middle of 2022, but it has not performed great. Structural breaks: the first structural break was in the start of 2016, and the second structural break was in December 2022 / January 2023. I think the reason for the structural break in the code along assignment in the early stages of 2016 happened because of the recession that happened some months earlier, and this might be the reason for the structural break in my portfolio as well in early 2016. The recession led the global stock markets to fall hard, and the world economy took a hard hit.