La delta no es constante
Una cobertura delta solo es exacta un instante. En cuanto se mueve la acción, la delta de la opción cambia y la cobertura es errónea. La gamma es la tasa de cambio de la delta con la acción: gamma = d(delta)/dS, la segunda derivada del precio. Un call o put largo tiene gamma positiva. En Black–Scholes es pdf(d1) / (S * sigma * sqrt(T)), igual para calls y puts, donde pdf es la densidad de la campana. Una gamma grande significa que la cobertura caduca rápido y debe ajustarse a menudo.
import math
def norm_pdf(x):
return math.exp(-0.5 * x * x) / math.sqrt(2 * math.pi)
def d1(spot, strike, rate, sigma, t):
return (math.log(spot / strike) + (rate + 0.5 * sigma ** 2) * t) / (sigma * math.sqrt(t))
def gamma(spot, strike, rate, sigma, t):
return norm_pdf(d1(spot, strike, rate, sigma, t)) / (spot * sigma * math.sqrt(t))
for spot in (80, 90, 100, 110, 120):
print(spot, round(gamma(spot, 100, 0.05, 0.2, 1), 5))
# 80 0.0186
# 90 0.02182
# 100 0.01876
# 110 0.01289
# 120 0.0075 gamma peaks near the strike and fades far from itLa gamma crece al acercarse el vencimiento
Para una opción en el dinero, la gamma sube mucho al acercarse el vencimiento: 0,019 con un año por delante, 0,039 con tres meses, 0,141 con una semana. Cerca del vencimiento la opción es casi un cara o cruz entre no valer nada y valer todo el movimiento, así que la delta pasa de 0 a 1 en un rango de precios minúsculo. Por eso los traders vendidos en opciones cerca del vencimiento (gamma corta) duermen mal: la cobertura necesita ajustes constantes y un salto duele. También se puede estimar la gamma de cualquier modelo con la diferencia segunda (f(S + h) - 2 f(S) + f(S - h)) / h², exacta para una parábola.
for t in (1, 0.25, 0.02):
print(t, round(gamma(100, 100, 0.05, 0.2, t), 5))
# 1 0.01876
# 0.25 0.03929
# 0.02 0.14087 a week before expiry the at-the-money gamma is 7 times larger
def numerical_gamma(price_function, spot, bump):
return (price_function(spot + bump) - 2 * price_function(spot) + price_function(spot - bump)) / bump ** 2
price = lambda s: bs_call(s, 100, 0.05, 0.2, 1) # bs_call as in the previous topic
print(round(numerical_gamma(price, 100, 0.5), 5)) # 0.01876 the same as the formulaLo que gana la gamma
Como la delta cambia con la acción, una opción larga gana más de lo que predice la delta sola, se mueva la acción hacia donde se mueva. Una subida de 5 $ lleva la delta de 0,637 a 0,637 + 0,01876 * 5 = 0,731. El beneficio de un movimiento es delta * movimiento + 0,5 * gamma * movimiento²: el segundo término es el beneficio de gamma de una opción larga (una pérdida para una corta). Crece con el cuadrado del movimiento, así que los movimientos grandes, en cualquier sentido, favorecen el lado largo en gamma. Ese beneficio no es gratis: el titular lo paga con la prima de la opción y su desgaste temporal.
g = gamma(100, 100, 0.05, 0.2, 1)
delta = call_delta(100, 100, 0.05, 0.2, 1) # as in the delta topic
print(round(delta, 4), round(delta + g * 5, 4)) # 0.6368 0.7306 the delta after a $5 rise
print(round(call_delta(105, 100, 0.05, 0.2, 1), 4)) # 0.7237 the exact delta at 105 (gamma is a first-order guide)
move = 5
true_gain = bs_call(105, 100, 0.05, 0.2, 1) - bs_call(100, 100, 0.05, 0.2, 1)
print(round(true_gain - delta * move, 4), round(0.5 * g * move ** 2, 4)) # 0.2232 0.2345 what delta missed, and what gamma explains# Dollar gamma: how many dollars of stock the delta hedge changes for a 1% move of the stock at 100
print(round(g * 100 ** 2 / 100, 3)) # 1.876- Gamma =
pdf(d1) / (S * sigma * sqrt(T)), segunda derivada del precio; igual para calls y puts, máxima cerca del strike y del vencimiento. - Gamma numérica
(f(S + h) - 2 f(S) + f(S - h)) / h²; delta tras un movimientodelta + gamma * movimiento. - Un movimiento da
delta * movimiento + 0,5 * gamma * movimiento²: una opción larga gana con grandes movimientos en ambos sentidos, y lo paga con desgaste temporal.
A continuación: la vega, la sensibilidad a la volatilidad, el dato que nadie puede observar directamente.
Lab: qué se califica
- Medir qué tan rápido cambia la delta con
gamma25 pts - Medir la curvatura de cualquier precio con
numerical_gamma25 pts - Actualizar la delta tras un movimiento con
delta_after_move25 pts - Cuantificar el beneficio de la curvatura con
gamma_pnl25 pts