# 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("X", "CMC", "ZEUS", "GOOG", "TSLA")
prices <- tq_get(x  = symbols,
    get = "stock.prices", 
     from = "2012-12-31")

2 Convert prices to returns (monthly)

asset_return_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 <- asset_return_tbl %>% distinct(asset) %>% pull()
symbols
## [1] "CMC"  "GOOG" "TSLA" "X"    "ZEUS"
weights <- c(0.3, 0.2, 0.3, 0.1, 0.10)
weights
## [1] 0.3 0.2 0.3 0.1 0.1
w_tbl <- tibble(symbols, weights)
w_tbl 
## # A tibble: 5 × 2
##   symbols weights
##   <chr>     <dbl>
## 1 CMC         0.3
## 2 GOOG        0.2
## 3 TSLA        0.3
## 4 X           0.1
## 5 ZEUS        0.1

4 Build a portfolio

portfolio_returns_tbl <- asset_return_tbl %>%
    
    tq_portfolio(assets_col = asset, 
                 returns_col = returns,
                 weights = w_tbl,
                 rebalance_on = "months", 
                 col_rename   = "returns")

portfolio_returns_tbl
## # A tibble: 143 × 2
##    date       returns
##    <date>       <dbl>
##  1 2013-01-31  0.0685
##  2 2013-02-28 -0.0250
##  3 2013-03-28  0.0228
##  4 2013-04-30  0.0651
##  5 2013-05-31  0.228 
##  6 2013-06-28  0.0130
##  7 2013-07-31  0.0974
##  8 2013-08-30  0.0440
##  9 2013-09-30  0.107 
## 10 2013-10-31  0.0170
## # ℹ 133 more rows

5 Compute kurtosis

portfolio_kurt_tidyquant_builitin_percent <- portfolio_returns_tbl %>%

 tq_performance(Ra = returns,  
                performance_fun = table.Stats) %>%
 
   select(Kurtosis) 

portfolio_kurt_tidyquant_builitin_percent
## # A tibble: 1 × 1
##   Kurtosis
##      <dbl>
## 1    0.215

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(-1, 4, .5)) + 
    scale_x_date(breaks = scales::pretty_breaks(n = 7)) + 
    theme(plot.title = element_text(hjust = .5)) + 
    
    labs(x = NULL,
         y = "Kurtosis",
         title = paste("Rolling", window, "month Kurtosis")) +

annotate(geom = "text", x = as.Date("2021-12-01"), y = 3,
         size = 4, color = "red", 
         label = str_glue("Downside risk rose toward the begining of 2016
                           then lowered after about a year 
                          and again skyrocketed in 2018-2019 "))

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.

It has increased slightly over time but has fluxuated a but especially around 2016-2017 and 2018-2019. An increase in kurtosis means higher deviation and risk.