#modelización Monte Carlo# #Jesús Zerpa# library(tidyquant) library(tidyverse) library(timetk) library(broom) library(highcharter) library(plotly) instrumentos<- c("MSFT", "JNJ", "MA", "PEP", "WMT", "MCD") precios <- getSymbols(instrumentos, src = 'yahoo', from = "2010-01-04", to = "2020-04-30", auto.assign = TRUE, warnings = FALSE) %>% map(~Ad(get(.))) %>% reduce(merge) %>% `colnames<-`(instrumentos) comp <- c(0.041, 0.278, 0.074, 0.142, 0.23,0.234) retornosp <- precios %>% to.monthly(indexAt = "lastof", OHLC = FALSE) %>% tk_tbl(preserve_index = TRUE, rename_index = "date") %>% gather(asset, returns, -date) %>% group_by(asset) %>% mutate(returns = (log(returns) - log(lag(returns)))) %>% na.omit() retornos_rebalanceados_mensual <- retornosp %>% tq_portfolio(assets_col = asset, returns_col = returns, weights = comp, col_rename = "returns", rebalance_on = "months") media_retornos <- mean(retornos_rebalanceados_mensual$returns) destandar_retornos <- sd(retornos_rebalanceados_mensual$returns) simulacion_acumul_1 <- function(init_value, N, mean, stdev) { tibble(c(init_value, 1 + rnorm(N, mean, stdev))) %>% `colnames<-`("returns") %>% mutate(growth = accumulate(returns, function(x, y) x * y)) %>% select(growth) } simu <- 100 comienzo<- rep(1, simu) %>% set_names(paste("sim", 1:simu, sep = "")) head(comienzo) tail(comienzo) monte_carlo_sim_100 <-map_dfc(comienzo,simulacion_acumul_1,N = 120, mean = media_retornos,stdev =destandar_retornos) tail(monte_carlo_sim_100 %>% select(growth...1, growth...2, growth...99, growth...100), 3) monte_carlo_sim_100 <- monte_carlo_sim_100 %>% mutate(month = seq(1:nrow(.))) %>% select(month, everything()) %>% `colnames<-`(c("month", names(comienzo))) %>% mutate_all(funs(round(., 2))) tail(monte_carlo_sim_100 %>% select(month, sim1, sim2, sim99, sim100), 3) monte_carlo_rerun_6 <- rerun(.n = 6, simulacion_acumul_1(1, 120, media_retornos, destandar_retornos)) map(monte_carlo_rerun_6, head) reruns <- 100 monte_carlo_rerun_100<- rerun(.n = reruns, simulacion_acumul_1(1, 120, media_retornos, destandar_retornos)) %>% simplify_all() %>% `names<-`(paste("sim", 1:reruns, sep = " ")) %>% as_tibble() %>% mutate(month = seq(1:nrow(.))) %>% select(month, everything()) tail(monte_carlo_rerun_100 %>% select(`sim 1`, `sim 2`, `sim 99`, `sim 100`), 3) monte_carlo_sim_100 %>% gather(sim, growth, -month) %>% group_by(sim) %>% ggplot(aes(x = month, y = growth, color = sim)) + geom_line() + theme(legend.position="none") ggplotly(monte_carlo_sim_100 %>% gather(sim, growth, -month) %>% group_by(sim) %>% ggplot(aes(x = month, y = growth, color = sim)) + geom_line() + theme(legend.position="none")) resumen<- monte_carlo_sim_100 %>% gather(sim, growth, -month) %>% group_by(sim) %>% summarise(final = last(growth)) %>% summarise( max = max(final), min = min(final), mean= mean(final), median = median(final)) resumen monte_carlo_sim_100 %>% gather(sim, growth, -month) %>% group_by(sim) %>% filter( last(growth) == resumen$max || last(growth) == resumen$mean || last(growth) == resumen$median || last(growth) == resumen$min) %>% ggplot(aes(x = month, y = growth)) + geom_line(aes(color = sim)) (monte_carlo_sim_100 %>% gather(sim, growth, -month) %>% group_by(sim) %>% filter( last(growth) == resumen$max || last(growth) == resumen$mean || last(growth) == resumen$median || last(growth) == resumen$min) %>% ggplot(aes(x = month, y = growth)) + geom_line(aes(color = sim)))