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 stockMedir 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 formulaCubrirse 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]- Delta del call
N(d1)en (0, 1); delta del putN(d1) - 1en (-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énhpequeño pero por encima del ruido de redondeo. - Acciones de cobertura =
-contratos * multiplicador * deltadeja 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