# Load packages
# Core
library(tidyverse)
library(tidyquant)
Collect individual returns into a portfolio by assigning a weight to each stock
five stocks: “APPL”, “GOOG”, “NVDA”, “NFLX”, “UBER”
from 2012-12-31 to 2017-12-31
symbols <- c("SPY", "EFA", "IJS", "EEM", "AGG")
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] "AGG" "EEM" "EFA" "IJS" "SPY"
#weights
weights <- c(0.25, 0.25, 0.2, 0.2, 0.1)
weights
## [1] 0.25 0.25 0.20 0.20 0.10
w_tbl <- tibble(symbols, weights)
w_tbl
## # A tibble: 5 × 2
## symbols weights
## <chr> <dbl>
## 1 AGG 0.25
## 2 EEM 0.25
## 3 EFA 0.2
## 4 IJS 0.2
## 5 SPY 0.1
?tq_portfolio
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.0204
## 2 2013-02-28 -0.00239
## 3 2013-03-28 0.0121
## 4 2013-04-30 0.0174
## 5 2013-05-31 -0.0128
## 6 2013-06-28 -0.0247
## 7 2013-07-31 0.0321
## 8 2013-08-30 -0.0224
## 9 2013-09-30 0.0511
## 10 2013-10-31 0.0301
## # ℹ 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.0235 0.0235
# Mean of portfolio returns
portfolio_mean_tidyquant_builtin_percent <- mean(portfolio_returns_tbl$portfolio.returns)
portfolio_mean_tidyquant_builtin_percent
## [1] 0.005899136
# 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() %>%
mutate(Stdev = Stdev * 100,
Mean = Mean * 100) %>%
# Add portfolio sd
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 AGG 0.17 0.86
## 2 EEM 0.28 4.19
## 3 EFA 0.6 3.26
## 4 IJS 1.19 3.96
## 5 SPY 1.21 2.72
## 6 Portfolio 0.00590 0.0235
sd_mean_tbl %>%
ggplot(aes(x = Stdev, y = Mean, color = asset)) +
geom_point() +
# ggrepel::geom_text_repel(aes(label = asset))+ # This line no longer works!
# Use the standard geom_text() and nudge the labels slightly instead:
geom_text(aes(label = asset),
vjust = 1.5, # Nudges labels down
hjust = 0.5, # Centers labels horizontally
size = 4) # Sets text size
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.0237
## 2 2015-01-30 0.0236
## 3 2015-02-27 0.0245
## 4 2015-03-31 0.0246
## 5 2015-04-30 0.0247
## 6 2015-05-29 0.0245
## 7 2015-06-30 0.0242
## 8 2015-07-31 0.0238
## 9 2015-08-31 0.0262
## 10 2015-09-30 0.0247
## # ℹ 27 more rows
rolling_sd_tbl %>%
ggplot(aes(date, rolling_sd)) +
geom_line(color = "cornflowerblue") +
scale_y_continuous(labels = scales::percent) +
scale_x_date(breaks = scales::breaks_pretty(n=7))+
labs(title = "24-Month ROlling Volatility",
x = NULL,
y = NULL,) +
theme(plot.title = element_text(hjust = 0.5))
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.
The portfolio is expected to perform more consistently than any single asset, delivering a moderate return with lower volatility. While an individual stock like IJS or EEM might offer higher returns in some years, the associated risk makes them less attractive as a sole investment. Diversification allows the portfolio to balance growth potential and stability, making it a more prudent long-term choice than investing all your money in one asset.