# Load packages

# Core
library(tidyverse)
library(tidyquant)
library(ggrepel)

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("UAL", "LUV", "AAL", "DAL")

prices <- tq_get(x    = symbols,
                 get  = "stock.prices",
                 from = "2012-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] "AAL" "DAL" "LUV" "UAL"
# weights
weights <- c(0.2, 0.3, 0.3, 0.2)
weights
## [1] 0.2 0.3 0.3 0.2
w_tbl <- tibble(symbols, weights)
w_tbl
## # A tibble: 4 × 2
##   symbols weights
##   <chr>     <dbl>
## 1 AAL         0.2
## 2 DAL         0.3
## 3 LUV         0.3
## 4 UAL         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: 150 × 2
##    date       returns
##    <date>       <dbl>
##  1 2013-01-31  0.0920
##  2 2013-02-28  0.0288
##  3 2013-03-28  0.169 
##  4 2013-04-30  0.0171
##  5 2013-05-31  0.0337
##  6 2013-06-28 -0.0370
##  7 2013-07-31  0.113 
##  8 2013-08-30 -0.120 
##  9 2013-09-30  0.139 
## 10 2013-10-31  0.133 
## # ℹ 140 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.0684

6 Plot: 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)
}

# Create a 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: 127 × 2
##    date       rolling_sr
##    <date>          <dbl>
##  1 2014-12-31      0.769
##  2 2015-01-30      0.710
##  3 2015-02-27      0.643
##  4 2015-03-31      0.605
##  5 2015-04-30      0.529
##  6 2015-05-29      0.440
##  7 2015-06-30      0.419
##  8 2015-07-31      0.400
##  9 2015-08-31      0.505
## 10 2015-09-30      0.445
## # ℹ 117 more rows
rolling_sr_tbl %>%
    
    ggplot(aes(x = date, y = rolling_sr)) +
    geom_line(color = "cornflowerblue") +
    
    # Labeling
    labs(x = NULL, y = "Rolling Sharpe Ratio")

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?

Since mid-2015, this portfolio has performed much worse, with less efficient returns well into 2025. The first identifiable structural break is the end of 2015 into 2016. Researching the topic, it is apparent that a significant drop in oil prices from 2015-2016. With airliners attempting to cut their price in order to compete with each other, led to lower revenues. Terrorist attacks, such as the Paris attacks and Brussels bombings (Nov 2015 - Mar 2016) could have contributed to this as well due to increased fear of travel.

The second major structural break, which landed the ratio below zero, was in 2020. This is most likely due to COVID-19-related concerns. Airliners were among the most affected by this, due to health and safety restrictions. Besides a quick rise and fall around Q2-Q3 of 2022, the portfolio has performed either negatively or low. Over all, this plot shows moderate returns at most, with the highest likelihood being low with a higher trend towards negative returns. Essentially, I can interpret that there is more risk than reward in this portfolio.