σμ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 8 · Stochastische Modelle und Machine Learning›Thema 8.3·~55 Min.Fortgeschritten

Das Itô-Lemma

Position in der SkillModul 8 von 11 · Thema 3 von 10
8.3 Das Itô-Lemma
—Lab-Punkte— / 100XP gesamt—Serie—

Eine Kettenregel mit Haken

Wäre S eine glatte Funktion der Zeit, wäre die Änderung von f(S) gleich f'(S) * dS, die gewöhnliche Kettenregel. Aber dS enthält dW, und (dW)^2 = dt ist nicht vernachlässigbar: Es hat dieselbe Ordnung wie dt. Entwickelt man f(S + dS) bis zur zweiten Ordnung, bleibt der Term 0.5 * f''(S) * (dS)^2 übrig, und (dS)^2 = sigma^2 * S^2 * dt. Dieser Zusatzterm ist das Itô-Lemma, das Hauptwerkzeug zur Herleitung von Optionspreisen.

def ito_drift(s, mu, sigma, f_t, f_s, f_ss):
    return f_t + mu * s * f_s + 0.5 * sigma ** 2 * s ** 2 * f_ss

# f(S) = S: the drift is just mu * S (no curvature, no extra term)
print(ito_drift(100.0, 0.08, 0.2, 0.0, 1.0, 0.0))             # 8.0
# f(S) = S squared: f_S = 2 S and f_SS = 2, so the curvature term appears
print(ito_drift(100.0, 0.08, 0.2, 0.0, 2 * 100.0, 2.0))        # 1600 + 400 = 2000.0
# The drift for several functions of the price, S = 100, mu = 8%, sigma = 20%
def ito_drift(s, mu, sigma, f_t, f_s, f_ss):
    return f_t + mu * s * f_s + 0.5 * sigma ** 2 * s ** 2 * f_ss

s, mu, sigma = 100.0, 0.08, 0.2
print("S      ", ito_drift(s, mu, sigma, 0.0, 1.0, 0.0))                  # 8.0
print("S^2    ", ito_drift(s, mu, sigma, 0.0, 2 * s, 2.0))                # 2000.0
print("S^3    ", ito_drift(s, mu, sigma, 0.0, 3 * s ** 2, 6 * s))         # 240000 + 120000 = 360000.0
print("sqrt(S)", round(ito_drift(s, mu, sigma, 0.0, 0.5 / s ** 0.5, -0.25 / s ** 1.5), 4))    # 0.35 : curvature pulls it down

Der Log-Preis und Sigma-Quadrat durch zwei

Wendet man das Lemma auf f = ln S an, so ist f_t = 0, f_S = 1/S und f_SS = -1/S^2, also der Drift mu - 0.5 * sigma^2 und die Diffusion sigma: d ln S = (mu - sigma^2/2) dt + sigma dW. Der Log-Preis ist eine arithmetische Brownsche Bewegung, genau deshalb enthält die GBM-Lösung mu - sigma^2/2 im Exponenten. Die Konvexität von exp und die Konkavität von ln sind zwei Seiten derselben Tatsache.

def ito_drift(s, mu, sigma, f_t, f_s, f_ss):
    return f_t + mu * s * f_s + 0.5 * sigma ** 2 * s ** 2 * f_ss

def log_drift(mu, sigma):
    s = 1.0                                        # the answer does not depend on s
    return ito_drift(s, mu, sigma, 0.0, 1.0 / s, -1.0 / s ** 2)

print(log_drift(0.08, 0.20))                       # 0.06   = 0.08 - 0.5 * 0.2**2
print(round(log_drift(0.08, 0.60), 4))             # -0.1   a high volatility makes the typical growth negative

Das Lemma per Simulation prüfen

Man muss dem Lemma nicht blind vertrauen. Nehmen Sie viele zufällige Ein-Schritt-Bewegungen s_new = s + mu * s * dt + sigma * s * sqrt(dt) * z, berechnen Sie f(s_new) - f(s) für eine Funktion f, mitteln Sie und teilen Sie durch dt. Das Ergebnis konvergiert gegen den Drift aus dem Lemma. Lässt man bei f = S^2 den Krümmungsterm weg, weicht die Simulation sichtbar ab, die beste Art zu sehen, dass der Zusatzterm real ist.

import numpy as np

def mean_change_estimate(f, s, mu, sigma, dt, z):
    s_new = s + mu * s * dt + sigma * s * np.sqrt(dt) * z
    return float(np.mean(f(s_new) - f(s)) / dt)

half = np.random.default_rng(1).standard_normal(200_000)
z = np.concatenate([half, -half])                 # pairs of opposite draws: the noise at first order cancels
estimate = mean_change_estimate(lambda x: x ** 2, 100.0, 0.08, 0.2, 0.001, z)
print(round(estimate))                                       # about 2000
print(round(0.08 * 100.0 * 2 * 100.0))                       # 1600  the ordinary chain rule alone: the curvature term (400) is missing
Warum es für Optionen wichtig istUm eine Option zu bewerten, wendet man das Lemma auf ihren Wert V(S, t) an. Der Drift enthält V_t, mu * S * V_S und 0.5 * sigma^2 * S^2 * V_SS; Delta-Hedging entfernt den dW-Term, und es ergibt sich die Black-Scholes-Gleichung, in der die Greeks der früheren Themen stecken: Theta, Delta und Gamma. Der risikolose Zins ersetzt mu, und die erwartete Rendite der Aktie fällt aus dem Preis heraus.
  • Itô-Lemma: Der Drift von f(S, t) ist f_t + mu * S * f_S + 0.5 * sigma^2 * S^2 * f_SS, der Rauschkoeffizient sigma * S * f_S.
  • Der Krümmungsterm existiert, weil (dW)^2 = dt; für ln S ergibt er den Drift mu - sigma^2 / 2 der GBM-Lösung.
  • Per Simulation prüfen: Der Mittelwert von f(s_new) - f(s) über dt stimmt mit dem Lemma überein; auf einen Optionswert angewandt ergibt es Black-Scholes.

Als Nächstes: asiatische Optionen, deren Auszahlung vom Durchschnittspreis über die Laufzeit abhängt.

Lab: Was bewertet wird

  • Mit ito_drift den Drift einer Funktion finden25 Pkt.
  • Mit ito_diffusion den Rauschkoeffizienten finden25 Pkt.
  • Mit log_drift auf den Log-Preis anwenden25 Pkt.
  • Mit mean_change_estimate per Simulation prüfen25 Pkt.
Explorer · lab-104-1
▾ lab-104-1
…
bash · im Browser
learner@quantcraft:~/lab-104-1$
Python noch nicht geladenPythonLn 1, Col 1Spaces: 4UTF-8

Dieses Thema zurücksetzen?

Alles in lab-104-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