σμimplied vol · KKmax(S−K,0)udβρᵢⱼfat tailsPnL · drawdownyield · TdSₜ = μSₜ dt + σSₜ dWₜC = S·N(d₁) − K·e⁻ʳᵀ·N(d₂)σₚ² = wᵀΣwd₁ = [ln(S/K) + (r + σ²⁄2)T] ⁄ σ√T∂V/∂t + ½σ²S²·∂²V/∂S² + rS·∂V/∂S − rV = 0Sharpe = (Rₚ − R_f) ⁄ σₚVaR₉₉ = μ − 2.33σρ = Cov(X,Y) ⁄ σₓσᵧE[Rₚ] = Σ wᵢ·E[Rᵢ]φ(x) = e^(−x²/2) ⁄ √2πE[Rᵢ] = R_f + βᵢ(E[Rₘ] − R_f)dXₜ = θ(μ − Xₜ)dt + σ dWₜσ²ₜ = ω + α·ε²ₜ₋₁ + β·σ²ₜ₋₁C − P = S − K·e⁻ʳᵀΔ = ∂V/∂S Γ = ∂²V/∂S²p = (e^(rΔt) − d) ⁄ (u − d)rₜ = ln(Pₜ ⁄ Pₜ₋₁)E[Xₜ₊₁ | ℱₜ] = Xₜf* = (bp − q) ⁄ bz = (x − μ) ⁄ σP(N=k) = λᵏe^(−λ) ⁄ k!Θ = −∂V/∂Tν = S·φ(d₁)·√Tmin wᵀΣw s.t. wᵀμ = μ*∫Σ∂∞λ
σμimplied vol · KKmax(S−K,0)udβρᵢⱼfat tailsPnL · drawdownyield · TdSₜ = μSₜ dt + σSₜ dWₜC = S·N(d₁) − K·e⁻ʳᵀ·N(d₂)σₚ² = wᵀΣwd₁ = [ln(S/K) + (r + σ²⁄2)T] ⁄ σ√T∂V/∂t + ½σ²S²·∂²V/∂S² + rS·∂V/∂S − rV = 0Sharpe = (Rₚ − R_f) ⁄ σₚVaR₉₉ = μ − 2.33σρ = Cov(X,Y) ⁄ σₓσᵧE[Rₚ] = Σ wᵢ·E[Rᵢ]φ(x) = e^(−x²/2) ⁄ √2πE[Rᵢ] = R_f + βᵢ(E[Rₘ] − R_f)dXₜ = θ(μ − Xₜ)dt + σ dWₜσ²ₜ = ω + α·ε²ₜ₋₁ + β·σ²ₜ₋₁C − P = S − K·e⁻ʳᵀΔ = ∂V/∂S Γ = ∂²V/∂S²p = (e^(rΔt) − d) ⁄ (u − d)rₜ = ln(Pₜ ⁄ Pₜ₋₁)E[Xₜ₊₁ | ℱₜ] = Xₜf* = (bp − q) ⁄ bz = (x − μ) ⁄ σP(N=k) = λᵏe^(−λ) ⁄ k!Θ = −∂V/∂Tν = S·φ(d₁)·√Tmin wᵀΣw s.t. wᵀμ = μ*∫Σ∂∞λ
uantCraft AcademySkills
Ctrl K
AO
+1,2 Tsd. Lernende
AnmeldenBeitreten ↗
Skills
AO
+1,2 Tsd. Lernende
Anmelden
  • English
  • Français
  • Español
  • العربية
  • Português
  • Deutsch
  • 日本語
  • 中文
Python-Skill›Modul 3 · Wahrscheinlichkeit & Monte-Carlo-Simulation›Thema 3.11·~50 Min.Mittelstufe

Monte-Carlo-Schätzung

Position in der SkillModul 3 von 11 · Thema 11 von 12
3.11 Monte-Carlo-Schätzung
—Lab-Punkte— / 100XP gesamt—Serie—

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 points

Preise 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
Schätzungen haben FehlerEin Monte-Carlo-Ergebnis ist eine Zufallszahl: Mit einem anderen Seed erhalten Sie eine leicht andere (hier 3,1378 für pi, exakt ist 3,1416). Es sagt nicht, wie weit es danebenliegt. Das nächste Thema misst diesen Fehler und zeigt, wie er mit der Zahl der Ziehungen schrumpft; geben Sie daher nie einen simulierten Wert ohne Standardfehler an.
  • Monte Carlo: Größe als Mittelwert E[f(X)] schreiben, viele Ziehungen simulieren, f anwenden, 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 bei mu = rate simulierten 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_pi Pfeile auf ein Quadrat werfen, um pi zu finden25 Pkt.
  • Mit estimate_probability zählen, wie oft ein Ereignis eintritt25 Pkt.
  • Mit simulate_terminal_prices simulieren, wo eine Aktie landen könnte25 Pkt.
  • Mit mc_call_price eine Option per Simulation bewerten25 Pkt.
Explorer · lab-64-1
▾ lab-64-1
…
bash · im Browser
learner@quantcraft:~/lab-64-1$
Python noch nicht geladenPythonLn 1, Col 1Spaces: 4UTF-8

Dieses Thema zurücksetzen?

Alles in lab-64-1 wird auf die Startdateien zurückgesetzt und das Terminal geleert. Ihre aktuelle Lösung geht verloren – das lässt sich nicht rückgängig machen.

Wird zurückgesetzt
  • main.py → Startcode
  • Terminal-Verlauf und Testausgabe
  • Nicht eingereichte Änderungen
Bleibt erhalten
  • Beste Lab-Punktzahl
  • Ihre XP und Ihre Serie
  • Vorlesungsfortschritt und Notizen

Melde dich an, um deinen Code auszuführen.

Alle Lektionen kannst du kostenlos lesen. Erstelle ein Konto oder melde dich an, um Code auszuführen, Tests zu starten und dieses Lab abzugeben.

  • IDE im Browser mit Bash-Terminal — nichts zu installieren
  • Sofortige Bewertung, XP und dein Platz auf der Skill
Konto erstellenAnmelden
ODER
Weiter mit GitHub