# 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("JNJ", "MMM", "AMZN", "IBM", "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] "AMZN" "IBM"  "JNJ"  "MMM"  "MSFT"
# 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 AMZN       0.25
## 2 IBM        0.25
## 3 JNJ        0.2 
## 4 MMM        0.2 
## 5 MSFT       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.0580 
##  2 2013-02-28  0.0146 
##  3 2013-03-28  0.0382 
##  4 2013-04-30 -0.00471
##  5 2013-05-31  0.0391 
##  6 2013-06-28 -0.0122 
##  7 2013-07-31  0.0486 
##  8 2013-08-30 -0.0474 
##  9 2013-09-30  0.0410 
## 10 2013-10-31  0.0598 
## # … with 50 more rows

5 Calculate 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.0807

6 Plot

24-month rolling Kurtosis

window = 24

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

rolling_kurt_table%>%
    ggplot(aes(x = date, y = Kurt)) +
    geom_line(color = "cornflowerblue") +
    
    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))+
    
    labs(x = NULL, y = "Kurtosis",
         title = paste0("Rolling ", window, " month kurtosis")) +
    
    annotate(geom = "text", 
             x = as.Date("2016-07-01"), 
             y = 3,
             size = 3,
             color = "red",
             label = str_glue("
             The downside risk went higher 
                              during 2016 and then back down again only to 
                              rise until its peak in late 2017"))

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.