# 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("SPY", "WMT", "COST", "AMZN")
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 %>%
# I added asset_returns_tbl here (wasn't in video) otherwise the code would not run, and mistake code wouldn't be fixable
# In video
    
    group_by(symbol) %>%

    tq_transmute(select     = adjusted, 
                 mutate_fun = periodReturn, 
                 period     = "monthly",
                 type       = "log") %>%
    slice(-1) %>%
    #Remove the first row, but since data is group, it will remove the first line of each group
    
    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" "COST" "SPY"  "WMT"
# weights
weights <- c(0.30, 0.30, 0.20, 0.20)
weights
## [1] 0.3 0.3 0.2 0.2
w_tbl <- tibble(symbols, weights)
w_tbl
## # A tibble: 4 × 2
##   symbols weights
##   <chr>     <dbl>
## 1 AMZN        0.3
## 2 COST        0.3
## 3 SPY         0.2
## 4 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: 60 × 2
##    date        returns
##    <date>        <dbl>
##  1 2013-01-31  0.0427 
##  2 2013-02-28  0.00121
##  3 2013-03-28  0.0363 
##  4 2013-04-30  0.00325
##  5 2013-05-31  0.0201 
##  6 2013-06-28  0.00825
##  7 2013-07-31  0.0616 
##  8 2013-08-30 -0.0526 
##  9 2013-09-30  0.0497 
## 10 2013-10-31  0.0694 
## # ℹ 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.410

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: 37 × 2
##    date       rolling_sr
##    <date>          <dbl>
##  1 2014-12-31      0.338
##  2 2015-01-30      0.331
##  3 2015-02-27      0.377
##  4 2015-03-31      0.335
##  5 2015-04-30      0.346
##  6 2015-05-29      0.321
##  7 2015-06-30      0.278
##  8 2015-07-31      0.294
##  9 2015-08-31      0.289
## 10 2015-09-30      0.248
## # ℹ 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.5,
             label = "This portfolio has done quite well 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?

My portfolio had been declining pretty steadily until around February 2016 where it change its trend and started to rise, without going as low as it did in Feb 2016. Hence, the main structural break is at that time as it the lowest Rolling Sharpe Ratio my portfolio ever experienced in that time frame. That being said, after that time, my portfolio saw a growing trend (upward), a few drops happened but they always stayed above 2016’s level. Given the global market had some important turbulence in 2015 and early 2016 due, in part, to the price of oil collapsing, and the economic slowdown of China. Since all of my stocks are US equities, they were greatly impacted by those turbulence since their performance is mostly linked to the overall market conditions (due to volatility spike and risk-off sentiment). The global concerns ended up negatively impacted all of them. The lowest structural breaks in early 2016, more particularly, was the lowest since that was the end of the mini-bear market, and the market re-stabilized.