# Load packages

# Core
library(tidyverse)
library(tidyquant)

# Source function
source("../00_scripts/simulate_accumulation.R")

1 Import stock prices

Revise the code below.

symbols <- c("AAPL", "TSLA", "NFLX", "MTN", "DIS")

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

Revise the code for weights.

# symbols
symbols <- asset_returns_tbl %>% distinct(asset) %>% pull()
symbols
## [1] "AAPL" "DIS"  "MTN"  "NFLX" "TSLA"
# weights
weights <- c(0.25, 0.25, 0.2, 0.2, 0.1)
weights
## [1] 0.25 0.25 0.20 0.20 0.10
w_tbl <- tibble(symbols, weights)
w_tbl
## # A tibble: 5 × 2
##   symbols weights
##   <chr>     <dbl>
## 1 AAPL       0.25
## 2 DIS        0.25
## 3 MTN        0.2 
## 4 NFLX       0.2 
## 5 TSLA       0.1

4 Build a portfolio

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

portfolio_returns_tbl
## # A tibble: 60 × 2
##    date       returns
##    <date>       <dbl>
##  1 2013-01-31  0.102 
##  2 2013-02-28  0.0242
##  3 2013-03-28  0.0451
##  4 2013-04-30  0.0806
##  5 2013-05-31  0.0871
##  6 2013-06-28 -0.0431
##  7 2013-07-31  0.108 
##  8 2013-08-30  0.0608
##  9 2013-09-30  0.0437
## 10 2013-10-31  0.0315
## # ℹ 50 more rows

5 Simulating growth of a dollar

# Get mean portfolio return
mean_port_return <- mean(portfolio_returns_tbl$returns)
mean_port_return
## [1] 0.02474627
# Get standard deviation of portfolio returns
stddev_port_return <- sd(portfolio_returns_tbl$returns)
stddev_port_return
## [1] 0.04688437

6 Simulation function

No need

7 Running multiple simulations

sims <- 51
starts <- rep(1,sims) %>%
    set_names(paste0("sim", 1:sims))

starts
##  sim1  sim2  sim3  sim4  sim5  sim6  sim7  sim8  sim9 sim10 sim11 sim12 sim13 
##     1     1     1     1     1     1     1     1     1     1     1     1     1 
## sim14 sim15 sim16 sim17 sim18 sim19 sim20 sim21 sim22 sim23 sim24 sim25 sim26 
##     1     1     1     1     1     1     1     1     1     1     1     1     1 
## sim27 sim28 sim29 sim30 sim31 sim32 sim33 sim34 sim35 sim36 sim37 sim38 sim39 
##     1     1     1     1     1     1     1     1     1     1     1     1     1 
## sim40 sim41 sim42 sim43 sim44 sim45 sim46 sim47 sim48 sim49 sim50 sim51 
##     1     1     1     1     1     1     1     1     1     1     1     1
monte_carlo_sim_51 <- starts %>%
    
    map_dfc(.x = .,
            .f = ~simulate_accumulation(initial_value = .x, 
                                        N = 240, 
                                        mean_return = mean_port_return, 
                                        sd_return = stddev_port_return)) %>%
    
    mutate(month = 1:nrow(.)) %>%
    select(month, everything()) %>%
    
    set_names(c("month", names(starts))) %>%
    
    pivot_longer(cols = -month, names_to = "sim", values_to = "growth")

monte_carlo_sim_51
## # A tibble: 12,291 × 3
##    month sim   growth
##    <int> <chr>  <dbl>
##  1     1 sim1       1
##  2     1 sim2       1
##  3     1 sim3       1
##  4     1 sim4       1
##  5     1 sim5       1
##  6     1 sim6       1
##  7     1 sim7       1
##  8     1 sim8       1
##  9     1 sim9       1
## 10     1 sim10      1
## # ℹ 12,281 more rows
monte_carlo_sim_51 %>%
    
    group_by(sim) %>%
    summarise(growth = last(growth)) %>%
    ungroup() %>%
    pull(growth)%>%
    
    quantile(probs = c(0, 0.25, 0.5, 0.75, 1)) %>%
    round(2)
##      0%     25%     50%     75%    100% 
##   44.81  213.96  317.54  482.13 1165.78

8 Visualizing simulations with ggplot

monte_carlo_sim_51 %>%

    ggplot(aes(x = month, y = growth, col = sim)) +
    geom_line() +
    theme(legend.position = "none")

# Simplify the plot

sim_summary <- monte_carlo_sim_51 %>%

    group_by(sim) %>%
    summarise(growth = last(growth)) %>%
    ungroup() %>%

    summarise(max = max(growth),
              median = median(growth),
              min = min(growth))

sim_summary
## # A tibble: 1 × 3
##     max median   min
##   <dbl>  <dbl> <dbl>
## 1 1166.   318.  44.8
monte_carlo_sim_51 %>%

    group_by(sim) %>%
    filter(last(growth) == sim_summary$max |
           last(growth) == sim_summary$median |
           last(growth) == sim_summary$min) %>%

    # Plot
    ggplot(aes(month, growth, col = sim)) +
    geom_line() +
    theme()

Line Plot of Simulations with Max, Median, and Min

Based on the Monte Carlo simulation results, how much should you expect from your $100 investment after 20 years? What is the best-case scenario? What is the worst-case scenario? What are limitations of this simulation analysis?

Based off the Monte Carlo simulation with a 100 dollar investment in 20 years you could expect a return of around 300 percent. This is based off the median of the simulations. The best case scenario is a return of 1000 percent. One of the limitations of this anaylsis is the limited timeframe that is looked at and the simulation is based off of. the other is the numeber of simulations run.