2 votos

QuantLib Python - Interpolación del factor de descuento dentro de los nodos de la curva

Se generó una curva de descuento, dCurve.PiecewiseLogLinearDiscount(), utilizando la tasa de parámetros de entrada para plazos (.5Y, 1Y, 2Y, 3Y, 5Y, 7Y, 10Y, 15Y, 20Y, 30Y) y generando una curva de descuento de salida que coincide con la estructura temporal de entrada. ¿Alguna sugerencia sobre cómo generar la curva de factores de descuento en una estructura temporal de intervalos de .5Y hasta 30Y?

1voto

savageguy Puntos 570

Basado en tu pregunta, creé el siguiente ejemplo de curva:

import QuantLib as ql
import pandas as pd

# Establecer la fecha de evaluación
ql.Settings.instance().evaluationDate = ql.Date(30, 12, 2022)
# Declarar una variable de almacenamiento para los ayudantes
helpers = []
# Crear los atributos del swap
calendar = ql.Sweden()
frecuencia = ql.Anual
convencion = ql.ModifiedFollowing
# Datos de mercado sintéticos
daycount = ql.Thirty360(ql.Thirty360.BondBasis)
indice = ql.IborIndex(
    "MiIndice",
    ql.Period("3M"),
    2,
    ql.SEKCurrency(),
    calendar,
    ql.Following,
    False,
    daycount,
)

tenor = ["4Y", "5Y", "6Y", "7Y", "8Y", "9Y", "10Y", "12Y", "15Y", "20Y", "25Y", "30Y"]
quotes = [
    3.33,
    3.2775,
    3.235,
    3.205,
    3.1775,
    3.1525,
    3.1325,
    3.095,
    3.0275,
    2.92,
    2.815,
    2.6925,
]
for r, m in zip(quotes, tenor):
    rate = ql.QuoteHandle(ql.SimpleQuote(r / 100.0))
    tenor = ql.Period(m)
    helpers.append(
        ql.SwapRateHelper(
            rate, tenor, calendar, frecuencia, convencion, daycount, indice
        )
    )
curva = ql.PiecewiseLogLinearDiscount(0, calendar, helpers, ql.Actual365Fixed())
curva.enableExtrapolation()
fechas, tasas = zip(*curva.nodes())

Lo que me deja en el mismo punto que tú. Luego podemos interpolar en un intervalo de 5 años de la siguiente manera:

# Interpolar en un intervalo de 5 años
nodos = []
fecha_inicial = ql.Date(30, 12, 2022)
while True:
    fecha_inicial += ql.Period("5Y")
    nodos.append(fecha_inicial)
    if fecha_inicial > ql.Date(30, 12, 2053):
        break
factores_descuento = [curva.discount(d) for d in nodos]
display(pd.DataFrame(dict({"Fecha": nodos, "Factor de Descuento": factores_descuento})))

Lo cual resulta en:

Fecha

Factor de Descuento

0

30 de diciembre de 2027

0.851205

1

30 de diciembre de 2032

0.735589

2

30 de diciembre de 2037

0.641855

3

30 de diciembre de 2042

0.567462

4

30 de diciembre de 2047

0.508218

5

30 de diciembre de 2052

0.464726

6

30 de diciembre de 2057

0.424997

0voto

Brad Tutterow Puntos 5628

Puedes pasar cualquier fecha que desees al método descuento de la curva que has construido. Devolverá el factor de descuento correspondiente.

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