1 votos

Usando QuantLib para construir una Curva Forward Plana utilizando cambios asumidos de las reuniones del banco central para calcular precios de FRAs.

Lo que estoy tratando de hacer es establecer el precio de los FRAs EURIBOR6M utilizando una curva construida en quantlib con cambios en la tasa debido a reuniones de bancos centrales.

Para ser concretos, mi objetivo es establecer el precio de los FRAs EURIBOR6M, digamos un FRA de 1x7, dados los cambios de las reuniones. Supongamos los siguientes detalles:

fechas_reunion = [
    dt.date(2024, 3, 7),
    dt.date(2024, 4, 11),
    dt.date(2024, 6, 6),
    dt.date(2024, 7, 18),
    dt.date(2024, 9, 12),
    dt.date(2024, 10, 17),
    dt.date(2024, 12, 12)
]

cambio_tasa = [-0.6, -5.7, -18.4, -14.6, -18.6, -17.8, -22.8]

fecha_curva = dt.date(2024, 1, 8)

tasa_euribor6m = 3.929

tasa_estr = 3.904

Dado esto, ¿cómo construyo la curva de tasas forward planas en quantlib y luego establezco el precio del FRA 1x7?

2voto

dotnetcoder Puntos 1262

No tienes realmente suficiente información. Necesitas la base ESTR/6MEuribor para hacer esto correctamente.

Puedes empezar creando una curva ESTR a partir de los pasos de tu reunión de política:

(Para una revisión de conversión de Quantlib - Rateslib aquí: https://rateslib.readthedocs.io/en/stable/z_quantlib.html)

from rateslib import *

m = [
    dt(2024, 1, 8),
    dt(2024, 3, 7),
    dt(2024, 4, 11),
    dt(2024, 6, 6),
    dt(2024, 7, 18),
    dt(2024, 9, 12),
    dt(2024, 10, 17),
    dt(2024, 12, 12),
]
curve = Curve(
    nodes={
        dt(2024, 1, 8):1.0,
        dt(2024, 3, 7):1.0,
        dt(2024, 4, 11):1.0,
        dt(2024, 6, 6):1.0,
        dt(2024, 7, 18):1.0,
        dt(2024, 9, 12):1.0,
        dt(2024, 10, 17):1.0,
        dt(2024, 12, 12):1.0,
        dt(2025, 1, 31):1.0
    },
    convention="act360",
    calendar="tgt"
)
solver = Solver(
    curves=[curve],
    instruments=[
        IRS(m[0], "1b", spec="eur_irs", curves=curve),
        Spread(IRS(m[0], "1b", spec="eur_irs", curves=curve),
               IRS(m[1], "1b", spec="eur_irs", curves=curve)),
        Spread(IRS(m[1], "1b", spec="eur_irs", curves=curve),
               IRS(m[2], "1b", spec="eur_irs", curves=curve)),
        Spread(IRS(m[2], "1b", spec="eur_irs", curves=curve),
               IRS(m[3], "1b", spec="eur_irs", curves=curve)),
        Spread(IRS(m[3], "1b", spec="eur_irs", curves=curve),
               IRS(m[4], "1b", spec="eur_irs", curves=curve)),
        Spread(IRS(m[4], "1b", spec="eur_irs", curves=curve),
               IRS(m[5], "1b", spec="eur_irs", curves=curve)),
        Spread(IRS(m[5], "1b", spec="eur_irs", curves=curve),
               IRS(m[6], "1b", spec="eur_irs", curves=curve)),
        Spread(IRS(m[6], "1b", spec="eur_irs", curves=curve),
               IRS(m[7], "1b", spec="eur_irs", curves=curve)),
    ],
    s=[3.90, -1, -7.5, -19.8, -16.7, -20, -18.2, -23.2]
)
curve.plot("1b")

enter image description here

Luego puedes agregar una curva de spread encima de esto, supongamos que el spread ESTR/6M se interpola linealmente entre las fechas IMM:

spread_curve = Curve(
    nodes={
        dt(2024, 1, 8): 1.0,
        dt(2024, 3, 20): 1.0,
        dt(2024, 6, 19): 1.0,
        dt(2024, 9, 18): 1.0,
        dt(2024, 12, 19): 1.0,
    },
    convention="act360",
    calendar="tgt"
)
curve_6m_composite = CompositeCurve([curve, spread_curve])
solver2 = Solver(
    pre_solvers=[solver],
    curves=[curve_6m_composite, spread_curve],
    instruments=[
        IRS(dt(2024, 1, 8), "6m", spec="eur_irs", curves=curve_6m_composite),
        IRS(dt(2024, 3, 20), "6m", spec="eur_irs", curves=curve_6m_composite),
        IRS(dt(2024, 6, 19), "6m", spec="eur_irs", curves=curve_6m_composite),
        IRS(dt(2024, 9, 18), "6m", spec="eur_irs", curves=curve_6m_composite),
    ],
    s=[3.925, 3.88, 3.5725, 3.2125]
)
curve_6m_composite.plot("6m", comparators=[curve], labels=["6M Euribor", "6M ESTR"])

enter image description here

Estas imágenes son demasiado grandes a escala para resaltar lo que está haciendo esto, pero si comparas esta curva de 6m con una que tenga solo interpolación lineal de la tasa de 6m entre las tasas de depósito e IMM, observarás algunas diferencias de puntos básicos en los meses intermedios.

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