# Load packages

# Core
library(tidyverse)
library(tidyquant)

Goal

Collect individual returns into a portfolio by assigning a weight to each stock

five stocks: “SPY”, “EFA”, “IJS”, “EEM”, “AGG”

from 2012-12-31 to 2017-12-31

1 Import stock prices

symbols <- c("NVDA", "NFLX", "MSFT", "TSLA", "SPY")
prices <- tq_get(x = symbols,
                 from = "2012-12-31",
                 to = "2017-12-31")

2 Convert prices to returns

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

#symbols
symbols <- asset_returns_tbl %>% distinct (asset) %>% pull()
symbols
## [1] "MSFT" "NFLX" "NVDA" "SPY"  "TSLA"
#weights
weight <- c(0.25,0.25,0.2,0.2,0.1)
weight
## [1] 0.25 0.25 0.20 0.20 0.10
w_tbl <- tibble(symbols,weight)
w_tbl
## # A tibble: 5 × 2
##   symbols weight
##   <chr>    <dbl>
## 1 MSFT      0.25
## 2 NFLX      0.25
## 3 NVDA      0.2 
## 4 SPY       0.2 
## 5 TSLA      0.1

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.172 
##  2 2013-02-28  0.0404
##  3 2013-03-28  0.0273
##  4 2013-04-30  0.123 
##  5 2013-05-31  0.101 
##  6 2013-06-28 -0.0193
##  7 2013-07-31  0.0544
##  8 2013-08-30  0.0733
##  9 2013-09-30  0.0508
## 10 2013-10-31  0.0113
## # ℹ 50 more rows

5 Calculate Sharpe Ratio

#Define RFR
rfr <- 0.0003
portfolio_sharpe <- portfolio_returns_tbl %>%
  
      tq_performance(Ra =                returns, 
                   performance_fun = SharpeRatio,
                   Rf =                rfr,
                   FUN = "StdDev")
portfolio_sharpe
## # A tibble: 1 × 1
##   `SharpeRatio(Rf=0%,p=95%)`
##                        <dbl>
## 1                      0.573

6 Plot

Histogram of Returns

portfolio_returns_tbl %>%
    ggplot(aes(x = returns)) +
    geom_histogram(binwidth = 0.01, fill = "cornflowerblue", alpha = 0.5) + 
    geom_vline(xintercept = rfr, color = "green", size = 1) +
    annotate(geom = "text", x = rfr, y = 13, label = "risk free rate",
             angle = 90) +
    labs(y = "count")

Scatterplot

portfolio_returns_tbl %>%
    mutate(excess_returns = if_else(returns > rfr,
                                    "rfr_above",
                                    "rfr_below")) %>%
    
    # Plot
    ggplot(aes(x = date, y = returns)) +
    geom_point(aes(color = excess_returns)) +
    geom_hline(yintercept = rfr, color = "cornflowerblue", linetype = 3, size = 1) +
    geom_vline(xintercept = as.Date("2016-11-01"),
               color = "cornflowerblue", size = 1) +
    
    theme(legend.position = "none") +

    annotate( geom = "text",
              x = as.Date("2016-12-01"), y = -0.04, label = "Election", size = 5, angle = 90) +
    annotate( geom = "text",
              x = as.Date("2017-05-01"), y = -0.01, label = str_glue("No Returns below RFR after the 2016 election"), color = "green") +
        labs(y = "monthly returns", x = NULL)

Rolling Sharpe Ratio

#Create custom function
Rolling_Sharpe <- function(data) {
   rolling_SR <-  SharpeRatio(R = data,
                Rf = rfr, 
                FUN = "StdDev")
    return(rolling_SR)
}
#Set Window

window <-  24

rolling_sr_tbl <- portfolio_returns_tbl %>%
    tq_mutate(select = returns,mutate_fun = rollapply,
              width = window,
              FUN = Rolling_Sharpe,
              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.620
##  2 2015-01-30        0.576
##  3 2015-02-27        0.597
##  4 2015-03-31        0.474
##  5 2015-04-30        0.475
##  6 2015-05-29        0.442
##  7 2015-06-30        0.443
##  8 2015-07-31        0.449
##  9 2015-08-31        0.391
## 10 2015-09-30        0.344
## # ℹ 27 more rows
rolling_sr_tbl %>%
    ggplot(aes(x = date, y = `Rolling SR`)) +
    geom_line(color = "cornflowerblue") +
    labs(x = NULL, 
         y = "Rolling Sharpe Ratio") +
    annotate(geom = "text", 
             x = as.Date("2016-06-01"), y = 0.5, label = "This portfolio has done well since 2016",
             color = "red", size = 2)

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?
This portfolio has underperformed over the period of time examined, returning a negative result. The largest structural break came early 2016 where the downtrend reversed and the average monthly return rose significantly and the volatilty decreased. The initial downward movement can be partially attributed to low oil prices and Brexit vote/weakening currencies in the UK according to Wikipedia. The Wall Street Journal suggests the recovery was largely due to strong U.S. economic data that compensated for the negative global factors.