# 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("WMT", "TGT", "COST")

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 %>%
   
    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 <- asset_returns_tbl %>% distinct(asset) %>% pull()
symbols
## [1] "COST" "TGT"  "WMT"
weights <- c(0.35, 0.3, 0.25)
weights
## [1] 0.35 0.30 0.25
w_tbl <- tibble(symbols, weights)
w_tbl
## # A tibble: 3 × 2
##   symbols weights
##   <chr>     <dbl>
## 1 COST       0.35
## 2 TGT        0.3 
## 3 WMT        0.25

4 Build a 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.0250  
##  2 2013-02-28          0.0144  
##  3 2013-03-28          0.0569  
##  4 2013-04-30          0.0262  
##  5 2013-05-31         -0.00611 
##  6 2013-06-28         -0.000959
##  7 2013-07-31          0.0426  
##  8 2013-08-30         -0.0645  
##  9 2013-09-30          0.0167  
## 10 2013-10-31          0.0215  
## # ℹ 50 more rows

5 Compute 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.0353 0.0353
portfolio_mean_tidyquant_builtin_percent <- mean(portfolio_returns_tbl$portfolio.returns)

portfolio_sd_tidyquant_builtin_percent
## # A tibble: 1 × 2
##    Stdev  tq_sd
##    <dbl>  <dbl>
## 1 0.0353 0.0353

6 Plot: Expected Returns versus Risk

sd_mean_tbl <- asset_returns_tbl %>%
    
    group_by(asset) %>%
    tq_performance(Ra = returns, 
                   performance_fun = table.Stats) %>%
    
    select(Mean = ArithmeticMean, Stdev) %>%
    ungroup() %>%
    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 COST      0.0127  0.0478
## 2 TGT       0.0043  0.0609
## 3 WMT       0.0083  0.0471
## 4 Portfolio 0.00780 0.0353
sd_mean_tbl %>%
    
    ggplot(aes(x = Stdev, y = Mean, color = asset)) +
    geom_point() +
    ggrepel::geom_text_repel(aes(label = asset))

rolling_sd_table <- 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_table
## # A tibble: 37 × 2
##    date       rolling_sd
##    <date>          <dbl>
##  1 2014-12-31     0.0379
##  2 2015-01-30     0.0381
##  3 2015-02-27     0.0383
##  4 2015-03-31     0.0373
##  5 2015-04-30     0.0387
##  6 2015-05-29     0.0388
##  7 2015-06-30     0.0392
##  8 2015-07-31     0.0388
##  9 2015-08-31     0.0377
## 10 2015-09-30     0.0377
## # ℹ 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 = 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.

Performance relative to the assets is going to a constant cycle of highs and lows. The mean of each stock I have chosen is drastically different with Walamrt and Costcos sd being the only point that is semi-close to one another. Other than that, the mean of each stock is completly differnt meaning we can expect a very mobile rolling volatitlity. 
In this case, Target has the highest risk, followed by Costco, Walmart, then the Portfolio. As for the mean, Costco has the highest, followed by Walmart, the Portfolio, and finally Target. In this case, I don't think I would invest in the Portfolio for the main reason being the unexpectedness and potiental drops it could face. I would invest in Walmart for the main reason being that it is a happy medium meaning not too much of a risk but I would also get something in return without taking a huge risk and potentially loosing it all.