# Load packages

# Core
library(tidyverse)
library(tidyquant)

Goal

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

1 Import stock prices

symbols <- c("SPY", "EFA", "IJS", "EEM", "AGG")
prices <- tq_get(x = symbols,
                 from = "2012-12-31",
                 to = "2017-12-31")

2 Convert prices to returns

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"))

3 Assign a weight to each asset

#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

4 Build a portfolio

#?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

Calculate Standard Deviation

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

6 Plot

Expected Return vs Risk

#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))

24 Month Rolling Volatility

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.