# 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

# Choose stocks

symbols <- c("ROKU", "AAPL", "CL=F")

# Using tq_get() ----
prices <- tq_get(x    = symbols,
                 get  = "stock.prices",
                 from = "2012-12-31",
                 to   = "2017-12-31")

2 Convert prices to returns (monthly)

asset_returns_tbl <- prices %>%
  
  # Calculate monthly returns
  group_by(symbol) %>%
  tq_transmute(select     = adjusted,
               mutate_fun = periodReturn,
               period     = "monthly",
               type       = "log") %>%
  slice (-1) %>%
  ungroup() %>%
  
  # rename
  set_names(c("asset", "date", "returns"))

# period_returns = c("yearly", "quarterly", "monthly", "weekly")

3 Assign a weight to each asset (change the weigting scheme)

symbols <- asset_returns_tbl %>% distinct(asset) %>% pull()

w <- c(0.35,
       0.45,
       0.20)

w_tbl <- tibble(symbols, w)

4 Build a portfolio

portfolio_returns_rebalanced_monthly_tbl <- asset_returns_tbl %>%
  
  tq_portfolio(assets_col   = asset,
               returns_col  = returns,
               weights      = w_tbl,
               col_rename   = "returns",
               rebalance_on = "months")

portfolio_returns_rebalanced_monthly_tbl
## # A tibble: 60 × 2
##    date         returns
##    <date>         <dbl>
##  1 2013-01-31 -0.0275  
##  2 2013-02-28 -0.0348  
##  3 2013-03-28  0.0256  
##  4 2013-04-30 -0.0177  
##  5 2013-05-31  0.000528
##  6 2013-06-28 -0.0221  
##  7 2013-07-31  0.0841  
##  8 2013-08-30  0.0392  
##  9 2013-09-30 -0.0304  
## 10 2013-10-31  0.00525 
## # ℹ 50 more rows
# write_rds(portfolio_returns_rebalanced_monthly_tbl,
#           "00_data/Ch03_portfolio_returns_rebalanced_monthly_tbl.rds")

5 Compute Standard Deviation

portfolio_sd_tidyquant_builtin_percent <- portfolio_returns_rebalanced_monthly_tbl %>%
  
  tq_performance(Ra = returns,
                 Rb = NULL,
                 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.0517 0.0517
# Mean of portfolio returns
portfolio_mean_tidyquant_builtin_percent <-
  mean(portfolio_returns_rebalanced_monthly_tbl$returns)

portfolio_mean_tidyquant_builtin_percent
## [1] 0.004343072

6 Plot: Expected Returns versus Risk

Expected Returns vs Risk

# 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 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: 4 × 3
##   asset         Mean  Stdev
##   <chr>        <dbl>  <dbl>
## 1 AAPL       0.015   0.0695
## 2 CL=F      -0.007   0.0865
## 3 ROKU       0.223   0.518 
## 4 Portfolio  0.00434 0.0517
sd_mean_tbl %>%
  
  ggplot(aes(x = Stdev, y = Mean, color = asset)) +
  geom_point() +
  ggrepel::geom_text_repel(aes(label = asset))

24 Months Rolling Volatility

rolling_sd_tbl <-portfolio_returns_rebalanced_monthly_tbl %>%
  
  tq_mutate(select = 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.0420
##  2 2015-01-30     0.0419
##  3 2015-02-27     0.0427
##  4 2015-03-31     0.0427
##  5 2015-04-30     0.0478
##  6 2015-05-29     0.0479
##  7 2015-06-30     0.0478
##  8 2015-07-31     0.0505
##  9 2015-08-31     0.0496
## 10 2015-09-30     0.0501
## # ℹ 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))

How should you expect your portfolio to perform relative to its assets in the portfolio? I do not expect my portfolio to perform greatly relative to its assets. The portfolio does not have a combined large risk, which means that the return will most likely not be great.

Would you invest all your money in any of the individual stocks instead of the portfolio? Personally, I would never invest all my money in one individual stock instead of my entire portfolio, because the risk is too big. Instead, I would split my money up and invest in all the stocks, because this would result in a smaller risk. I don’t have too much money to waste, which means that I will not be taking the biggest risks when it comes to investing. Additionally, investing in multiple stocks will more often than not result in a greater return than investing in one individual stock, unless you are extremely lucky with the one stock you decide to invest in. However, if I was to only invest in one individual stock, it would be Roku, because Roku is the most exciting product right now, and it is the one with largest risk and possible returns. Discuss both in terms of expected return and risk.