Saltar al contenido

La simulación de Montecarlo aplicada al trading

    montecarlo portada

    Cuando creamos una estrategia de trading es muy importante probarla bajo todos los posibles escenarios que puedan darse y ver que nuestro modelo sigue funcionando bien, es decir hacer unas buenas pruebas de robustez. Una de las formas de más conocidas de hacer este tipo de pruebas es mediante la simulación de Montecarlo.

    Si un modelo de trading es capaz de soportar con un buen desempeño una test de robustez como el la simulación de Montecarlo se podría decir que ya está listo para pasar a un entorno real, así que es muy importante que tu modelo funcione con este tipo de pruebas.

    Sigue leyendo para ver como te puede ayudar a mejorar tus estrategias de trading esta simulación.

    ¿Qué es la simulación de Montecarlo?

    Lo que hace esta simulación es generar números aleatorios usando una distribución de probabilidad y luego hacer muchas muchas repeticiones para de esta forma evitar la incertidumbre que lógicamente tenemos en el trading, ya que solo tenemos muestras limitadas de lo que puede llegar a suceder.

    Al final este modelo lo que hace es jugar con la probabilidad y el volumen. Esto cumple la ley de los números grandes que es un teorema matemático que viene a decir algo así:

    Si repetimos un experimento un número enorme de veces, la frecuencia de que suceda un evento tiende a ser una constante.

    Esto se puede ver muy fácil con el ejemplo del lanzamiento de una moneda al aire, si lanzas muy pocas veces la moneda al aire, es probable que no veas que la probabilidad de que salga cara o cruz es del 50%, pero si lanzas la moneda muchas veces al aire, observarás como se cumple esta probabilidad.

    Con esto creo que queda muy claro porque es importante la simulación de Montecarlo dentro del trading, ya que si tenemos una estrategia y la repetimos muchas veces sabremos cual será nuestra constante de ganancia o pérdida con ese sistema.

    Se puede decir que una valor ya está estable cuando tanto la media aritmética como la varianza de los valores que estamos midiendo está estable. Por este hecho siempre hay que buscar la estabilidad de las mismas para saber que nuestro valor es constante.

    Empezando

    Aunque en un principio podríamos pensar que hacer la simulación de Montecarlo podría ser tan simple como lanzar números aleatorios y dejarnos llevar esa no es la realidad. Si hiciéramos eso podrían darse unos valores demasiado grandes o demasiado pequeños y salirnos elementos que podrían no tener ningún sentido dentro de lo que es el movimiento normal de un precio, así que tenemos que idear la forma de hacer eso.

    Por suerte la forma de conseguir esta aleatoriedad ya está estudiada desde antes de los tiempos de la segunda guerra mundial, donde lo utilizaban para la simulación de la difusión de los neutrones en la fusión.

    Las librerías que vamos a necesitar para hacer nuestro código son las siguiente:

    # Librería para descargar los datos
    from yahoo_fin import stock_info
    # Librería para datos
    import numpy as np
    # Librería para calcular la desviación estandar
    from scipy.stats import norm
    # Librería para mostrar los datos
    import matplotlib.pyplot as plt

    Ahora vamos con la chica de verdad de la simulación de Montecarlo.

    Movimiento Browniano

    Nosotros para nuestro cálculos vamos a utilizar el movimiento browniano geométrico que es el más utilizado dentro del mundo de las finanzas. Su fórmula es la siguiente:

    (1)   \begin{equation*} $S_{t+1} = S_t\cdot e^{(\mu - \frac{\sigma^2}{2})+\sigma \cdot \epsilon }$ \end{equation*}

    Donde por cada caso tendremos lo siguiente:

    • \mu: es la media
    • \sigma^2: la varianza
    • \delta t: la desviación estándar
    • \epsilon: Este es el componente estocástico de nuestra función y que nos asegura que el movimiento sea completamente aleatorio. Lógicamente tiene que cumplir que el movimiento de un paso no tenga correlación con el anterior.

    Para conseguir cada uno de los valores de la fórmula lo haremos en varios pasos de los cuales el primero es descargar los valores que vamos a utilizar, para ello tiraremos directamente de la librería de Yahoo, que nos hace este cometido más fácil:

    netflix = stock_info.get_data("nflx", start_date="01/01/2020", end_date="01/01/2021")

    En este caso nos hemos descargado los precios de Netflix pero podría ser cualquier otra acción o divisa que quisiéramos.

    Lo primero que vamos a hacer es calcular la rentabilidad logarítmica (o capitulación compuesta) de un valor. Esto se hace primero calculando la rentabilidad simple:

    rentabilidad\ simple = (precio\ inicial - precio\ final)

    y aplicamos el logaritmo:

    Rentabilidad\ logarítmica = ln(1+rentabilidad\ simple)

    Esto con python se hace de la siguiente forma:

    rent_algo = np.log(1 + netflix['close'].pct_change())

    Y con esto ya podemos obtener el resto de valores que nos hace falta para la fórmula:

    # Obtenemos la media
    mu = rent_algo.mean()
    # Obtenemos la varianza
    var = rent_algo.var()
    # obtenemos el valor del drift (primer parentesis)
    drift = mu - (var/2)
    # Obtenemos el valor de la desviación estandar
    desvest = rent_algo.std()

    Para el epsilon (la parte aleatoria) vamos a utilizar una función que nos facilita python (además de la de conseguir los números aleatorios), la de la función de densidad de probabilidad (norm.ppf). Esta función describe la probabilidad relativa por la cual una variable aleatoria tomará un determinado valor:

    # Decimos cuantos días queremos simular (o el timeframe que corresponda)
    days = 30
    # El número de simulaciones que queremos realizar
    n_simulations = 10000
    # Hacemos la fórmula
    epsilon = norm.ppf(np.random.rand(days, n_simulations))

    Con esto ya tendremos todo lo necesario recrear nuestra fórmula. Empezamos con la parte de función exponencial:

    daily_returns = np.exp(drift + desvest * epsilon)

    Y ahora ya solo tenemos que hacer un bucle para ir consiguiendo los nuevos datos por cada paso paso y para todos los días que queremos hacer:

    returns =  drift + desvest * epsilon
    S = np.zeros_like(returns)
    S[0] = netflix['close'].iloc[-1]
    for t in range(1, days):
        S[t] = S[t-1]*np.exp(returns[t])

    Graficando

    Y con esto ya tenemos todos los valores en la variable S. Ahora podemos hacer un gráfico con lo que hemos sacado para ver todos los valores tal y como los hemos generado:

    plt.plot(S)
    plt.show()

    Y la salida se vería así:

    Simulación de Montecarlo con Netflix

    Con lo cual ya vemos todos los valores que nos ha generado nuestro simulación de Montecarlo.

    Conclusiones

    Aquí no está todo el trabajo terminado ya que si queréis probar vuestros algoritmos con este método es posible que no solo necesitéis hacer esto con la parte de cierre de los precios sino con todos los posibles valores que puedan tomar los precios, aunque la forma de trabajo es similar cambiando el precio objetivo

    También hay que señalar que esta no es la única forma de hacer una simulación de Montecarlo ya que se puede realizar realizando la generación de los números aleatorios de distintas formas a como lo hace el movimiento Browniano, pero esta es una de las más utilizadas.

    Como hemos visto no es tan complicado crear una simulación de Montecarlo, aunque entender el por qué de cada operación si que puede llegar a ser más complicado, pero con las explicaciones que hemos dado aquí espero que os haya quedado más claro.

    Como siempre, si tenéis cualquier duda o mejora del artículo no dudéis en poneros en contacto conmigo y os contestaré lo antes posible.

    Deja una respuesta

    Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *