Monte-Carlo-Simulation von Aktienkursen (in Python)

In einem meiner Beiträge habe ich das Konzept der Random-Walk-Vorhersage vorgestellt und dabei Python für die Implementierung verwendet. In diesem Beitrag möchte ich eine Monte-Carlo-Simulation von Aktienkursen durchführen. Hierfür werde ich die folgende fiktive Aktienkurshistorie verwenden:

# Liste mit fiktiven täglichen Aktienschlusskursen deklarieren
history_prices = [180,192,193,195,191,199,198,200,199,203,205,207,205,208,201,203,204,201,205,206,207]
print(stockPrices)
[180, 192, 193, 195, 206, 211, 191, 204, 215, 190, 205, 207, 205, 211, 222, 215, 245, 201, 205, 206, 214]

In Vorbereitung auf die nächsten Schritte werde ich nun alle relevanten Python-Module importieren:

# Importstatistiken zur Berechnung von z.B. Standardabweichung der Preisentwicklung
import statistics as stat
# import pyplot for plotting
import matplotlib.pyplot as plt
# import random for random number generations
import random as rnd

Unter der Annahme einer zufälligen Aktienkursbewegung leite ich die Standardabweichung von den relativen Änderungen der fiktiven Kurshistorie ab, sodass ich zufällige Aktienkursbewegungen modellieren kann:

relative_prices = []
for i in range(0,len(history_prices)):
    if i == 0:
        pass
    else:
        relative_prices.append((history_prices[i]-history_prices[i-1])/(history_prices[i-1])) 
std_prices = stat.stdev(relative_prices)
print(std_prices)
0.021375589655016836

Jetzt modelliere ich einen beispielhaften zufälligen Kursverlauf für 100 Tage in die Zukunft, wobei ich zufällige Preisbewegungen basierend auf der ermittelten Standardabweichung annehme. Ich gehe von einer Normalverteilung aus. Der letzte bekannte Preis in der Geschichte dient dabei als Ausgangspunkt:

# Modellierung eines zufälligen Preisspaziergangs über 100 Tage
# - Berechnung durchführen, Funktion definieren
def randomWalk(stdev,pastPrices):
    days = [i for i in range(1,101)]
    prices = []
    price = pastPrices[-1]
    for i in range(1,101):
        price = price + price*rnd.normalvariate(0,stdev)
        prices.append(price)
    return([days,prices])
# - Berechnung durchführen, Funktion verwenden
prices = randomWalk(std_prices,history_prices)
# - Visualisiere den zufälligen Preisverlauf mit einem Liniendiagramm
plt.plot(prices[0],prices[1])
plt.title("random price walk")
plt.xlabel("day")
plt.ylabel("stock price")
Text(0, 0.5, 'stock price')

Ich kann diesen Vorgang wiederholen indem ich zusätzliche zufällige Kursverläufe neu berechne und so eine Monte-Carlo-Simulation der Aktienkursbewegungen erstelle. Im folgenden Beispiel wiederhole ich den Random-Walk-Vorgang für 30 separate Preisverläufe.

plt.figure()
for i in range(0,30):
    prices = randomWalk(std_prices,history_prices)
    plt.plot(prices[0],prices[1])
plt.title("monte-carlo simulation of stock price development")
plt.xlabel("day")
plt.ylabel("stock price")
Text(0, 0.5, 'stock price')

Leave a Reply

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht.

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

Close

Meta