1 votos

Curva de rendimiento Quantlib

¿Es posible crear un objeto de curva de rendimiento en Quantlib dada alguna función del tiempo? Por ejemplo, dados los parámetros de Nelson-Siegel, crear una curva de rendimiento que pueda calcular el rendimiento cero para cualquier fecha >= fecha de referencia.

1voto

Chris Mc Puntos 31

Sí, es posible. Puede alimentar los instrumentos de renta fija con los precios y ajustar los parámetros de Nelson-Siegel.

Pruebe este sencillo ejemplo:

import QuantLib as ql
import matplotlib.pyplot as plt
import pandas as pd
import numpy as np

today = ql.Date(30,12,2019)
ql.Settings.instance().evaluationDate = today

bonds = pd.DataFrame({
    'maturity': ['30-03-2020','30-12-2020', '15-06-2021', '17-10-2022', '17-04-2023'],
    'coupon': [0,1.25, 3.40, 6.40, 2.25],
    'price': [99.88, 99.75, 101.98, 108.70, 96.46]
})

calendar = ql.TARGET()
bondSettlementDays = 2
bondSettlementDate = calendar.advance(today, ql.Period(2, ql.Days))
frequency = ql.Annual
dc = ql.ActualActual(ql.ActualActual.ISMA)
accrualConvention = ql.ModifiedFollowing
convention = ql.ModifiedFollowing
redemption = 100.0

instruments = []
for idx, row in bonds.iterrows():
    schedule = ql.Schedule(
        bondSettlementDate,
        ql.Date(row.maturity, '%d-%m-%Y'),
        ql.Period(frequency),
        calendar,
        accrualConvention,
        accrualConvention,
        ql.DateGeneration.Backward,
        False)
    helper = ql.FixedRateBondHelper(
            ql.QuoteHandle(ql.SimpleQuote(row.price)),
            bondSettlementDays,
            100.0,
            schedule,
            [row.coupon / 100],
            dc,
            convention,
            redemption)

    instruments.append(helper)    

curveSettlementDays = 2
curveFittingMethod = ql.NelsonSiegelFitting()
tolerance = 1.0e-5
iterations = 1000

curve_ns = ql.FittedBondDiscountCurve(curveSettlementDays, calendar, instruments,
                                          dc, curveFittingMethod, tolerance, iterations)
t = np.linspace(1,3.25)
rates_ns = [curve_ns.zeroRate(n, ql.Annual).rate() for n in t]
plt.figure(figsize=(15,5)),
plt.plot(t, rates_ns);

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