# Load packages

# Core
library(tidyverse)
library(tidyquant)

Goal

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

Choose your stocks.

from 2012-12-31 to present

1 Import stock prices

symbols <- c("TSLA", "NVDA", "AMZN", "AAPL", "MSFT")
prices <- tq_get(x    = symbols,
                 get = "stock.prices",
                 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] "AAPL" "AMZN" "MSFT" "NVDA" "TSLA"
#Weights
weights <- c(0.25, 0.25, 0.2, 0.2, 0.1)
weights
## [1] 0.25 0.25 0.20 0.20 0.10
w_tbl <- tibble(symbols, weights) 
w_tbl
## # A tibble: 5 × 2
##   symbols weights
##   <chr>     <dbl>
## 1 AAPL       0.25
## 2 AMZN       0.25
## 3 MSFT       0.2 
## 4 NVDA       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, 
                 reabalance_on = "months",
                 col_rename = "returns")

portfolio_returns_tbl
## # A tibble: 60 × 2
##    date        returns
##    <date>        <dbl>
##  1 2013-01-31 -0.00905
##  2 2013-02-28 -0.00289
##  3 2013-03-28  0.0204 
##  4 2013-04-30  0.0720 
##  5 2013-05-31  0.125  
##  6 2013-06-28 -0.00475
##  7 2013-07-31  0.0748 
##  8 2013-08-30  0.0683 
##  9 2013-09-30  0.0645 
## 10 2013-10-31 -0.00562
## # ℹ 50 more rows

5 Compute kurtosis

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

6 Plot: Rolling kurtosis

Distribution of portfolio returns

portfolio_returns_tbl %>%
    
    ggplot(aes(x = returns)) + 
    geom_histogram()

### Expected Return vs Risk

# Transform data
mean_kurt_tbl <- asset_returns_tbl %>%
    
    # Calculate mean returns and kurtosis for assets
    group_by(asset) %>%
    summarise(mean = mean(returns),
              kurt = kurtosis(returns)) %>%
ungroup()

# Add portfolio stats
add_row(portfolio_returns_tbl %>%
    summarise(mean = mean(returns),
              kurt = kurtosis(returns)) %>%
    mutate(asset = "Portfolio"))
## # A tibble: 2 × 3
##      mean   kurt asset    
##     <dbl>  <dbl> <chr>    
## 1  0.0296 -0.210 Portfolio
## 2 NA      NA     <NA>
# Plot
mean_kurt_tbl %>%
    
    ggplot(aes(x = kurt, y = mean)) +
geom_point() +
ggrepel::geom_text_repel(aes(label = asset, color = asset)) + 
    
    # Formatting
    theme(legend.position = "none") +
    scale_y_continuous(labels = scales::percent_format(accuracy = 0.1)) +
    #Labeling
    labs(x = "Kurtosis",
         y = "Expected Returns")

### Rolling 24 Month Kurtosis

# Assign a value for window
window = 24

# Transform data: Calculate 24 months rolling kurtosis
rolling_kurt_tbl <- portfolio_returns_tbl %>%
    
    tq_mutate(select = returns, 
              mutate_fun = rollapply, 
              width = window, 
              FUN = kurtosis,
              col_rename = "kurt") %>%
    na.omit() %>%
    select(-returns)

# Plot
rolling_kurt_tbl %>%
    
    ggplot(aes(x= date, y = kurt)) +
    geom_line(color = "cornflowerblue") +
    
    # Formatting
    scale_y_continuous(breaks = seq(-1, 4, 0.5)) +
    scale_x_date(breaks = scales::pretty_breaks(n = 7)) +
    theme(plot.title = element_text(hjust = 0.5)) +
    
    # Labeling
    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 = str_glue(""))

Has the downside risk of your portfolio increased or decreased over time? Explain using the plot you created. You may also refer to the skewness of the returns distribution you plotted in the previous assignment.

Over time, the donwside risk of my portfolio has increased over time because