Numba: Schnelle Monte-Carlo-Simulation

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:

numba macht die Monte-Carlo-Simulation schneller

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:

You May Also Like

Leave a Reply

Leave a Reply

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert

Diese Website verwendet Akismet, um Spam zu reduzieren. Erfahre mehr darüber, wie deine Kommentardaten verarbeitet werden.