# 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 ("DLR", "NVDA", "GOOG", "MSFT", "AMZN")
prices <- tq_get(x = symbols,
get = "stockprices",
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] "AMZN" "DLR" "GOOG" "MSFT" "NVDA"
# 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 AMZN 0.2
## 2 DLR 0.2
## 3 GOOG 0.2
## 4 MSFT 0.2
## 5 NVDA 0.2
# ?tq_portfolio
portfolio_returns_tbl <- asset_returns_tbl %>%
tq_portfolio(assets_col = asset,
returns_col = returns,
weights = w_tbl,
rebalance_on = "quarters",
col_rename = "returns")
portfolio_returns_tbl
## # A tibble: 60 × 2
## date returns
## <date> <dbl>
## 1 2013-01-31 0.0301
## 2 2013-02-28 0.0201
## 3 2013-03-28 0.0101
## 4 2013-04-30 0.0516
## 5 2013-05-31 0.0164
## 6 2013-06-28 0.00167
## 7 2013-07-31 -0.0124
## 8 2013-08-30 -0.00816
## 9 2013-09-30 0.0336
## 10 2013-10-31 0.0489
## # ℹ 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.845
# 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, 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 = 4, color = "red",
label = "Temporary Increase in Potential for Larger distributions
toward the end of 2015")
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. Overall, I would say that the downside risk of my portfolio remained relatively low and did not substantially increase over time. Looking at the plot, kurtosis briefly increased around the end of 2015, indicating a temporary increase in potential for larger distribution. However, it never exceeded 3, meaning thinner tails -> fewer extreme values. After the spike, kurtosis decreased again, indicating fewer larger distribution. Additionally, my portfolio had moderately positive skewness (+0.70), suggesting a greater likelihood of larger positive returns rather than larger negative returns. Therefore, despite the temporary increase in kurtosis, my portfolio did not show a substantial increase in downside risk over the period.