# Load packages

# Core
library(tidyverse)
library(tidyquant)

Goal

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

1 Import stock prices

symbols <- c("RTX", "GD", "LMT", "BA")
stock_prices <- tq_get(x    = symbols, 
                 get  = "stock.prices", 
                 from = "2012-12-31", 
                 to   = "2017-12-31")

2 Convert prices to returns (monthly)

ar_table <- stock_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 (change the weigting scheme)

# symbols
symbols <- ar_table %>% distinct(asset) %>% pull()
symbols
## [1] "BA"  "GD"  "LMT" "RTX"
# weights
weights <- c(0.35, 0.30, 0.20, 0.15)
weights
## [1] 0.35 0.30 0.20 0.15
w_tbl <- tibble(symbols, weights)
w_tbl
## # A tibble: 4 × 2
##   symbols weights
##   <chr>     <dbl>
## 1 BA         0.35
## 2 GD         0.3 
## 3 LMT        0.2 
## 4 RTX        0.15

4 Build a portfolio

portfolio_returns_table <- ar_table %>%
    
    tq_portfolio(assets_col   = asset, 
                 returns_col  = returns, 
                 weights      = w_tbl, 
                 rebalance_on = "months")
portfolio_returns_table
## # A tibble: 60 × 2
##    date       portfolio.returns
##    <date>                 <dbl>
##  1 2013-01-31           -0.0224
##  2 2013-02-28            0.0349
##  3 2013-03-28            0.0727
##  4 2013-04-30            0.0405
##  5 2013-05-31            0.0642
##  6 2013-06-28            0.0184
##  7 2013-07-31            0.0764
##  8 2013-08-30           -0.0114
##  9 2013-09-30            0.0773
## 10 2013-10-31            0.0423
## # … with 50 more rows

5 Compute Standard Deviation

portfolio_sd <- portfolio_returns_table %>% 
    
    tq_performance(Ra = portfolio.returns,
                   performance_fun = table.Stats) %>%
    
    select(Stdev) %>%
    mutate(tq_sd = round(Stdev, 4))

portfolio_sd
## # A tibble: 1 × 2
##    Stdev  tq_sd
##    <dbl>  <dbl>
## 1 0.0367 0.0367
# Mean of portfolio returns
portfolio_mean <-  mean(portfolio_returns_table$portfolio.returns)

portfolio_mean
## [1] 0.02068666

6 Plot: Expected Returns versus Risk

sd_mean_table <- ar_table %>% 
    
    group_by(asset) %>% 
    
    tq_performance(Ra = returns, 
                   performance_fun = table.Stats) %>%
    select(Mean = ArithmeticMean, Stdev) %>% 
    ungroup() %>% 
    
    # Add Porfolio SD
    add_row(tibble(asset = "Portfolio", 
                   Mean = portfolio_mean, 
                   Stdev = portfolio_sd$tq_sd))

sd_mean_table
## # A tibble: 5 × 3
##   asset       Mean  Stdev
##   <chr>      <dbl>  <dbl>
## 1 BA        0.0249 0.0618
## 2 GD        0.0197 0.0422
## 3 LMT       0.0234 0.0387
## 4 RTX       0.0093 0.0468
## 5 Portfolio 0.0207 0.0367
sd_mean_table %>%
    
    ggplot(aes(x = Stdev, y = Mean, color = asset)) + 
    geom_point() + 
    ggrepel::geom_text_repel(aes(label = asset))

24 Month Rolling Volatility

rolling_sd_table <- portfolio_returns_table %>% 
    
    tq_mutate(select     = portfolio.returns, 
              mutate_fun = rollapply, 
              width      = 24, 
              FUN        = sd, 
              col_rename = "rolling_sd") %>% 
    
    na.omit() %>% 
    select(date, rolling_sd)

rolling_sd_table
## # A tibble: 37 × 2
##    date       rolling_sd
##    <date>          <dbl>
##  1 2014-12-31     0.0338
##  2 2015-01-30     0.0322
##  3 2015-02-27     0.0324
##  4 2015-03-31     0.0321
##  5 2015-04-30     0.0341
##  6 2015-05-29     0.0330
##  7 2015-06-30     0.0336
##  8 2015-07-31     0.0316
##  9 2015-08-31     0.0353
## 10 2015-09-30     0.0330
## # … with 27 more rows
rolling_sd_table %>% 
    
    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 = .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.

I would expect my portfolio to perform not that well to be honest. While the standard deviation may be low, the mean is fairly high. The market would be have to be in perfect conditions for this portfolio to work. It probably does not halp that all of these stocks are from the aerospace and defense sector. When one moves, the rest will most likely move in the same direction. If I had to invest all my money, I would put it into Raytheon (RTX). This stock has a moderate standard deviation and a low mean. This means that the risk is moderate, which also means that the potential return is moderate. The Boeing (BA) stock is kind of an outlier in this portfolio. This stock is way to risky and throws off the balance of the portfolio even being only 15% of the portfolio