1 votos

Cómo calcular los factores de descuento de dos depósitos en una curva de tipos de interés

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.

2voto

savageguy Puntos 570

Encontré la respuesta tras indagar mucho en este foro, en concreto lo que me dio la respuesta fue el siguiente post ¿Cómo calcula bloomberg el tipo de descuento a partir de la curva EUR estr? [cerrado] .

Por lo tanto, para el segundo depósito $T_s$ , $T_e$ denotan el inicio y el final del depósito, respectivamente. En ese caso $t$ sea el momento del que se desea calcular el factor de descuento. Dadas las vacaciones durante 2022-12-30 fijamos $T_s = 4$ y $T_e = 94$ . Además consideramos $t = 0$ . Entonces la solución que buscamos viene dada por:

$$ r_2 = -\frac{365}{T_e-T_s} \cdot \log ( \frac{DF(t,T_s)}{1+R \cdot (T_e - T_s)/360} ). $$

Si seguimos calculando $DF(t, T_s)$ obtenemos

$$ DF(t, T_s) = e^{(-r_1 \cdot (T_s -t) / 365)} = e^{(-r_1 \cdot (4 -0) / 365)} \approx 0.9997316. $$

Entonces el resultado final es

$$ r_2 = -\frac{365}{94-4} \cdot \log ( \frac{0.9997316}{1+0.02701 \cdot (94 - 4)/360} ) \approx 0.0271740. $$

Finanhelp.com

FinanHelp es una comunidad para personas con conocimientos de economía y finanzas, o quiere aprender. Puedes hacer tus propias preguntas o resolver las de los demás.

Powered by:

X