1 votos

Curva de rendimiento Quantlib Natural Cubic spline

¿Existe algún ejemplo para utilizar la interpolación Natural Cubic spline para las curvas de rendimiento en Quantlib python? Puedo ver en el Archivo SWIG que la interpolación está expuesta pero no estoy seguro de cómo utilizarla.

Veo que algunos métodos de interpolación expuestos en pieza-escenario-curva archivo. ¿Son los que debería utilizar?

1voto

Chris Mc Puntos 31

QuantLib dispone de varios métodos de interpolación para las curvas de rendimiento. A continuación se muestra un ejemplo de algunos métodos para los bonos del Estado portugués para que pueda empezar.

import QuantLib as ql
import pandas as pd

pgbs = pd.DataFrame(
    {'maturity': ['15-06-2020', '15-04-2021', '17-10-2022', '25-10-2023',
                  '15-02-2024', '15-10-2025', '21-07-2026', '14-04-2027',
                  '17-10-2028', '15-06-2029', '15-02-2030', '18-04-2034',
                  '15-04-2037', '15-02-2045'],
     'coupon': [4.8, 3.85, 2.2, 4.95,  5.65, 2.875, 2.875, 4.125,
                2.125, 1.95, 3.875, 2.25, 4.1, 4.1],
     'px': [102.532, 105.839, 107.247, 119.824, 124.005, 116.215, 117.708,
            128.027, 115.301, 114.261, 133.621, 119.879, 149.427, 159.177]})

calendar = ql.TARGET()
today = calendar.adjust(ql.Date(19, 12, 2019))
ql.Settings.instance().evaluationDate = today

bondSettlementDays = 2
bondSettlementDate = calendar.advance(
    today,
    ql.Period(bondSettlementDays, 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 pgbs.iterrows():
    maturity = ql.Date(row.maturity, '%d-%m-%Y')
    schedule = ql.Schedule(
        bondSettlementDate,
        maturity,
        ql.Period(frequency),
        calendar,
        accrualConvention,
        accrualConvention,
        ql.DateGeneration.Backward,
        False)
    helper = ql.FixedRateBondHelper(
            ql.QuoteHandle(ql.SimpleQuote(row.px)),
            bondSettlementDays,
            100.0,
            schedule,
            [row.coupon / 100],
            dc,
            convention,
            redemption)

    instruments.append(helper)

params = [bondSettlementDate, instruments, dc]

methods = {
    'logLinearDiscount': ql.PiecewiseLogLinearDiscount(*params),
    'logCubicDiscount': ql.PiecewiseLogCubicDiscount(*params),
    'linearZero': ql.PiecewiseLinearZero(*params),
    'cubicZero': ql.PiecewiseCubicZero(*params),
    'linearForward': ql.PiecewiseLinearForward(*params),
    'splineCubicDiscount': ql.PiecewiseSplineCubicDiscount(*params),
}

pgbs.index = pd.to_datetime(pgbs.maturity)
for method in methods:
    pgbs[method] = pgbs.maturity.apply(
        lambda x: methods[method].zeroRate(
                                         ql.Date(x, '%d-%m-%Y'),
                                         dc,
                                         ql.Compounded,
                                         frequency
                                       ).rate()*100
    )

pgbs

Además de la interpolación, también puedes consultar la clase FittedBondDiscountCurve donde tienes varios métodos de ajuste (CubicBSplinesFitting, SimplePolynomialFitting, NelsonSiegelFitting, SvenssonFitting, ExponentialSplinesFitting)

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