La ecuación de paridad put-call dice que call - put = spot - discount*strike
. Cuando encajo una línea en el mercado medio call - put
y strike
(de las opciones del SPX) el precio al contado (la intersección x) que obtengo de esto es ligeramente inferior al precio al contado real, y es más bajo cuanto más larga es la fecha de la opción. Un LEAP a dos años me da un precio al contado entre un 3 y un 5% inferior al real.
No parece ser ruido; he probado a actualizar los datos varias veces hoy y obtengo el mismo resultado de forma fiable. ¿Qué significa esto?
Aquí está mi código:
import scipy, yfinance
import matplotlib.pyplot as plt
def opt_after(ticker, days):
min_date = (date.today() + timedelta(days=days)).strftime('%Y-%m-%d')
return ticker.option_chain(next(d for d in ticker.options if d >= min_date))
t = yfinance.Ticker("^SPX")
mo2, y2 = opt_after(t, 61), opt_after(t, 365*2)
print('actual', t.history().Close[0])
c, p = mo2.calls.set_index('strike'), mo2.puts.set_index('strike')
par = ((c.bid + c.ask)/2. - (p.bid + p.ask)/2.).dropna()
# Use an outlier-robust fit
riskfree, spot, *_ = scipy.stats.theilslopes(par, par.index)
print('2 month', spot)
plt.scatter(par.index, par)
plt.plot([0, 5000], [spot, 5000*riskfree + spot], label='2 month')
c, p = y2.calls.set_index('strike'), y2.puts.set_index('strike')
par = ((c.bid + c.ask)/2. - (p.bid + p.ask)/2.).dropna()
riskfree, spot, *_ = scipy.stats.theilslopes(par, par.index)
print('2 year', spot)
plt.scatter(par.index, par)
plt.plot([0, 5000], [spot, 5000*riskfree + spot], label='2 year')
plt.legend()
plt.xlabel('strike')
plt.ylabel('call - put')