¿Soporta QuantLib la valoración de permutas cruzadas de divisas? Por ejemplo, permuta cruzada SOFR / SONIA.
Respuestas
¿Demasiados anuncios?Yo comercio IRSs y XCSs, por lo que esta respuesta se basa en mis propios procesos y requisitos, como tal he escrito rateslib
en Python, el cual no tiene ninguno de los procesos estocásticos de quantlib
, pero se centra en las métricas delta y gamma de los derivados lineales de tipo de cambio multimoneda.
Para establecer un marco de precios y riesgos para derivados multimoneda necesitamos Curvas, FXRates, Instruments y un intercambio o cartera para valorar.
Crea primero las Curvas. 3 líneas para las curvas de descuento de monedas cruzadas USD, GBP y GBPUSD. Sus factores de descuento pronto serán calibrados.
from rateslib import *
gbp = Curve({dt(2023, 8, 2): 1.0, dt(2024, 8, 2): 1.0}, id="sonia", calendar="ldn")
usd = Curve({dt(2023, 8, 2): 1.0, dt(2024, 8, 2): 1.0}, id="sofr", calendar="nyc")
gbpusd = Curve(
nodes={dt(2023, 8, 2): 1.0, dt(2024, 2, 2): 1.0, dt(2024, 8, 2): 1.0},
id="gbpusd",
)
Ahora crearemos los FXRates y los asociaremos con Curvas para definir un espacio de FXForwards coherente con garantías.
fxr = FXRates({"gbpusd": 1.25}, settlement=dt(2023, 8, 4))
fxf = FXForwards(
fx_rates=fxr,
fx_curves={
"usdusd": usd,
"gbpgbp": gbp,
"gbpusd": gbpusd,
}
)
Ahora resolveremos todo en relación con los datos del mercado y calibrando los Instruments
solver = Solver(
curves=[gbp, usd, gbpusd],
instruments=[
IRS(dt(2023, 8, 2), "1y", spec="gbp_irs", curves="sonia"),
IRS(dt(2023, 8, 2), "1y", spec="usd_irs", curves="sofr"),
XCS(dt(2023, 8, 2), "6m", spec="gbpusd_xcs", curves=["sonia", "gbpusd", "sofr", "sofr"]),
XCS(dt(2023, 8, 2), "1y", spec="gbpusd_xcs", curves=["sonia", "gbpusd", "sofr", "sofr"]),
],
s=[4.75, 5.35, -6, -14],
fx=fxf,
instrument_labels=["1y gbp", "1y usd", "6m gbpusd", "1y gbpusd"],
id="solver",
)
ÉXITO: `func_tol` alcanzado después de 3 iteraciones (levenberg_marquardt)
Nota que estos instrumentos tienen sus parámetros preconfigurados por una entrada de especificación de mercado (spec).
Con este Solver y conjunto de Curvas calibradas, ahora se pueden hacer muchas cosas. Algunas de ellas involucran la construcción de un swap de moneda cruzada existente y luego valorarlo y gestionar su riesgo.
Aquí crearé un MTM-XCS histórico y le adjuntaré ajustes que contengan datos de fijación válidos hasta la última RFR para la fecha de valor de referencia 1 de agosto de 2023.
my_xcs=XCS(
dt(2023, 5, 16), "1Y", spec="gbpusd_xcs",
fx_fixings=[1.25],
float_spread=-2.5,
notional=100e6, #GBP
curves=["sonia", "gbpusd", "sofr", "sofr"],
fixings=defaults.fixings.sonia,
leg2_fixings=defaults.fixings.sofr
)
Podemos valorar y gestionar el riesgo de este swap:
my_xcs.npv(solver=solver, local=True)
{"usd": 126,378,590.04,
"gbp": -101,071,269.19}
my_xcs.npv(solver=solver, base="gbp")
35,487.48
my_xcs.delta(solver=solver)
También se pueden ver los flujos de efectivo, incluidos todos los intercambios MTM:
my_xcs.cashflows(solver=solver)
En este momento no hay un instrumento de divisas cruzadas como tal (podría llevar un tiempo) pero es posible construir sus flujos de efectivo y calcular su valor. Hay un artículo disponible en https://www.implementingquantlib.com/2023/09/cross-currency-swaps.html.