# Load packages
# Core
library(tidyverse)
library(tidyquant)
Collect individual returns into a portfolio by assigning a weight to each stock
five stocks: “SPY”, “EFA”, “IJS”, “EEM”, “AGG”
from 2012-12-31 to 2017-12-31
symbols <- c("SPY", "EFA", "IJS", "EEM", "AGG")
prices <- tq_get(x = symbols,
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
weight <- c(0.25,0.25,0.2,0.2,0.1)
weight
## [1] 0.25 0.25 0.20 0.20 0.10
w_tbl <- tibble(symbols,weight)
w_tbl
## # A tibble: 5 × 2
## symbols weight
## <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 <- portfolio_returns_tbl %>%
tq_performance(Ra = portfolio.returns,
performance_fun = table.Stats) %>%
select(Stdev) %>%
mutate(tq_sd = round(Stdev, 3))
portfolio_sd
## # A tibble: 1 × 2
## Stdev tq_sd
## <dbl> <dbl>
## 1 0.0235 0.024
#mean of portfolio returns
portfoliomean <- mean(portfolio_returns_tbl$portfolio.returns)
portfoliomean
## [1] 0.005899131
#Expected Return 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 sd
add_row(tibble(asset = "Portfolio",
Mean = portfoliomean,
Stdev = portfolio_sd$tq_sd))
sd_mean_tbl
## # A tibble: 6 × 3
## asset Mean Stdev
## <chr> <dbl> <dbl>
## 1 AGG 0.0017 0.0086
## 2 EEM 0.0028 0.0419
## 3 EFA 0.006 0.0326
## 4 IJS 0.0119 0.0396
## 5 SPY 0.0121 0.0272
## 6 Portfolio 0.00590 0.024
sd_mean_tbl %>%
ggplot(aes(x = Stdev,
y = Mean,
color = asset)) +
geom_point() +
ggrepel::geom_label_repel(aes(label = asset))
rollingsd_table <- portfolio_returns_tbl %>%
tq_mutate(select = portfolio.returns,
mutate_fun = rollapply,
width = 24,
FUN = sd,
col_rename = "rollingsd") %>%
na.omit() %>%
select(date, rollingsd)
rollingsd_table
## # A tibble: 37 × 2
## date rollingsd
## <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
rollingsd_table %>%
ggplot(aes( x = date,
y = rollingsd,)) +
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))
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 performs at around average compared to the contributing assets, as expected. Holdings such as SPY and IJS drive the upside and volatility of the portfolio, while AGG brings the average return and Standard deviation down. With a longer time horizon it would be wiser to invest heavier in the higher returning assets, SPY and IJS, while if the funds are more crucial in the short term, AGG would be a wiser investment.