Intento calcular la tasa cero para una curva cero lineal a trozos. Tengo el siguiente depósito en el extremo corto
- STIBOR 1D, se identifica como próximo depósito de mañana: 0,02416
- STIBOR 3 Meses: 0.02701
A continuación, utilizo el paquete QuantLib para encontrar las tasas cero continuas:
from datetime import datetime, date, timedelta
import pandas as pd
date_today = datetime(2022,12,30)
# Set the date today
ql_date_today = ql.Date(date_today.strftime("%Y-%m-%d"), "%Y-%m-%d") #
ql.Settings.instance().evaluationDate = ql_date_today
helpers = []
depositRates = [0.02416, 0.02701]
depositMaturities = ['1D', '3M']
calendar = ql.Sweden()
fixingDays = 2
endOfMonth = False
convention = ql.ModifiedFollowing
dayCounter = ql.Actual360()
for r,m in zip(depositRates, depositMaturities):
if m == '1D':
fixingDays = 1
convention = ql.Following
elif m == '3M':
convention = ql.Following
fixingDays = 2
helpers.append(ql.DepositRateHelper(ql.QuoteHandle(ql.SimpleQuote(r)),
ql.Period(m),
fixingDays,
calendar,
convention,
endOfMonth,
dayCounter))
curve1 = ql.PiecewiseLinearZero(0, ql.TARGET(), helpers, ql.Actual365Fixed())
curve1.enableExtrapolation()
def ql_to_datetime(d):
return datetime(d.year(), d.month(), d.dayOfMonth())
def calc_days(maturity, date_now = date_today):
return (maturity-date_now).days
dates, rates = zip(*curve1.nodes())
dates = list(map(ql_to_datetime, dates))
days = list(map(calc_days, dates))
df = pd.DataFrame(dict({"Date": dates, "Rate": rates, "Days" : days}))
df
El resultado de QuantLib es:
Fecha
Tarifa
Días
0
2022-12-30 00:00:00
0.0244947
0
1
2023-01-03 00:00:00
0.0244947
4
2
2023-04-03 00:00:00
0.027174
94
Ahora deseo recrear los valores que produce Quantlib, dado que la curva está bootstrapped con 365 reales. Para el primer depósito utilizo la tasa simple, $DF = \frac{1}{1+RT}$ para calcular el factor de descuento (también me parece interesante que la convención de conteo de días que da el resultado coincidente con Quantlib viene dada por 1/360, cuando mi intuición me dice que debería ser 4/360 dada la fecha de vencimiento):
$$ DF_1 = \frac{1}{1+0.02416 \cdot \frac{1}{360}} \approx 0.999932893 . $$
Entonces la tasa cero continua pasa a ser:
$$ r_1 = -365/1 \cdot \ln (DF_1) \approx 0.02449473. $$
Además, si seguimos con el segundo tipo obtenemos el siguiente factor de descuento:
$$ DF_2 = \frac{0.999932893 }{1+0.02701 \cdot \frac{94}{360}} \approx 0.99293014. $$
Por fin el tipo cero continuo para el segundo depósito es
$$ r_1 = -365/94 \cdot \ln (DF_2) \approx 0,02754960 . $$
Así pues, los resultados que obtengo calculando manualmente los tipos cero para el segundo depósito no coinciden realmente con el resultado de QuantLib, por lo que sé que estoy haciendo mal mis cálculos. He intentado indagar en el código fuente c++ de Quantlib sin éxito. También he intentado cambiar las fechas de vencimiento en los cálculos pero sigo sin encontrar un valor que coincida para los depósitos. Agradecería cualquier ayuda o indicación.