También puedes validar la implementación de QuantLib
con rateslib
.
Para definir la moneda local EUR y USD necesitas especificar dos curvas RFR:
from rateslib import *
eureur = Curve({dt(2024, 2, 16): 1.0, dt(2024, 8, 16): 1.0, dt(2025, 2, 19): 1.0}, calendar="tgt", convention="act360", interpolation="log_linear")
usdusd = Curve({dt(2024, 2, 16): 1.0, dt(2024, 8, 16): 1.0, dt(2025, 2, 19): 1.0}, calendar="nyc", convention="act360", interpolation="log_linear")
Para definir mercados de intercambio de divisas o FXswap, necesitas una curva CSA para flujos de caja en EUR con colateral en USD.
eurusd = Curve({dt(2024, 2, 16): 1.0, dt(2024, 8, 16): 1.0, dt(2025, 2, 19): 1.0}, convention="act360", interpolation="log_linear")
Los puntos de los factores de descuento se colocan en los puntos de 6m y 1Y en todas las curvas.
Ahora asociaremos estos objetos en un marco de FXForwards
con los actuales FXRates
fxf = FXForwards(
fx_rates=FXRates({"eurusd": 1.080}, settlement=dt(2024, 2, 20)),
fx_curves={"usdusd": usdusd, "eureur": eureur, "eurusd": eurusd}
)
Ahora resuelve y actualiza estas Curves según las tasas de los instrumentos de mercado al 16 de febrero de 2024, alineándolos con los instrumentos de 6m y 1Y para simplificar.
solver = Solver(
curves=[eureur, usdusd, eurusd],
instruments=[
IRS(dt(2024, 2, 16), "6m", spec="usd_irs", curves=usdusd),
IRS(dt(2024, 2, 16), "1y", spec="usd_irs", curves=usdusd),
IRS(dt(2024, 2, 16), "6m", spec="eur_irs", curves=eureur),
IRS(dt(2024, 2, 16), "1y", spec="eur_irs", curves=eureur),
XCS(dt(2024, 2, 16), "6m", spec="eurusd_xcs", curves=[eureur, eurusd, usdusd, usdusd]),
XCS(dt(2024, 2, 16), "1y", spec="eurusd_xcs", curves=[eureur, eurusd, usdusd, usdusd]),
],
s=[5.205, 5.00, 3.72, 3.40, -6.1, -11.9],
instrument_labels=["6mUS", "1yUS", "6mEU", "1yEU", "6mUS/EU", "1yUS/EU"],
fx=fxf,
)
ÉXITO: `func_tol` alcanzado después de 3 iteraciones (levenberg_marquardt) , `f_val`: 4.884e-12, `tiempo`: 0.0580s
El objeto actualizado de FXForwards
ahora puede devolver Curves para cualquiera de los siguientes casos:
ProxyCurves
toman factores de descuento de las Curves
subyacentes relevantes y realizan multiplicaciones cruzadas (similar a tus fórmulas). Son objetos capaces de calcular factores de descuento o tasas, etc.
MultiCsaCurves
combinan curvas de colateral para calcular curvas de colateral múltiple intrínsecas (sin opcionalidad). Nuevamente son objetos de curva capaces de producir factores de descuento y tasas.
También pueden plot
.
fxf.curve("usd", "usd").plot("1b",
comparators=[fxf.curve("usd", "eur"), fxf.curve("usd", ["usd", "eur"])],
labels=["local", "eur", "local+eur"],
)