Antworten mit Mittelwerten von Zufallsziehungen
Viele Finanzfragen haben keine saubere Formel: die Chance, dass ein Portfolio binnen eines Jahres 20 % verliert, der Preis einer Option, deren Auszahlung vom gesamten Pfad abhängt. Monte Carlo beantwortet sie mit roher Gewalt. Schreiben Sie die Größe als Mittelwert E[f(X)], simulieren Sie viele Ziehungen von X, wenden Sie f auf jede an und bilden Sie den Durchschnitt. Nach dem Gesetz der großen Zahlen konvergiert das Stichprobenmittel gegen den wahren Erwartungswert. Eine Wahrscheinlichkeit ist nur der Erwartungswert eines Ja/Nein-Indikators, „der Anteil der Simulationen, in denen das Ereignis eintrat“ schätzt sie also.
import math
import numpy as np
# Estimate pi: the quarter circle x^2 + y^2 <= 1 covers pi/4 of the unit square
rng = np.random.default_rng(42)
x, y = rng.random(100000), rng.random(100000)
inside = x ** 2 + y ** 2 <= 1 # True/False for every point
print(round(4 * inside.mean(), 4)) # 3.1378 close to 3.1416, with 100,000 pointsPreise und Wahrscheinlichkeiten simulieren
Um eine Aktie zu simulieren, ziehen Sie standardnormale Schocks und schicken sie durch die Lognormal-Formel des vorigen Themas: Alle n Endpreise ergeben sich aus einem einzigen Array-Ausdruck. Danach wird jede Frage zur Preisverteilung zu einem Mittelwert über das Array. Die Wahrscheinlichkeit, unter 80 zu enden, ist np.mean(prices < 80), der erwartete Preis prices.mean() und ein Quantil der Verluste np.quantile(...). Reichen Sie den Generator rng in die Funktion hinein, statt ihn darin zu erzeugen, damit der Aufrufer die Wiederholbarkeit steuert.
def simulate_terminal_prices(rng, s0, mu, sigma, t, n):
z = rng.standard_normal(n)
return s0 * np.exp((mu - 0.5 * sigma ** 2) * t + sigma * math.sqrt(t) * z)
prices = simulate_terminal_prices(np.random.default_rng(1), 100, 0.05, 0.2, 1, 200000)
print(round(float(np.mean(prices < 80)), 4)) # 0.1027 P(price below 80 after a year), about 10%
print(round(float(np.mean(prices > 130)), 4)) # 0.1216 P(price above 130)Eine Option bewerten
Ein europäischer Call zahlt bei Fälligkeit max(S - K, 0). In der risikoneutralen Welt wächst jeder Wert mit dem risikofreien Zins rate, der faire Preis ist also der abgezinste erwartete Auszahlungsbetrag: Endpreise mit mu = rate simulieren, die Auszahlung jedes Pfads berechnen, mitteln und mit exp(-rate * t) multiplizieren. Für diese einfache Option gibt es eine geschlossene Formel (Black-Scholes, 10,4506 für die Zahlen unten), und die Simulation kommt ihr nahe. Der Sinn von Monte Carlo ist, dass dieselben wenigen Zeilen auch für Auszahlungen ganz ohne Formel funktionieren.
def mc_call_price(rng, s0, strike, rate, sigma, t, n):
prices = simulate_terminal_prices(rng, s0, rate, sigma, t, n) # risk-neutral: the price grows at the risk-free rate
payoff = np.maximum(prices - strike, 0) # max(S - K, 0) for every simulated path
return math.exp(-rate * t) * payoff.mean() # discounted average payoff
price = mc_call_price(np.random.default_rng(1), 100, 100, 0.05, 0.2, 1, 200000)
print(round(price, 4)) # 10.3993 the exact Black-Scholes price is 10.4506: the difference is Monte Carlo error# More points, less error (1 / sqrt(n)): the estimate of pi with the same seed
for n in (100, 10000, 1000000):
g = np.random.default_rng(42)
x, y = g.random(n), g.random(n)
print(n, round(4 * float((x * x + y * y <= 1).mean()), 4))
# 100 3.36
# 10000 3.1488
# 1000000 3.1424- Monte Carlo: Größe als Mittelwert
E[f(X)]schreiben, viele Ziehungen simulieren,fanwenden, Mittel bilden. - Eine Wahrscheinlichkeit ist der Mittelwert eines Vergleichs:
np.mean(prices < 80); reichen Sie den Generator hinein, damit der Lauf wiederholbar ist. - Optionspreis =
exp(-rate * t) * mean(max(S - K, 0))mit beimu = ratesimulierten Preisen; geben Sie auch den Fehler an.
Als Nächstes: Monte-Carlo-Fehler und Konvergenz, wie genau eine Schätzung ist und wie man mehr für weniger bekommt.
Lab: Was bewertet wird
- Mit
estimate_piPfeile auf ein Quadrat werfen, um pi zu finden25 Pkt. - Mit
estimate_probabilityzählen, wie oft ein Ereignis eintritt25 Pkt. - Mit
simulate_terminal_pricessimulieren, wo eine Aktie landen könnte25 Pkt. - Mit
mc_call_priceeine Option per Simulation bewerten25 Pkt.