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%"