# Load packages

# Core
library(tidyverse)
library(tidyquant)

Goal

Collect individual returns into a portfolio by assigning a weight to each stock

five stocks: “BAC”, “NOK”, “NVDA”, “F”, “T”

from 2012-12-31 to 2017-12-31

1 Import stock prices

symbols <- c("BAC", "NOK", "NVDA", "F", "T")

prices <- tq_get(x = symbols,
                 get = "stock.prices",
                 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 <- asset_returns_tbl %>% distinct(asset) %>% pull()
symbols
## [1] "BAC"  "F"    "NOK"  "NVDA" "T"
# weights
weights <- c(0.2, 0.2, 0.2, 0.2, 0.2)
weights
## [1] 0.2 0.2 0.2 0.2 0.2
w_tbl <- tibble(symbols, weights)
w_tbl
## # A tibble: 5 × 2
##   symbols weights
##   <chr>     <dbl>
## 1 BAC         0.2
## 2 F           0.2
## 3 NOK         0.2
## 4 NVDA        0.2
## 5 T           0.2

4 Build a portfolio

# tq_portfolio

portfolio_returns_tbl <- asset_returns_tbl %>%
    
    tq_portfolio(assets_col = asset,
                 returns_col = returns,
                 weights = w_tbl,
                 rebalence_on = "months")

portfolio_returns_tbl
## # A tibble: 60 × 2
##    date       portfolio.returns
##    <date>                 <dbl>
##  1 2013-01-31           0.00459
##  2 2013-02-28          -0.00659
##  3 2013-03-28           0.0117 
##  4 2013-04-30           0.0383 
##  5 2013-05-31           0.0494 
##  6 2013-06-28          -0.00677
##  7 2013-07-31           0.0634 
##  8 2013-08-30          -0.0208 
##  9 2013-09-30           0.103  
## 10 2013-10-31           0.0530 
## # ℹ 50 more rows

5 Calculate Standard Deviation

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.0516 0.0516
# Mean of Portfolio returns
portfolio_mean_tidyquant_builtin_percent <- mean(portfolio_returns_tbl$portfolio.returns)

portfolio_mean_tidyquant_builtin_percent
## [1] 0.02365261

6 Plot

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(asset, ArithmeticMean, Stdev) %>%
    rename(Mean = ArithmeticMean) %>%
    ungroup() %>%
    mutate(Stdev = Stdev * 100,
           Mean = Mean * 100) %>%

    # Add portfolio sd
    add_row(tibble(asset = "Portfolio",
                   Mean = portfolio_mean_tidyquant_builtin_percent * 100,
                   Stdev = portfolio_sd_tidyquant_builtin_percent$tq_sd))

sd_mean_tbl
## # A tibble: 6 × 3
##   asset      Mean   Stdev
##   <chr>     <dbl>   <dbl>
## 1 BAC        1.64  7.3   
## 2 F          0.31  5.45  
## 3 NOK        0.56 10.5   
## 4 NVDA       4.71  8.81  
## 5 T          0.81  4.66  
## 6 Portfolio  2.37  0.0516
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_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.0344
##  2 2015-01-30     0.0377
##  3 2015-02-27     0.0397
##  4 2015-03-31     0.0415
##  5 2015-04-30     0.0414
##  6 2015-05-29     0.0408
##  7 2015-06-30     0.0415
##  8 2015-07-31     0.0400
##  9 2015-08-31     0.0406
## 10 2015-09-30     0.0356
## # ℹ 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? Would you invest all of your money in any of the individual stocks instead of the portfolio? Discuss both in terms of expected return and risk.

Overtime, I would expect my portfolio to have greater returns with less risk than the rest of my individual stocks. My portfolio has a higher return than every individual stock except for NVDA, but that stock came with great risk. NOK would be my least favorite choice because there is an incredible amount of risk (Stdev) and not enough return to make it worth it. I would invest all of my money into the collective portfolio because its risk is so low, but its returns are still very high because of NVDA.