# Load packages
# Core
library(tidyverse)
library(tidyquant)
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
symbols <- c("TSLA", "AMZN", "AAPL", "NVDA", "PG")
prices <- tq_get(x = symbols,
get. = "stock.prices",
from = "2012-12-31",
to = "2017-12-31")
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"))
# symbols
symbols <- asset_returns_tbl %>% distinct(asset) %>% pull()
symbols
## [1] "AAPL" "AMZN" "NVDA" "PG" "TSLA"
# weights
weights <- c(0.2, 0.2, 0.2, 0.2, 0.2)
weights
## [1] 0.2 0.2 0.2 0.2 0.2
w_tbl <- tibble(symbols, weights)
w_tbl
## # A tibble: 5 × 2
## symbols weights
## <chr> <dbl>
## 1 AAPL 0.2
## 2 AMZN 0.2
## 3 NVDA 0.2
## 4 PG 0.2
## 5 TSLA 0.2
#?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.0226
## 2 2013-02-28 -0.0105
## 3 2013-03-28 0.0240
## 4 2013-04-30 0.0760
## 5 2013-05-31 0.146
## 6 2013-06-28 -0.00567
## 7 2013-07-31 0.103
## 8 2013-08-30 0.0473
## 9 2013-09-30 0.0486
## 10 2013-10-31 0.0208
## # ℹ 50 more rows
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.126
# 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 = "cornflowerblue") +
# Formatting
scale_y_continuous(breaks = seq(-1, 1.5, 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("2017-01-01"),
y = 0.5,
size = 5,
color = "red",
label = str_glue("The kurtosis for the portfolio dropped
dramatically halfway through 2015,
and remained relatively stable after that,
increasing slowly."))
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.Talk about skeweness (calculated last week) and kurtosis.
The downside risk of the portfolio has decreased over time. The rolling 24-month kurtosis plot shows that after a sharp decline in 2015, the portfolio’s kurtosis stabilized around zero and gradually increased, indicating a shift toward a more normal return distribution with fewer extreme outliers.
The skewness plot supports this trend. Most assets, including Amazon and PG, show skewness values below 0.5, meaning their return distributions are approximately symmetric and not prone to large, one-sided movements. The portfolio’s overall skewness lies just above zero, implying a balanced risk profile with limited downside asymmetry.
Together, these metrics suggest the portfolio’s return distribution has become more stable and less fat-tailed over time, reflecting lower downside risk and more consistent performance.