Im heutigen Beitrag werde ich ein weiteres Beispiel liefern, das zeigt, wie numba eine numerische Simulation beschleunigen kann. Ich wende das Modul auf eine Monte-Carlo-Simulation von Aktienkurs-Random-Walks an. Dies ist ein beliebtes Monte-Carlo-Simulationsbeispiel, und ich habe vor einigen Jahren auch ein Beispiel dafür in einem Blogbeitrag bereitgestellt.
Monte-Carlo-Simulation mit Numba in Python
Im folgenden Codesegment importiere ich relevante Module und Teile von Modulen. Wie ich in einem früheren Beitrag erwähnt habe, funktioniert numba zum Beispiel sehr gut mit numpy , aber nicht so gut mit pandas . Ich implementiere zwei Versionen einer Preis – Random-Walk -Monte-Carlo-Simulation. Beide Simulationen wiederholen n Random Walks, die eine Dauer von 365 Tagen haben. Jeden Tag wird die Preisbewegung zufällig gemäß einer zufälligen Normalverteilung mit festgelegter mittlerer Tagesrendite und festgelegter Standardabweichung der Tagesrenditen verteilt.
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
Ich führe nun die zufälligen Simulationsläufe nacheinander aus und berechne die Simulationsdauer beider Läufe. Sie können dies im folgenden Code sehen.
# --- 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)
Die Ausgabe ist wie folgt:
monte carlo random walk without NUMBA:
1.9181511402130127
monte carlo random walk with NUMBA:
0.6535243988037109
In diesem Fall verbesserte numba die Laufzeit der Monte-Carlo-Simulation fast um den Faktor 3 . Und übrigens, so sehen die Random Walks aus:
Schlussbemerkungen und zugehörige Inhalte
In diesem Artikel habe ich gezeigt, wie numba , ein Modul in Python, Monte-Carlo-Simulationen deutlich schneller macht. Sie müssen sich jedoch der Einschränkungen bewusst sein, die mit diesem Modul einhergehen. Wie ich bereits erwähnt habe, können Sie Numba am besten nutzen, wenn Sie einen numerischen Rahmen haben. Beachten Sie außerdem, welche Module und Pakete gut mit numba funktionieren – und welche nicht. Zum Beispiel funktioniert numpy gut mit numba, während Pandas dies nicht tun.
Hier können Sie mehr lesen:
Sie können hier auch ein weiteres Beispiel in Pyhton sehen:
Wirtschaftsingenieur mit Interesse an Optimierung, Simulation und mathematischer Modellierung in R, SQL, VBA und Python
Leave a Reply