σμ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 4 · Valoración de renta fija y opciones›Tema 4.9·~45 minIntermedio

Delta

Posición en la rutaMódulo 4 de 11 · Tema 9 de 16
4.9 Delta
—Puntuación del lab— / 100XP total—Racha—

La sensibilidad a la acción

Un trader que posee opciones necesita saber qué pasa con la cuenta cuando se mueve la acción. La delta es la respuesta: el cambio del precio de la opción por un movimiento de una unidad de la acción, dC/dS. Un call tiene una delta entre 0 y 1, un put entre -1 y 0. En el modelo de Black–Scholes la delta del call es simplemente N(d1) y la del put N(d1) - 1. Un call a un año en el dinero con delta 0,64 gana unos 64 centavos cuando la acción sube un dólar. La delta también se lee como aproximadamente la probabilidad de que la opción acabe en el dinero.

import math

def norm_cdf(x):
    return 0.5 * (1 + math.erf(x / math.sqrt(2)))

def d1(spot, strike, rate, sigma, t):
    return (math.log(spot / strike) + (rate + 0.5 * sigma ** 2) * t) / (sigma * math.sqrt(t))

def call_delta(spot, strike, rate, sigma, t):
    return norm_cdf(d1(spot, strike, rate, sigma, t))

for spot in (80, 90, 100, 110, 120):
    delta = call_delta(spot, 100, 0.05, 0.2, 1)
    print(spot, round(delta, 4), round(delta - 1, 4))      # the call delta and the put delta
# 80 0.2219 -0.7781
# 90 0.4298 -0.5702
# 100 0.6368 -0.3632
# 110 0.7958 -0.2042
# 120 0.8965 -0.1035     deep in the money: the call moves almost one for one with the stock

Medir la delta perturbando

Solo existe fórmula cerrada para opciones simples. Para cualquier modelo de valoración se puede estimar la delta numéricamente: valora la opción con la acción algo más alta y algo más baja y divide por la distancia. La diferencia central (f(S + h) - f(S - h)) / (2h) es más precisa que la unilateral, y exacta para una parábola. La misma función sirve para un precio Monte Carlo o un árbol binomial, así que este «perturbar y revalorar» es la forma universal de obtener sensibilidades. Elige h pequeño, pero no tanto que domine el ruido de redondeo (el 1 % del precio es un inicio típico).

def bs_call(spot, strike, rate, sigma, t):
    d_1 = d1(spot, strike, rate, sigma, t)
    return spot * norm_cdf(d_1) - strike * math.exp(-rate * t) * norm_cdf(d_1 - sigma * math.sqrt(t))

def numerical_delta(price_function, spot, bump):
    return (price_function(spot + bump) - price_function(spot - bump)) / (2 * bump)

price = lambda s: bs_call(s, 100, 0.05, 0.2, 1)          # any function of the spot price will do
print(round(numerical_delta(price, 100, 0.01), 6))        # 0.636831
print(round(call_delta(100, 100, 0.05, 0.2, 1), 6))       # 0.636831   the same as the formula

Cubrirse con la delta

La delta convierte una posición en opciones en una posición equivalente en acciones. Un contrato de call sobre 100 acciones con delta 0,64 se comporta como poseer 64 acciones para movimientos pequeños. Para eliminar la exposición, toma la posición contraria: con 10 contratos de call largos, vende 10 * 100 * 0,6368 = 637 acciones. La cartera cubierta es neutral en delta: un pequeño movimiento de la acción deja su valor casi sin cambios. La cobertura solo es correcta para el precio actual, así que debe ajustarse cuando se mueven la acción y la delta. Con qué frecuencia reequilibrar es un equilibrio entre riesgo y costes de negociación.

def hedge_shares(contracts, delta, multiplier=100):
    return -contracts * multiplier * delta

delta = call_delta(100, 100, 0.05, 0.2, 1)
print(round(hedge_shares(10, delta), 1))            # -636.8   long 10 call contracts: sell about 637 shares
print(round(hedge_shares(-10, delta), 1))           # 636.8    short 10 call contracts: buy about 637 shares

# After a $1 move the options gain about delta * 1 each and the shares lose about the same
print(round(bs_call(101, 100, 0.05, 0.2, 1) - bs_call(100, 100, 0.05, 0.2, 1), 4))    # 0.6461   close to delta, not exactly
# Delta as expiry approaches: at the money it stays near 0.5, in the money it goes to 1, out of the money to 0
for t in (1, 0.25, 0.02):
    print(t, [round(call_delta(spot, 100, 0.05, 0.2, t), 4) for spot in (90, 100, 110)])
# 1 [0.4298, 0.6368, 0.7958]
# 0.25 [0.1898, 0.5695, 0.8704]
# 0.02 [0.0001, 0.5197, 0.9997]
La delta cambia y la cobertura se desgastaLa delta es solo el efecto de primer orden. El call que tenía una delta de 0,64 en 100 tiene 0,80 en 110 y 0,43 en 90, así que una cobertura fijada en 100 es errónea tras un gran movimiento, y la delta también deriva con el tiempo (la delta de una opción fuera del dinero se funde hacia 0 cerca del vencimiento). La velocidad a la que cambia la delta es la siguiente sensibilidad: la gamma.
  • Delta del call N(d1) en (0, 1); delta del put N(d1) - 1 en (-1, 0): el equivalente en acciones de una opción.
  • Delta numérica (f(S + h) - f(S - h)) / (2h): sirve para cualquier modelo de valoración; mantén h pequeño pero por encima del ruido de redondeo.
  • Acciones de cobertura = -contratos * multiplicador * delta deja la cartera neutral en delta para movimientos pequeños; reequilibra cuando cambie la delta.

A continuación: la gamma, la sensibilidad de la propia delta, que dice con qué rapidez caduca una cobertura.

Lab: qué se califica

  • Medir la sensibilidad de un call a la acción con call_delta25 pts
  • Deducir la delta del put con put_delta25 pts
  • Perturbar el precio para medir la delta con numerical_delta25 pts
  • Neutralizar la posición con hedge_shares25 pts
Explorador · lab-74-1
▾ lab-74-1
…
bash · en el navegador
learner@quantcraft:~/lab-74-1$
Python aún no cargadoPythonLn 1, Col 1Spaces: 4UTF-8

¿Restablecer este tema?

Todo lo que hay en lab-74-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