# 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("AMZN", "MSFT", "HD", "WMT")

prices <- tq_get(x    = symbols, 
                 get  = "stock.prices", 
                 from = "2012-12-31",
                 to   = "2022-10-26")
prices
## # A tibble: 9,892 × 8
##    symbol date        open  high   low close   volume adjusted
##    <chr>  <date>     <dbl> <dbl> <dbl> <dbl>    <dbl>    <dbl>
##  1 AMZN   2012-12-31  12.2  12.6  12.1  12.5 68380000     12.5
##  2 AMZN   2013-01-02  12.8  12.9  12.7  12.9 65420000     12.9
##  3 AMZN   2013-01-03  12.9  13.0  12.8  12.9 55018000     12.9
##  4 AMZN   2013-01-04  12.9  13.0  12.8  13.0 37484000     13.0
##  5 AMZN   2013-01-07  13.1  13.5  13.1  13.4 98200000     13.4
##  6 AMZN   2013-01-08  13.4  13.4  13.2  13.3 60214000     13.3
##  7 AMZN   2013-01-09  13.4  13.5  13.3  13.3 45312000     13.3
##  8 AMZN   2013-01-10  13.4  13.4  13.1  13.3 57268000     13.3
##  9 AMZN   2013-01-11  13.3  13.4  13.2  13.4 48266000     13.4
## 10 AMZN   2013-01-14  13.4  13.7  13.4  13.6 85500000     13.6
## # … with 9,882 more rows

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"))
asset_returns_tbl
## # A tibble: 472 × 3
##    asset date        returns
##    <chr> <date>        <dbl>
##  1 AMZN  2013-01-31  0.0567 
##  2 AMZN  2013-02-28 -0.00464
##  3 AMZN  2013-03-28  0.00837
##  4 AMZN  2013-04-30 -0.0488 
##  5 AMZN  2013-05-31  0.0589 
##  6 AMZN  2013-06-28  0.0311 
##  7 AMZN  2013-07-31  0.0813 
##  8 AMZN  2013-08-30 -0.0696 
##  9 AMZN  2013-09-30  0.107  
## 10 AMZN  2013-10-31  0.152  
## # … with 462 more rows

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

# symbols
symbols <- asset_returns_tbl %>% distinct(asset) %>% pull() 
symbols
## [1] "AMZN" "HD"   "MSFT" "WMT"
# weights
weights <- c(0.30, 0.30, 0.15, 0.25)
weights
## [1] 0.30 0.30 0.15 0.25
w_tbl <- tibble(symbols, weights)
w_tbl
## # A tibble: 4 × 2
##   symbols weights
##   <chr>     <dbl>
## 1 AMZN       0.3 
## 2 HD         0.3 
## 3 MSFT       0.15
## 4 WMT        0.25

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: 118 × 2
##    date        returns
##    <date>        <dbl>
##  1 2013-01-31  0.0510 
##  2 2013-02-28  0.0117 
##  3 2013-03-28  0.0295 
##  4 2013-04-30  0.0317 
##  5 2013-05-31  0.0397 
##  6 2013-06-28  0.00350
##  7 2013-07-31  0.0295 
##  8 2013-08-30 -0.0453 
##  9 2013-09-30  0.0418 
## 10 2013-10-31  0.0722 
## # … with 108 more rows

5 Compute Sharpe Ratio

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

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: 95 × 2
##    date       rolling_sr
##    <date>          <dbl>
##  1 2014-12-31      0.435
##  2 2015-01-30      0.403
##  3 2015-02-27      0.444
##  4 2015-03-31      0.378
##  5 2015-04-30      0.380
##  6 2015-05-29      0.342
##  7 2015-06-30      0.316
##  8 2015-07-31      0.354
##  9 2015-08-31      0.348
## 10 2015-09-30      0.311
## # … with 85 more rows
rolling_sr_tbl %>%
    
    ggplot(aes(x = date, y = rolling_sr)) + 
    geom_line(color = "purple") + 
    
    # Labeling 
    labs(x = NULL, y = "Rolling Sharpe Ratio") + 
    
    annotate(geom = "text", 
             x = as.Date("2016-12-31"), y = 0.1, 
             label = str_glue("This portfolio did well from 2016 to 2018, 
                              but has done poorly from 2021 to 2022."), color = "black", 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?

My portfolio did moderately well from 2016 to 2018. It was up and down through 2018 to 2017, and kept dropping to 2020. After 2020, my portfolio started to do well again until 2022, where it dropped drastically to where it is now.