No post de hoje vou dar outro exemplo que mostra como o numba pode acelerar uma simulação numérica. Eu aplico o módulo a uma simulação monte-carlo de passeios aleatórios de preços de ações. Este é um exemplo popular de simulação de monte-carlo e também forneci um exemplo disso em um post de blog há vários anos.
Simulação de Monte-carlo com numba em Python
No segmento de código abaixo eu importo módulos relevantes e partes de módulos. Como apontei em um post anterior, numba funciona muito bem com numpy , por exemplo, mas não tão bem com pandas . Eu implemento duas versões de uma simulação de preço aleatório de monte-carlo. Ambas as simulações repetem n passeios aleatórios com duração de 365 dias. A cada dia, o movimento do preço é distribuído aleatoriamente de acordo com uma distribuição normal aleatória com retorno médio diário especificado e desvio padrão especificado dos retornos diários.
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
Agora executo as simulações aleatórias uma após a outra e calculo a duração da simulação de ambas as execuções. Você pode ver isso no código abaixo.
# --- 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)
A saída é a seguinte:
monte carlo random walk without NUMBA:
1.9181511402130127
monte carlo random walk with NUMBA:
0.6535243988037109
Neste caso, o numba melhorou o tempo de execução da simulação de monte-carlo em quase o fator 3 . E, a propósito, é assim que os passeios aleatórios se parecem:
Considerações finais e conteúdo relacionado
Neste artigo demonstrei como numba , um módulo em Python, torna as simulações de monte-carlo significativamente mais rápidas. No entanto, você deve estar ciente das restrições que acompanham este módulo. Como apontei, você poderá tirar o máximo proveito do numba se tiver uma estrutura numérica. Além disso, esteja ciente dos módulos e pacotes que funcionam bem com o numba – e os que não funcionam. Por exemplo, numpy funciona bem com numba enquanto pandas não.
Você pode ler mais aqui:
Você também pode ver outro exemplo em Python aqui:
Cientista de dados com foco em simulação, otimização e modelagem em R, SQL, VBA e Python
Leave a Reply