I dagens indlæg vil jeg give et andet eksempel, der viser, hvordan numba kan fremskynde en numerisk simulering. Jeg anvender modulet til en monte-carlo-simulering af tilfældige ture i aktiekursen. Dette er et populært monte-carlo-simuleringseksempel, og jeg gav også et eksempel på dette i et blogindlæg for flere år siden.
Monte-carlo simulering med numba i Python
I nedenstående kodesegment importerer jeg relevante moduler og dele af moduler. Som jeg påpegede i et tidligere indlæg , fungerer numba meget godt med numpy , for eksempel, men ikke så godt med pandaer . Jeg implementerer to versioner af en pris random walk monte-carlo simulering. Begge simuleringer gentager n tilfældige gåture, der har en varighed på 365 dage. Hver dag er kursbevægelsen tilfældigt fordelt i overensstemmelse med en tilfældig normalfordeling med specificeret gennemsnitligt dagligt afkast og specificeret standardafvigelse for daglige afkast.
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
Jeg udfører nu de tilfældige simuleringskørsler efter hinanden, og beregner simuleringens varighed af begge kørsler. Du kan se dette i koden nedenfor.
# --- 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)
Udgangen er som følger:
monte carlo random walk without NUMBA:
1.9181511402130127
monte carlo random walk with NUMBA:
0.6535243988037109
I dette tilfælde forbedrede numba monte-carlo-simuleringens køretid med næsten faktor 3 . Og sådan ser de tilfældige gåture i øvrigt ud:
Afsluttende bemærkninger og relateret indhold
I denne artikel demonstrerede jeg, hvordan numba , et modul i Python, gør monte-carlo-simuleringer betydeligt hurtigere. Du skal dog være opmærksom på de begrænsninger, der følger med dette modul. Som jeg påpegede, vil du kunne få mest muligt ud af numba, hvis du har en numerisk ramme. Vær desuden opmærksom på de moduler og pakker, der fungerer godt med numba – og dem, der ikke gør. For eksempel fungerer numpy godt med numba, mens pandaer ikke gør det.
Du kan læse mere her:
Du kan også se et andet eksempel i Pyhton her:
Industriingeniør som gerne beskæftiger sig med optimering, simulation og matematisk modellering i R, SQL, VBA og Python
Leave a Reply