σμ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 AcademyRutas
Ctrl K
AO
+1,2 k estudiantes
Iniciar sesiónUnirse ↗
Rutas
AO
+1,2 k estudiantes
Iniciar sesión
  • English
  • Français
  • Español
  • العربية
  • Português
  • Deutsch
  • 日本語
  • 中文
Ruta de Python›Módulo 8 · Modelos estocásticos y aprendizaje automático›Tema 8.3·~55 minAvanzado

El lema de Itô

Posición en la rutaMódulo 8 de 11 · Tema 3 de 10
8.3 El lema de Itô
—Puntuación del lab— / 100XP total—Racha—

Una regla de la cadena con trampa

Si S fuera una función suave del tiempo, el cambio de f(S) sería f'(S) * dS, la regla de la cadena ordinaria. Pero dS contiene dW, y (dW)^2 = dt no es despreciable: es del mismo orden que dt. Al desarrollar f(S + dS) a segundo orden sobrevive el término 0.5 * f''(S) * (dS)^2, y (dS)^2 = sigma^2 * S^2 * dt. Ese término extra es el lema de Itô, la herramienta principal para deducir precios de opciones.

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

El logaritmo del precio y sigma al cuadrado entre dos

Apliquemos el lema a f = ln S. Aquí f_t = 0, f_S = 1/S y f_SS = -1/S^2, así que la deriva es mu - 0.5 * sigma^2 y la difusión sigma: d ln S = (mu - sigma^2/2) dt + sigma dW. El logaritmo del precio es un movimiento browniano aritmético, que es exactamente por qué la solución del MBG tiene mu - sigma^2/2 en el exponente. La convexidad de exp y la concavidad de ln son dos caras del mismo hecho.

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

Comprobar el lema por simulación

No hace falta creer el lema sin más. Toma muchos movimientos aleatorios de un paso s_new = s + mu * s * dt + sigma * s * sqrt(dt) * z, calcula f(s_new) - f(s) para una función f, promedia y divide por dt. El resultado converge a la deriva del lema. Con f = S^2 y el término de curvatura omitido, la simulación discrepa visiblemente, la mejor forma de ver que el término extra es real.

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
Por qué importa para las opcionesPara valorar una opción se aplica el lema a su valor V(S, t). La deriva contiene V_t, mu * S * V_S y 0.5 * sigma^2 * S^2 * V_SS; la cobertura delta elimina el término en dW, y queda la ecuación de Black–Scholes, que contiene las griegas de los temas anteriores: theta, delta y gamma. El tipo libre de riesgo sustituye a mu, y el rendimiento esperado de la acción desaparece del precio.
  • Lema de Itô: la deriva de f(S, t) es f_t + mu * S * f_S + 0.5 * sigma^2 * S^2 * f_SS y el coeficiente del ruido sigma * S * f_S.
  • El término de curvatura existe porque (dW)^2 = dt; para ln S da la deriva mu - sigma^2 / 2 de la solución del MBG.
  • Verifique por simulación: el promedio de f(s_new) - f(s) sobre dt coincide con el lema; aplicado al valor de una opción da Black–Scholes.

A continuación: las opciones asiáticas, cuyo pago depende del precio medio durante la vida de la opción.

Lab: qué se califica

  • Hallar la deriva de una función con ito_drift25 pts
  • Hallar el coeficiente del ruido con ito_diffusion25 pts
  • Aplicarlo al logaritmo del precio con log_drift25 pts
  • Comprobarlo por simulación con mean_change_estimate25 pts
Explorador · lab-104-1
▾ lab-104-1
…
bash · en el navegador
learner@quantcraft:~/lab-104-1$
Python aún no cargadoPythonLn 1, Col 1Spaces: 4UTF-8

¿Restablecer este tema?

Todo lo que hay en lab-104-1 vuelve a los archivos iniciales y se limpia el terminal. Tu solución actual se perderá: no se puede deshacer.

Se restablecerá
  • main.py → código inicial
  • Historial del terminal y salida de pruebas
  • Cambios sin enviar
Se conservará
  • Mejor puntuación del lab
  • Tu XP y tu racha
  • Progreso de la lección y notas

Inicia sesión para ejecutar tu código.

Todas las clases se pueden leer gratis. Crea una cuenta o inicia sesión para ejecutar código, lanzar las pruebas y enviar este lab.

  • IDE en el navegador con terminal bash — sin instalar nada
  • Corrección instantánea, XP y tu lugar en la ruta
Crear una cuentaIniciar sesión
O
Continuar con GitHub