Dos formas más en que se mueve el precio
Delta, gamma y vega cubren la acción y su volatilidad. Quedan dos datos de la fórmula de Black–Scholes: el plazo hasta el vencimiento y el tipo de interés. La theta es el cambio del valor de una opción al pasar el tiempo (la t de la fórmula se acorta cada día), y la rho es el cambio cuando se mueven los tipos. La theta suele ser la que se siente a diario: una opción larga es un activo que se desgasta, y la prima que pierde cada día es el precio de poseer la convexidad.
import math
def norm_cdf(x):
return 0.5 * (1 + math.erf(x / math.sqrt(2)))
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 d2(spot, strike, rate, sigma, t):
return d1(spot, strike, rate, sigma, t) - sigma * math.sqrt(t)
def call_theta(spot, strike, rate, sigma, t):
decay = -spot * norm_pdf(d1(spot, strike, rate, sigma, t)) * sigma / (2 * math.sqrt(t))
carry = -rate * strike * math.exp(-rate * t) * norm_cdf(d2(spot, strike, rate, sigma, t))
return decay + carry
theta = call_theta(100, 100, 0.05, 0.2, 1)
print(round(theta, 4)) # -6.414 per year
print(round(theta / 365, 4)) # -0.0176 per calendar dayTheta: por qué el tiempo duele
El primer término de la theta, -S * pdf(d1) * sigma / (2 * sqrt(T)), es el desgaste del *valor de la opción*: con menos tiempo hay menos opciones de un gran movimiento. El segundo, -r * K * exp(-rT) * N(d2), es el interés sobre el strike que aún no hay que pagar, que gana el comprador del call. Ambos son negativos para un call, y también la theta, y la pérdida no es constante: se acelera al acercarse el vencimiento, más rápido en las opciones en el dinero. Se cotiza por día natural, theta / 365.
# Theta per day for the same option as expiry approaches: the decay speeds up
import math
def norm_cdf(x):
return 0.5 * (1 + math.erf(x / math.sqrt(2)))
def norm_pdf(x):
return math.exp(-0.5 * x * x) / math.sqrt(2 * math.pi)
def call_theta(spot, strike, rate, sigma, t):
d_1 = (math.log(spot / strike) + (rate + 0.5 * sigma ** 2) * t) / (sigma * math.sqrt(t))
d_2 = d_1 - sigma * math.sqrt(t)
return -spot * norm_pdf(d_1) * sigma / (2 * math.sqrt(t)) - rate * strike * math.exp(-rate * t) * norm_cdf(d_2)
for days in (360, 90, 30, 7):
per_day = call_theta(100, 100, 0.05, 0.2, days / 365) / 365
print(days, "days left:", round(per_day, 4)) # 360: -0.0177, 90: -0.0288, 30: -0.045, 7: -0.0858Rho: el tipo de interés
La rho es K * T * exp(-rT) * N(d2): positiva para un call, porque un tipo más alto reduce el valor actual del strike que se pagará. Un put tiene el signo contrario. Es la griega más pequeña en opciones a corto plazo y cuenta en las largas (LEAPS, warrants a largo plazo). Se cotiza por punto porcentual de tipo, rho / 100, como la vega por punto de volatilidad.
# Rho of the one-year call at several rates: it grows with the rate and with the time left
import math
def norm_cdf(x):
return 0.5 * (1 + math.erf(x / math.sqrt(2)))
def call_rho(spot, strike, rate, sigma, t):
d_1 = (math.log(spot / strike) + (rate + 0.5 * sigma ** 2) * t) / (sigma * math.sqrt(t))
return strike * t * math.exp(-rate * t) * norm_cdf(d_1 - sigma * math.sqrt(t))
for rate in (0.0, 0.05, 0.10):
print("rate", rate, "rho per point:", round(call_rho(100, 100, rate, 0.2, 1) / 100, 4)) # 0.0: 0.4602, 0.05: 0.5323, 0.1: 0.5931
print("two years, 5%:", round(call_rho(100, 100, 0.05, 0.2, 2) / 100, 4)) # 1.0568# Check theta and rho by bumping the inputs: they are slopes of the price
import math
def norm_cdf(x):
return 0.5 * (1 + math.erf(x / math.sqrt(2)))
def bs_call(spot, strike, rate, sigma, t):
d_1 = (math.log(spot / strike) + (rate + 0.5 * sigma ** 2) * t) / (sigma * math.sqrt(t))
return spot * norm_cdf(d_1) - strike * math.exp(-rate * t) * norm_cdf(d_1 - sigma * math.sqrt(t))
h = 1e-5
theta = -(bs_call(100, 100, 0.05, 0.2, 1 + h) - bs_call(100, 100, 0.05, 0.2, 1 - h)) / (2 * h)
rho = (bs_call(100, 100, 0.05 + h, 0.2, 1) - bs_call(100, 100, 0.05 - h, 0.2, 1)) / (2 * h)
print(round(theta, 4), round(rho, 4)) # -6.414 53.2325theta ~ -0.5 * sigma^2 * S^2 * gamma (con tipo cero). Quien está largo en gamma apuesta, en efecto, a que la acción se moverá más que la volatilidad ya descontada.- La theta es el valor perdido con el tiempo: negativa para un call largo, más rápida cerca del vencimiento y en el dinero; se cotiza
theta / 365por día. - La rho es la sensibilidad al tipo de interés: positiva para calls, negativa para puts, mayor en plazos largos; se cotiza
rho / 100por punto. - Ambas son pendientes del precio: una pequeña perturbación de
toratepermite comprobar cualquier fórmula.
A continuación: la volatilidad implícita, usar la fórmula al revés para leer la volatilidad del mercado en el precio de una opción.
Lab: qué se califica
- Poner precio al paso del tiempo con
call_theta25 pts - Expresar el desgaste diario con
theta_per_day25 pts - Medir la sensibilidad a los tipos de interés con
call_rho25 pts - Expresar la rho por punto porcentual con
rho_per_point25 pts