library(tidyverse)
## -- Attaching packages --------------------------------------- tidyverse 1.3.0 --
## v ggplot2 3.3.2     v purrr   0.3.4
## v tibble  3.0.4     v dplyr   1.0.2
## v tidyr   1.1.2     v stringr 1.4.0
## v readr   1.4.0     v forcats 0.5.0
## Warning: package 'ggplot2' was built under R version 4.0.3
## Warning: package 'tibble' was built under R version 4.0.3
## Warning: package 'tidyr' was built under R version 4.0.3
## Warning: package 'readr' was built under R version 4.0.3
## Warning: package 'dplyr' was built under R version 4.0.3
## -- Conflicts ------------------------------------------ tidyverse_conflicts() --
## x dplyr::filter() masks stats::filter()
## x dplyr::lag()    masks stats::lag()
library(quantmod)
## Loading required package: xts
## Warning: package 'xts' was built under R version 4.0.3
## Loading required package: zoo
## 
## Attaching package: 'zoo'
## The following objects are masked from 'package:base':
## 
##     as.Date, as.Date.numeric
## 
## Attaching package: 'xts'
## The following objects are masked from 'package:dplyr':
## 
##     first, last
## Loading required package: TTR
## Warning: package 'TTR' was built under R version 4.0.3
## Registered S3 method overwritten by 'quantmod':
##   method            from
##   as.zoo.data.frame zoo
## Version 0.4-0 included new data defaults. See ?getSymbols.
getSymbols("TSLA")
## 'getSymbols' currently uses auto.assign=TRUE by default, but will
## use auto.assign=FALSE in 0.5-0. You will still be able to use
## 'loadSymbols' to automatically load data. getOption("getSymbols.env")
## and getOption("getSymbols.auto.assign") will still be checked for
## alternate defaults.
## 
## This message is shown once per session and may be disabled by setting 
## options("getSymbols.warning4.0"=FALSE). See ?getSymbols for details.
## [1] "TSLA"
tsla.d.ret = dailyReturn(TSLA)
(mu_d_ret = mean(tsla.d.ret))
## [1] 0.002611926
(sd_d_ret = sd(tsla.d.ret))
## [1] 0.03583695
trading_days = bizdays::bizdays(as.Date("2020-12-02"), as.Date("2020-12-31"))

target = 1.171
loops = 100000

mat_d_rets = matrix(rnorm(trading_days * loops, mean = mu_d_ret, sd = sd_d_ret), ncol = trading_days)

mat_d_index = matrix(0, loops, trading_days)
mat_d_index[,1] = 1

for(idx_row in 1:loops){
  for(idx_col in 2:trading_days){
    mat_d_index[idx_row, idx_col] = mat_d_index[idx_row, (idx_col-1)] * (1 + mat_d_rets[idx_row, idx_col])
  }
}

check_target = apply(mat_d_index, 1, function(x){any(x > target)}) 
mean(check_target) %>% scales::percent(accuracy = 0.2)
## [1] "44.8%"