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 downDer 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 negativeDas 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 missingV(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)istf_t + mu * S * f_S + 0.5 * sigma^2 * S^2 * f_SS, der Rauschkoeffizientsigma * S * f_S. - Der Krümmungsterm existiert, weil
(dW)^2 = dt; fürln Sergibt er den Driftmu - sigma^2 / 2der GBM-Lösung. - Per Simulation prüfen: Der Mittelwert von
f(s_new) - f(s)überdtstimmt 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_driftden Drift einer Funktion finden25 Pkt. - Mit
ito_diffusionden Rauschkoeffizienten finden25 Pkt. - Mit
log_driftauf den Log-Preis anwenden25 Pkt. - Mit
mean_change_estimateper Simulation prüfen25 Pkt.