# 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("AMZN", "MSFT", "HD", "WMT")

prices <- tq_get(x    = symbols, 
                 get  = "stock.prices", 
                 from = "2012-12-31",
                 to   = "2022-10-26")
prices
## # A tibble: 9,892 × 8
##    symbol date        open  high   low close   volume adjusted
##    <chr>  <date>     <dbl> <dbl> <dbl> <dbl>    <dbl>    <dbl>
##  1 AMZN   2012-12-31  12.2  12.6  12.1  12.5 68380000     12.5
##  2 AMZN   2013-01-02  12.8  12.9  12.7  12.9 65420000     12.9
##  3 AMZN   2013-01-03  12.9  13.0  12.8  12.9 55018000     12.9
##  4 AMZN   2013-01-04  12.9  13.0  12.8  13.0 37484000     13.0
##  5 AMZN   2013-01-07  13.1  13.5  13.1  13.4 98200000     13.4
##  6 AMZN   2013-01-08  13.4  13.4  13.2  13.3 60214000     13.3
##  7 AMZN   2013-01-09  13.4  13.5  13.3  13.3 45312000     13.3
##  8 AMZN   2013-01-10  13.4  13.4  13.1  13.3 57268000     13.3
##  9 AMZN   2013-01-11  13.3  13.4  13.2  13.4 48266000     13.4
## 10 AMZN   2013-01-14  13.4  13.7  13.4  13.6 85500000     13.6
## # … with 9,882 more rows

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"))
asset_returns_tbl
## # A tibble: 472 × 3
##    asset date        returns
##    <chr> <date>        <dbl>
##  1 AMZN  2013-01-31  0.0567 
##  2 AMZN  2013-02-28 -0.00464
##  3 AMZN  2013-03-28  0.00837
##  4 AMZN  2013-04-30 -0.0488 
##  5 AMZN  2013-05-31  0.0589 
##  6 AMZN  2013-06-28  0.0311 
##  7 AMZN  2013-07-31  0.0813 
##  8 AMZN  2013-08-30 -0.0696 
##  9 AMZN  2013-09-30  0.107  
## 10 AMZN  2013-10-31  0.152  
## # … with 462 more rows

3 Assign a weight to each asset (change the weigting scheme)

# symbols
symbols <- asset_returns_tbl %>% distinct(asset) %>% pull() 
symbols
## [1] "AMZN" "HD"   "MSFT" "WMT"
# weights
weights <- c(0.30, 0.30, 0.15, 0.25)
weights
## [1] 0.30 0.30 0.15 0.25
w_tbl <- tibble(symbols, weights)
w_tbl
## # A tibble: 4 × 2
##   symbols weights
##   <chr>     <dbl>
## 1 AMZN       0.3 
## 2 HD         0.3 
## 3 MSFT       0.15
## 4 WMT        0.25

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

portfolio_returns_tbl
## # A tibble: 118 × 2
##    date        returns
##    <date>        <dbl>
##  1 2013-01-31  0.0510 
##  2 2013-02-28  0.0117 
##  3 2013-03-28  0.0295 
##  4 2013-04-30  0.0317 
##  5 2013-05-31  0.0397 
##  6 2013-06-28  0.00350
##  7 2013-07-31  0.0295 
##  8 2013-08-30 -0.0453 
##  9 2013-09-30  0.0418 
## 10 2013-10-31  0.0722 
## # … with 108 more rows

5 Compute kurtosis

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

portfolio_skew_tidyquant_builtin_percent
## # A tibble: 1 × 1
##   Kurtosis
##      <dbl>
## 1   0.0975

6 Plot: Rolling kurtosis

# Assign a value for window
window = 24 

# Transform data: calculate 24 month 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 = "purple") + 
    
    # 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("2012-12-31"), 
             y = 3, 
             color = "blue", 
             label = str_glue("Kurtosis went down from 2015-2016, then went up until 2020 and slowly went down towards 2022."))

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.

The downside risk of my portfolio has increased and decresed over time. It increased up to 2019, then started to decrease the years following 2019. This can also be interpreted with the negative skewness of my portfolio.