Contenido
Descripción
1. Simulación Monte Carlo
2. Paqueterías
3. Data
4. Pesos de cartera
5. Enfoque histórico
6. Principales limitaciones
7. Modelado

1. Simulación Monte Carlo

Descripción: En el siguiente entrenamiento se realizará una introducción a la Simulación Monte Carlo utilizando los resultados de cartera que se obtuvieron del entrenamiento “Portafolio de Fronteras Eficientes -Markowitz-” que se encuentra en una de las entradas de esta página.

Se realizará en el entorno de desarrollo integrado de Rstudio, y el diseño del mismo permitirá conocer los puntos prácticos de su aplicación. No es una inmersión profunda en la Simulación  Monte Carlo para problemas industriales muy específicos y bien definidos.

Para entender de manera sencilla la Simulación Monte Carlo es necesario tener presente el significado de dos términos estadísticos: Probabilístico y Determinístico.

Probabilístico: En síntesis, es “algo” que pueda cuantificarse mediante una distribución de probabilidad. Por ejemplo: ¿Cuántas personas se presentan para una función de cine?

Determinístico: “Algo” que se puede calcular a partir de parámetros. Por ejemplo, si se presentan 200 personas para una función de cine que tiene 185 asientos, ¿cuántas personas se van a la siguiente función?

Una simulación de Monte Carlo puede explicar la incertidumbre (naturaleza probabilística) en los parámetros de un modelo determinista que produce una distribución de probabilidad de posibles resultados.

2. Paqueterías

Tidyquant: Lleva el análisis comercial y financiero al ‘tidyverse’. El paquete proporciona un contenedor compatible con objetos ‘xts’, ‘zoo’, ‘quantmod’, ‘TTR’; el ‘PerformanceAnalytics’ se activa y devuelve los objetos en el formato ordenado ‘tibble’. La principal ventaja es el poder usar funciones cuantitativas con el ‘tidyverse’ funciones que incluyen ‘purrr’, ‘dplyr’, ‘tidyr’, ‘ggplot2’, ‘lubridate’, etc.

Tidyverse: El ‘tidyverse’ es un conjunto de paquetes que funcionan en armonía porque comparten representaciones de datos comunes y ‘API’ diseño. Este paquete está diseñado para facilitar la instalación y carga múltiples paquetes ‘tidyverse’.


Timetk: Fácil visualización, discusión e ingeniería de características de datos en series de tiempo para pronósticos  y predicción en aprendizaje automático. Los métodos discutidos aquí son comunes en el aprendizaje automático y han sido citados en diversas publicaciones.

Broom: Resume información clave sobre objetos estadísticos ordenados en tibbles. Esto hace que sea fácil informar resultados, crear trazas y trabaja constantemente con grandes cantidades de modelos a la vez. 

Broom proporciona tres funciones que proporcionan diferentes tipos de información sobre un modelo. “tidy” () resume la información sobre el modelo,  componentes como los coeficientes de una regresión. “glance” () información sobre un modelo completo, como medidas de bondad de ajuste: AIC y BIC. “augment” () agrega información sobre observaciones individuales a un conjunto de datos como valores ajustados.

Highcharter: Un contenedor para la biblioteca ‘Highcharts’ que incluye funciones de acceso directo para trazar objetos R. Highcharts https://www.highcharts.comes una oferta de numerosos tipos de gráficos con una sintaxis de configuración simple.

3. Data

Los seis activos bursátiles de la cartera forman parte del índice S&P 500, se seleccionó el período desde enero 2010 hasta abril 2020:

Microsotf Corporation (MSFT): Importante compañía tecnológica multinacional con sede en Redmond, Washington, EE.UU, es la de mayor capitalización dentro del índice S&P 500.

Johnson & Johnson (JNJ): Histórico fabricante de dispositivos médicos, productos farmacéuticos, de cuidado personal, perfumes y artículos para bebés.

Mastercard Incorporated (MA): Una de las más importantes multinacionales de servicios financieros con sede en Purchase, Nueva York, Estados Unidos.

PepsiCo Inc (PEP): Exitosa empresa multinacional estadounidense dedicada a la fabricación, comercialización y distribución de bebidas y aperitivos.

Walmart Corporate (WMT): Corporación multinacional de tiendas de origen estadounidense, que opera cadenas de grandes almacenes de descuento y clubes de almacenes.

McDonald’s Corporation (MCD): Es una franquicia de restaurantes de servicio rápido estadounidense con sede en Illinois Chicago.

4. Pesos de la cartera

El peso de la cartera viene dado por el Portafolio Tangente realizado en mi post “Portafolios de Inversión” y  que distribuyó los activos de la siguiente manera:

  1. Microsotf Corporation (MSFT):4,1%
  2. Johnson & Johnson (JNJ): 27,8%
  3. Mastercard Incorporated (MA): 7,4%
  4. PepsiCo Inc (PEP): 14,2%
  5. Walmart Corporate (WMT): 23%
  6. McDonald’s Corporation (MCD): 23,4%

5. Simulación Monte Carlo en Gestión de Carteras -Enfoque histórico- 

Los especialistas en gestión de cartera pueden evaluar los posibles rendimientos de muchas maneras. El enfoque histórico, que a la fecha es el más usado, considera todas las posibilidades que ya han sucedido (serie temporal). 

Sin embargo, esto no es todo en el mundo de la gestión de carteras y el análisis de riesgo. El método Monte Carlo es un método estocástico (muestreo aleatorio) para resolver un problema estadístico, y una simulación es una representación virtual de un problema. La simulación Monte Carlo combina ambos para obtener una herramienta poderosa que permite arrojar una distribución (matriz) de resultados para cualquier problema estadístico con numerosas entradas muestreadas una y otra vez.

¿Qué es una cartera de inversión?

Una cartera es una agrupación de activos financieros como acciones, bonos, materias primas, monedas y equivalentes de efectivo, así como sus contrapartes de fondos, incluidos fondos mutuos, negociados en bolsa y cerrados. Una cartera también puede consistir en valores no negociables públicamente, como bienes raíces, arte e inversiones privadas. 

La razón teórica por la que los inversores racionales prefieren una cartera a un solo activo es que una cartera puede ofrecer una mejor compensación de riesgo / rendimiento debido a una covarianza baja o negativa entre los componentes de la cartera.

6. Principales limitaciones:



7. Modelado de la Simulación Montecarlo en el entorno R 

"En este entrenamiento la Simulación Montecarlo permitirá conocer a través de 100 simulaciones aleatorias y basadas en el histórico de cada uno de los 6 instrumentos financieros seleccionados, cual será el crecimiento (tasa compuesta anual) de 1 USD$ invertido en esa cartera (Portafolio Tangente) durante los próximos 120 meses (10 años)."

El primer paso será transformar el histórico de precios diarios de los instrumentos seleccionados en un objeto de rendimiento de registro de cartera. Se activan la librerías de R.

Se importarán los precios desde el portal de “Yahoo” de los 6 activos que componen el Portafolio Tangente, utilizando el comando “getSymbols” para obtener los valores, especificando que el valor requerido será el de los precios ajustados de cierre con la acción “map(~Ad(get(.)))”. Se combinaran los objetos en un objeto “xts” utilizando la línea “reduce(merge)”.
Se convertirá el objeto “xts” a “tibble” que es otro tipo de formato para la manipulación de los datos y que el paquete lee mejor con la siguiente línea de comando: “tk_tbl(preserve_index = TRUE, rename_index =”date“)”. Se añadirá otra columna para los retornos de los activos: “mutate(returns = (log(returns) - log(lag(returns))))”.

Los pesos (participación % de activos) del portafolio se determinaron con el “Portafolio Tangente” de un post anterior.
Se usará para continuar con la simulación, el objeto “retornos_rebalanceados_mensual” y se calcularán la media y la desviación estándar de los retornos: “media_retornos”; “destandar_retornos”.  La linea de comando “tq_portfolio” agrega un grupo de retornos por activo en los de la cartera.

En la ecuación manual, los pesos (“comp”) de la cartera son fijos, lo que significa que nunca cambian mes a mes. Eso es equivalente a reequilibrar cada mes, lo que en la práctica sería extraño.
La siguiente línea de código será parta ejecutar la simulación de crecimiento de un (1) USD$ invertido en nuestra cartera de inversión durante los próximos 120 meses (10 años). Se creará un objeto llamado  "simulacion_acumul_1()". Luego diseñaremos la ejecución de 100 simulaciones, siempre se puede colocar cualquier número.

Se necesitará una matriz vacía con 100 columnas, un valor inicial de 1 USD$  y los nombres de las columnas intuitivos.

Usaremos la función "rep()" para crear las 100 columnas con un “1” como valor, y para nombrar cada columna con el número de simulación apropiado la función "set_names()".
Revisamos el objeto “comienzo” para ver lo que acabamos de crear y cómo se pueden albergar las simulaciones.
## sim1 sim2 sim3 sim4 sim5 sim6 
##    1    1    1    1    1    1
##  sim95  sim96  sim97  sim98  sim99 sim100 
##      1      1      1      1      1      1
Tenemos 100 columnas, con un valor de 1 por fila. Aquí se almacenarán los resultados de las 100 simulaciones.

Luego, se debe aplicar “simulacion_acumul_1” a cada una de las 100 columnas de la matriz “comienzo”, y se hará utilizando la función “map_dfc()” del paquete “purrr”.

Se necesita tomar un vector con la función “map_dfc()”, en este caso, las columnas de “comienzo”. Al agregar “dfc()” a la “map_función”, le pedimos que almacene cada uno de los resultados como columna de un marco de datos. 

Después de ejecutar el siguiente código, tendremos un marco de datos con 100 columnas, una para cada una de las simulaciones.

También debemos elegir cuántos meses simular (el argumento N para nuestra función de simulación) y proporcionar los parámetros de distribución. No proporcionamos el argumento “init_value”  porque “init_value” es 1, el mismo 1 que ya está en las 100 columnas.

## # A tibble: 3 x 4
##   growth...1 growth...2 growth...99 growth...100
##        <dbl>      <dbl>       <dbl>        <dbl>
## 1       2.81       7.10        2.58         3.61
## 2       2.69       6.92        2.54         3.67
## 3       2.70       6.98        2.39         3.83
Ahora se tienen 100 simulaciones del crecimiento de un dólar, y simulamos ese crecimiento durante 120 meses; sin embargo, a los resultados les falta una pieza que se necesita para visualizar, una “monthcolumna”, es decir la columna para los 120 meses de la simulación.

Se agregará “monthcolumna mutate()” y le daremos el mismo número de filas que nuestro marco de datos. Estos son meses en el futuro. Usaremos mutate(month = seq(1:nrow(.))), y luego limpiaremos los nombres de las columnas. nrow()es igual al número de filas en nuestro objeto.
## # A tibble: 3 x 5
##   month  sim1  sim2 sim99 sim100
##   <dbl> <dbl> <dbl> <dbl>  <dbl>
## 1   119  2.81  7.1   2.58   3.61
## 2   120  2.69  6.92  2.54   3.67
## 3   121  2.7   6.98  2.39   3.83

Observar simulaciones

Se han logrado correr las 100 simulaciones. Ahora utilizaremos un  segundo método usando la línea de comando para la función “rerun()” del paquete “purrr”. Esta función “volverá a ejecutar” otra función, y calibramos cuántas veces hacerlo mediante la configuración .n = número de tiempos de rerun. Por ejemplo, para ejecutar la “simulacion_acum_1” 6 veces, este sería el código.
Nos arrojó una lista de 6 marcos de datos, o 6 simulaciones. Podemos mirar las primeras filas de cada marco de datos usando “map(…, head)”.
## [[1]]
## # A tibble: 6 x 1
##   growth
##    <dbl>
## 1   1   
## 2   1.08
## 3   1.09
## 4   1.14
## 5   1.24
## 6   1.26
## 
## [[2]]
## # A tibble: 6 x 1
##   growth
##    <dbl>
## 1   1   
## 2   1.04
## 3   1.09
## 4   1.09
## 5   1.12
## 6   1.09
## 
## [[3]]
## # A tibble: 6 x 1
##   growth
##    <dbl>
## 1  1    
## 2  0.976
## 3  0.961
## 4  0.951
## 5  0.984
## 6  0.989
## 
## [[4]]
## # A tibble: 6 x 1
##   growth
##    <dbl>
## 1   1   
## 2   1.06
## 3   1.09
## 4   1.11
## 5   1.13
## 6   1.16
## 
## [[5]]
## # A tibble: 6 x 1
##   growth
##    <dbl>
## 1   1   
## 2   1.04
## 3   1.05
## 4   1.10
## 5   1.12
## 6   1.16
## 
## [[6]]
## # A tibble: 6 x 1
##   growth
##    <dbl>
## 1  1    
## 2  0.973
## 3  0.970
## 4  0.964
## 5  0.907
## 6  0.915
Se consolida la lista de marcos de datos en uno de tipo “tibble”. Comenzamos colapsando a vectores con la línea “simplify_all()”, luego agregamos nombres más distinguibles con la función "names()" y finalmente coaccionamos para tibbilizar “as_tibble()”. Se ejecutará 100 veces.
## # A tibble: 3 x 4
##   `sim 1` `sim 2` `sim 99` `sim 100`
##     <dbl>   <dbl>    <dbl>     <dbl>
## 1    3.65    8.01     3.28      2.42
## 2    3.66    7.77     3.30      2.48
## 3    3.67    7.79     3.27      2.52
Se tienen dos objetos que contienen los resultados de 100 simulaciones, “monte_carlo_rerun_100” y “monte_carlo_sim_100.”

Cada uno tiene 100 columnas de simulaciones y 1 columna de meses. Igualmente, tenemos 121 filas porque se comenzó con un valor inicial de 1 y luego los retornos simulados durante 120 meses.

Ahora vamos a visualizar “ggplot()” y visualizar los resultados en “monte_carlo_sim_100”. Los mismos flujos de código para la visualización de “monte_carlo_rerun_100” serán las mismas, pero los ejecutaremos como “monte_carlo_sim_100”.

Comenzamos con un gráfico de las 100 simulaciones y asignamos un color diferente a cada una mediante la configuración “ggplot(aes(x = month, y = growth, color = sim))”. ggplot() generará automáticamente una leyenda para las 100 series de tiempo, pero eso llenaría la gráfica casi completa. Suprimiremos la leyenda con “theme(legend.position =”none“)”.

Le agregaremos la función “ggplotly” para generar un gráfico “plotly” interactivo.

Se pueden verificar la simulación mínima, máxima y mediana con la función "summarise()".

## # A tibble: 1 x 3
##     max   min median
##   <dbl> <dbl>  <dbl>
## 1     9  1.48   3.47
Observamos las tres tasas anuales compuestas que arroja el modelo mínima, máxima y mediana, la mediana es la que se toma como el escenario con más “probabilidades de ocurrencia”. Se puede limpiar la visualización original incluyendo solo la mediana, el máximo y el mínimo. Existen tres simulaciones que coinciden con la mediana final.


Aquí puedes ver el código completo: Modelo Monte Carlo

Puedes compartir este material:


Por:
Jesús Benjamín Zerpa
Economista
JesusZerpaEconomia@Gmail.Com


Excepto donde se indique lo contrario, el contenido de esta obra está bajo una licencia de Creative Commons Reconocimiento 4.0 Internacional.



Copyright © 2020 Jesús B. Zerpa | Economist & Data Scientist | Site created with RStudio 

| FINANCE | INTELLIGENCE BUSSINES | FORECASTING | TIME SERIES | FINANCIAL DASHBOARD | FINANCIAL BUDGET | SPATIAL ECONOMETRICS |