Numba acelera la simulación de Montecarlo

En la publicación de hoy, proporcionaré otro ejemplo que muestra cómo numba puede acelerar una simulación numérica. Aplico el módulo a una simulación Monte-Carlo de recorridos aleatorios de precios de acciones. Este es un ejemplo popular de simulación de Montecarlo y también proporcioné un ejemplo de esto en una publicación de blog hace varios años.

Simulación de Montecarlo con numba en Python

En el siguiente segmento de código, importo módulos relevantes y partes de módulos. Como señalé en una publicación anterior, numba funciona muy bien con numpy , por ejemplo, pero no tan bien con pandas . Implementé dos versiones de una simulación de monte-carlo de caminata aleatoria de precios. Ambas simulaciones repiten n paseos aleatorios que tienen una duración de 365 días. Cada día, el movimiento del precio se distribuye aleatoriamente de acuerdo con una distribución normal aleatoria con rendimiento diario medio especificado y desviación estándar especificada de rendimientos diarios.

import numpy as np
from matplotlib import pyplot as plt
import random
import time
from numba import njit

def random_walker(n: int, length: int) -> np.ndarray:

    arr = np.zeros((n, length), dtype = float)

    for i in range(n):

        idx = 100

        for j in range(length):
            
            idx += idx*random.gauss(0.00015, 0.02)

            arr[i, j] = idx
    
    return arr

@njit
def nb_random_walker(n: int, length: int) -> np.ndarray:

    arr = np.zeros((n, length), dtype = float)

    for i in range(n):

        idx = 100

        for j in range(length):
            
            idx += idx*random.gauss(0.00015, 0.02)

            arr[i, j] = idx
    
    return arr

Ahora ejecuto las ejecuciones de simulación aleatorias una tras otra y calculo la duración de la simulación de ambas ejecuciones. Puedes ver esto en el siguiente código.

# --- monte carlo run without numba ------------------
starttime = time.time()
arr = random_walker(10000, 365)
endtime = time.time()

print("monte carlo random walk without NUMBA: ")
print(endtime-starttime)

# --- monte carlo run with numba --------------------
starttime = time.time()
arr = nb_random_walker(10000, 365)
endtime = time.time()

print("monte carlo random walk with NUMBA: ")
print(endtime-starttime)

La salida es la siguiente:

monte carlo random walk without NUMBA: 
1.9181511402130127
monte carlo random walk with NUMBA: 
0.6535243988037109

En este caso, numba mejoró el tiempo de ejecución de la simulación de monte-carlo en casi un factor 3 . Y por cierto, así es como se ven las caminatas aleatorias:

numba hace que la simulación de monte-carlo sea más rápida

Observaciones finales y contenido relacionado

En este artículo demostré cómo numba , un módulo en Python, hace que las simulaciones de monte-carlo sean significativamente más rápidas. Sin embargo, debe tener en cuenta las limitaciones que acompañan a este módulo. Como señalé, podrá aprovechar al máximo numba si tiene un marco numérico. Además, tenga en cuenta los módulos y paquetes que funcionan bien con numba y los que no. Por ejemplo, numpy funciona bien con numba mientras que pandas no.

Puede leer más aquí:

También puedes ver otro ejemplo en Pyhton aquí:

You May Also Like

Leave a Reply

Leave a Reply

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

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.