Numba acelera simulação de monte-carlo

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:

numba torna a simulação de monte-carlo mais rápida

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:

You May Also Like

Leave a Reply

Leave a Reply

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *

Esse site utiliza o Akismet para reduzir spam. Aprenda como seus dados de comentários são processados.