Goal

Visualize and examine changes in the underlying trend in the downside risk of your portfolio in terms of kurtosis.

1. Import stock prices

symbols <- c("NVDA", "AAPL", "AMD", "GOOG", "INTC")

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 %>%
  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 weights to each asset

symbols <- asset_returns_tbl %>% distinct(asset) %>% pull()
weights <- c(0.25, 0.25, 0.2, 0.2, 0.1)
w_tbl <- tibble(symbols, weights)
w_tbl
## # A tibble: 5 × 2
##   symbols weights
##   <chr>     <dbl>
## 1 AAPL       0.25
## 2 AMD        0.25
## 3 GOOG       0.2 
## 4 INTC       0.2 
## 5 NVDA       0.1

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")

head(portfolio_returns_tbl)
## # A tibble: 6 × 2
##   date        returns
##   <date>        <dbl>
## 1 2013-01-31 -0.00164
## 2 2013-02-28 -0.00108
## 3 2013-03-28  0.0152 
## 4 2013-04-30  0.0583 
## 5 2013-05-31  0.114  
## 6 2013-06-28 -0.0279

5. Compute kurtosis

portfolio_kurt_tidyquant_builtin_percent <- portfolio_returns_tbl %>%
  tq_performance(Ra = returns, performance_fun = table.Stats) %>%
  select(Kurtosis)

portfolio_kurt_tidyquant_builtin_percent
## # A tibble: 1 × 1
##   Kurtosis
##      <dbl>
## 1    0.337

6. Plot: Rolling Kurtosis

window <- 24

rolling_kurt_tbl <- portfolio_returns_tbl %>%
  tq_mutate(select     = returns,
            mutate_fun = rollapply,
            width      = window,
            FUN        = kurtosis,
            col_rename = "kurt") %>%
  na.omit() %>%
  select(-returns)

rolling_kurt_tbl %>%
  ggplot(aes(x = date, y = kurt)) +
  geom_line(color = "cornflowerblue") +
  scale_y_continuous(breaks = seq(from = 0, to = 5, by = 0.5)) + 
  scale_x_date(breaks = scales::pretty_breaks(n = 7)) +
  theme(plot.title = element_text(hjust = 0.5)) +
  labs(x = NULL, 
       y = "Kurtosis",
       title = paste0("Rolling ", window, " Month Kurtosis")) +
  annotate(geom = "text", 
           x = as.Date("2016-07-01"), y = 3, 
           size = 5, color = "red",
           label = "Downside risk skyrocketed toward the end of 2017")