El dato que nadie puede observar
En la fórmula de Black–Scholes el precio al contado, el strike, el tipo y el tiempo se conocen. La volatilidad no: es la expectativa del mercado sobre el movimiento futuro, y cambia cada día. El precio de una opción depende, pues, mucho de un número que hay que adivinar, y la sensibilidad a él, la vega, dC/dsigma, suele ser el mayor riesgo de un libro de opciones. En Black–Scholes es S * pdf(d1) * sqrt(T), igual para calls y puts, y positiva: más volatilidad siempre hace más valiosa una opción.
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 vega(spot, strike, rate, sigma, t):
return spot * norm_pdf(d1(spot, strike, rate, sigma, t)) * math.sqrt(t)
print(round(vega(100, 100, 0.05, 0.2, 1), 4)) # 37.524 per change of 1.00 in sigma (100 volatility points)
print(round(vega(100, 100, 0.05, 0.2, 1) / 100, 4)) # 0.3752 per volatility point: sigma from 20% to 21%Dónde es mayor la vega
La vega es máxima para opciones en el dinero, donde el resultado es más incierto y la volatilidad extra cambia más, y se desvanece para opciones muy dentro o fuera del dinero (strike 80: 23,8; strike 100: 37,5; strike 120: 21,6). A diferencia de la gamma, la vega crece con el plazo hasta el vencimiento: 19,6 a tres meses, 37,5 a un año, 62,5 a cuatro años, porque una vida más larga da más tiempo a la volatilidad para importar. Las opciones a largo plazo son, pues, las más expuestas a cambios de volatilidad, mientras que las de corto plazo lo están a la gamma.
for strike in (80, 100, 120):
print("strike", strike, round(vega(100, strike, 0.05, 0.2, 1), 3))
# strike 80 23.806
# strike 100 37.524
# strike 120 21.601
for t in (0.25, 1, 4):
print("t", t, round(vega(100, 100, 0.05, 0.2, t), 3))
# t 0.25 19.644
# t 1 37.524
# t 4 62.451 vega grows with time to expiryMedirla y usarla
La volatilidad se cotiza en puntos porcentuales, así que las mesas de riesgo citan la vega por punto: vega / 100, el cambio de precio cuando la volatilidad pasa del 20 % al 21 %. Un salto de 10 puntos de volatilidad, como en un susto de mercado, mueve la opción en el dinero unos 0,375 * 10 = 3,75, casi el 36 % de su precio. Como con delta y gamma, se puede medir la vega de cualquier modelo perturbando: valorar con sigma + h y sigma - h y tomar la diferencia central. La estimación lineal falla algo en grandes movimientos, porque el precio también es curvo en volatilidad.
def bs_call(spot, strike, rate, sigma, t):
d_1 = d1(spot, strike, rate, sigma, t)
return spot * 0.5 * (1 + math.erf(d_1 / math.sqrt(2))) - strike * math.exp(-rate * t) * 0.5 * (1 + math.erf((d_1 - sigma * math.sqrt(t)) / math.sqrt(2)))
def numerical_vega(price_function, sigma, bump):
return (price_function(sigma + bump) - price_function(sigma - bump)) / (2 * bump)
price = lambda s: bs_call(100, 100, 0.05, s, 1)
print(round(numerical_vega(price, 0.2, 1e-4), 4)) # 37.524 the same as the formula
per_point = vega(100, 100, 0.05, 0.2, 1) / 100
print(round(per_point * 10, 3), round(price(0.30) - price(0.20), 3)) # 3.752 3.781 linear estimate vs exact, for +10 points# Vega of a put equals vega of a call: build the put price from parity and bump the volatility
put_price = lambda s: bs_call(100, 100, 0.05, s, 1) - 100 + 100 * math.exp(-0.05)
print(round(numerical_vega(put_price, 0.2, 1e-4), 4)) # 37.524 the same number as for the call- Vega =
S * pdf(d1) * sqrt(T): positiva, igual para calls y puts, máxima en el dinero y creciente con el plazo. - Cótala por punto de volatilidad (
vega / 100); numéricamente,(f(sigma + h) - f(sigma - h)) / (2h)sirve para cualquier modelo. - Cambio de precio ~
vega_por_punto * puntos: un salto de volatilidad importa tanto como un movimiento de la acción; la volatilidad implícita es la cotización del mercado.
A continuación: theta y rho, las sensibilidades al tiempo y a los tipos de interés.
Lab: qué se califica
- Medir la sensibilidad a la volatilidad con
vega25 pts - Expresar la vega por punto de volatilidad con
vega_per_point25 pts - Perturbar la volatilidad con
numerical_vega25 pts - Prever el efecto de un movimiento de volatilidad con
price_change_from_vol25 pts