# Load packages
# Core
library(tidyverse)
library(tidyquant)
Visualize expected returns and risk to make it easier to compare the performance of multiple assets and portfolios.
Choose your stocks.
from 2012-12-31 to 2017-12-31
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
portfolio_returns_tbl <- asset_returns_tbl %>%
tq_portfolio(assets_col = asset,
returns_col = returns,
weights = w_tbl,
rebalance_on = "months")
portfolio_returns_tbl
## # A tibble: 60 × 2
## date portfolio.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_sd_tidyquant_builtin_percent <- portfolio_returns_tbl %>%
tq_performance(Ra = portfolio.returns,
performance_fun = table.Stats) %>%
select(Stdev) %>%
mutate(tq_sd = round(Stdev, 4))
portfolio_sd_tidyquant_builtin_percent
## # A tibble: 1 × 2
## Stdev tq_sd
## <dbl> <dbl>
## 1 0.0477 0.0477
# Mean of portfolio returns
portfolio_mean_tidyquant_builtin_percent <- mean(portfolio_returns_tbl$portfolio.returns)
portfolio_mean_tidyquant_builtin_percent
## [1] 0.02648772
# Expected Returns vs Risk
sd_mean_tbl <- asset_returns_tbl %>%
group_by(asset) %>%
tq_performance(Ra = returns,
performance_fun = table.Stats) %>%
select(Mean = ArithmeticMean, Stdev) %>%
ungroup() %>%
# Add Portfolio Standard Deviation
add_row(tibble(asset = "Portfolio",
Mean = portfolio_mean_tidyquant_builtin_percent,
Stdev = portfolio_sd_tidyquant_builtin_percent$tq_sd))
sd_mean_tbl
## # A tibble: 6 × 3
## asset Mean Stdev
## <chr> <dbl> <dbl>
## 1 AAPL 0.015 0.0695
## 2 AMZN 0.0257 0.0739
## 3 NVDA 0.0471 0.0881
## 4 PG 0.0077 0.0372
## 5 TSLA 0.037 0.145
## 6 Portfolio 0.0265 0.0477
sd_mean_tbl %>%
ggplot(aes(x = Stdev, y = Mean, color = asset)) +
geom_point() +
ggrepel::geom_text_repel(aes(label = asset))
rolling_sd_tbl <- portfolio_returns_tbl %>%
tq_mutate(select = portfolio.returns,
mutate_fun = rollapply,
width = 24,
FUN = sd,
col_rename = "rolling_sd") %>%
na.omit() %>%
select(date, rolling_sd)
rolling_sd_tbl
## # A tibble: 37 × 2
## date rolling_sd
## <date> <dbl>
## 1 2014-12-31 0.0529
## 2 2015-01-30 0.0532
## 3 2015-02-27 0.0531
## 4 2015-03-31 0.0552
## 5 2015-04-30 0.0550
## 6 2015-05-29 0.0488
## 7 2015-06-30 0.0490
## 8 2015-07-31 0.0459
## 9 2015-08-31 0.0465
## 10 2015-09-30 0.0460
## # ℹ 27 more rows
rolling_sd_tbl %>%
ggplot(aes(x = date, y = rolling_sd)) +
geom_line(color = "cornflowerblue") +
# Formatting
scale_y_continuous(labels = scales::percent_format()) +
# Labeling
labs(x = NULL,
y = NULL,
title = "24-Month Rolling Volatility") +
theme(plot.title = element_text(hjust = 0.5))
Question:
How should you expect your portfolio to perform relative to its assets in the portfolio? Would you invest all your money in any of the individual stocks instead of the portfolio? Discuss both in terms of expected return and risk.
Answer:
The diversified portfolio should deliver steadier returns with lower risk than any single stock because diversification smooths the ride. I wouldn’t put all my money in one stock like TSLA or NVDA since their risk is much higher. The portfolio offers a solid expected return for much less volatility, which is the safer choice.