2 votos

Interpolación Quantlib ZeroCurve

Me gustaría comprobar cómo QuantLib hace la interpolación en las tasas si uso el constructor ZeroCurve. Como se mencionó aquí utilizando curve.nodes() puede obtener una lista de tasas, utilizadas para la interpolación.

Así, si construyo una curva con tipos al contado con el siguiente código

import QuantLib as ql
todays_date = ql.Date(12, 3, 2020)
spot_dates = [todays_date + ql.Period(i, ql.Years) for i in [0, 1, 2, 3, 4, 5]]
spot_rates = [0.01, 0.02, 0.03, 0.04, 0.05, 0.06]
spot_curve = ql.ZeroCurve(
    spot_dates, spot_rates, 
    ql.SimpleDayCounter(),
    ql.NullCalendar(),
    ql.Linear(),
    ql.Compounded,
    ql.Annual
)

He vuelto

spot_curve.nodes()

((Date(12,3,2020), 0.009950330853148023),
 (Date(12,3,2021), 0.01980262729617973),
 (Date(12,3,2022), 0.02955880224154438),
 (Date(12,3,2023), 0.03922071315328132),
 (Date(12,3,2024), 0.04879016416943205),
 (Date(12,3,2025), 0.05826890812397582))

Me he dado cuenta de que el problema es la composición. Al indicar que las tasas de entrada se componen continuamente, nodes() coincide con la entrada.

spot_curve = ql.ZeroCurve(
    spot_dates, spot_rates, 
    ql.SimpleDayCounter(),
    ql.NullCalendar(),
    ql.Linear(), ql.Continuous, ql.Annual
)
spot_curve.nodes()

((Date(12,3,2020), 0.01),
 (Date(12,3,2021), 0.02),
 (Date(12,3,2022), 0.03),
 (Date(12,3,2023), 0.04),
 (Date(12,3,2024), 0.05),
 (Date(12,3,2025), 0.06))

A partir de ese descubrimiento, la pregunta es: ¿QuantLib siempre interpola en tasas continuas (con el constructor de tasas cero)? ¿Es una convención?

3voto

Sean Puntos 11

Los datos almacenados en el objeto se ajustan de manera que la composición Continuous y la frecuencia es NoFrequency . El código fuente en C++ está disponible aquí: zerocurve.hpp . Creo que la razón de esto es que un ZeroCurve entonces no tendrá que almacenar compounding y frequency .

Podemos validar los nuevos índices utilizando la ecuación $$e^{r_{cont}t}=(1+r_{comp})^t$$

Los cálculos que se realizan a continuación dan como resultado cero, lo que verifica la transformación de QuantLib de las tasas de Compounded a Continuous:

import math
math.exp(0.009950330853148023*1.0)-pow(1.0+0.01,1.0)
math.exp(0.01980262729617973*2.0)-pow(1.0+0.02,2.0)

Para obtener los tipos cero con la composición y la frecuencia necesarias se puede utilizar algo como

for x in spot_dates:
    print(spot_curve.zeroRate(x,
                   ql.SimpleDayCounter(),
                   ql.Compounded,
                   ql.Annual).rate())

0voto

Robert Gilliam Puntos 21

Tengo el mismo problema. Además, cuando llamo al método ZeroRate en la fecha de referencia de la curva obtengo una tasa diferente a la que creé el objeto de la curva con ella.

Por ejemplo:

ql.Settings.instance().evaluationDate = ql.Date(8, 12, 2021)

rates = [0.015677430225945563, 0.015677430225945563, 0.011840632376029895]
date = [Date(8,12,2021), Date(3,1,2022), Date(1,2,2022)]
curve = ql.ZeroCurve(dates, rates, ql.Actual360(), ql.NullCalendar(), ql.Linear(), ql.Simple, ql.Annual)

curve.zeroRate(ql.Date(8, 12, 2021), ql.Actual360(), ql.Simple).rate()

Esperaba la tasa 0.015677430225945563, pero obtuve 0.015677094022947813

Para el resto de las fechas tengo la tarifa correcta.

Pero también tengo el mismo problema que el creador del tema anterior. Cuando llamo a los nodos de la curva obtengo diferentes tasas para todas las fechas:

curve.nodes()

((Date(8,12,2021), 0.015677093548145716),
 (Date(3,1,2022), 0.01566856146524625),
 (Date(1,2,2022), 0.011829935508255464))

¿Alguien tiene una respuesta de por qué esto es así? Gracias.

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