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:
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í:
- Enlace : simulaciones de Python más rápidas
Ingeniero industrial especializado en optimización y simulación (R, Python, SQL, VBA)
Leave a Reply