Le delta n'est pas constant
Une couverture en delta n'est exacte qu'un instant. Dès que l'action bouge, le delta de l'option change et la couverture est fausse. Le gamma est le taux de variation du delta avec l'action : gamma = d(delta)/dS, la dérivée seconde du prix. Un call ou un put long a un gamma positif. Dans Black–Scholes, il vaut pdf(d1) / (S * sigma * sqrt(T)), identique pour les calls et les puts, où pdf est la densité de la cloche. Un gamma élevé signifie que la couverture se périme vite et doit être ajustée souvent.
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 itLe gamma augmente à l'approche de l'échéance
Pour une option à la monnaie, le gamma augmente fortement à l'approche de l'échéance : 0,019 à un an, 0,039 à trois mois, 0,141 à une semaine. Près de l'échéance, l'option est presque un pile ou face entre sans valeur et valant tout le mouvement, si bien que le delta passe de 0 à 1 sur un intervalle de prix minuscule. C'est pourquoi les traders vendeurs d'options près de l'échéance (gamma court) dorment mal : la couverture demande des ajustements constants et un saut fait mal. On peut aussi estimer le gamma de tout modèle par la différence seconde (f(S + h) - 2 f(S) + f(S - h)) / h², exacte pour une parabole.
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 formulaCe que rapporte le gamma
Comme le delta change avec l'action, une option longue gagne plus que ne le prédit le seul delta, quel que soit le sens du mouvement de l'action. Une hausse de 5 $ fait passer le delta de 0,637 à 0,637 + 0,01876 * 5 = 0,731. Le profit d'un mouvement est delta * mouvement + 0,5 * gamma * mouvement² : le second terme est le profit de gamma d'une option longue (une perte pour une option courte). Il croît avec le carré du mouvement : les grands mouvements, dans un sens ou l'autre, favorisent le côté long gamma. Ce profit n'est pas gratuit : le détenteur le paie par la prime de l'option et par son érosion temporelle.
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)), dérivée seconde du prix ; identique pour calls et puts, maximal près du prix d'exercice et de l'échéance. - Gamma numérique
(f(S + h) - 2 f(S) + f(S - h)) / h²; delta après un mouvementdelta + gamma * mouvement. - Un mouvement rapporte
delta * mouvement + 0,5 * gamma * mouvement²: une option longue gagne des grands mouvements dans les deux sens, et le paie en érosion temporelle.
À suivre : le véga, la sensibilité à la volatilité, l'entrée que personne ne peut observer directement.
Lab : ce qui est noté
- Mesurer la vitesse de variation du delta avec
gamma25 pts - Mesurer la courbure d'un prix quelconque avec
numerical_gamma25 pts - Mettre à jour le delta après un mouvement avec
delta_after_move25 pts - Chiffrer le bénéfice de la courbure avec
gamma_pnl25 pts