En general, estás en el camino correcto. He utilizado rateslib
de Python para hacer estos cálculos.
Configura las curvas y el motor de riesgo
from rateslib import *
usdusd = Curve({dt(2023, 1, 1): 1.0, dt(2024, 1, 1): 0.95}, id="usd")
eureur = Curve({dt(2023, 1, 1): 1.0, dt(2024, 1, 1): 0.975}, id="eur")
eurusd = Curve({dt(2023, 1, 1): 1.0, dt(2024, 1, 1): 0.975}, id="eurusd")
instruments = [
IRS(dt(2023, 1, 1), "1Y", "A", currency="usd", curves="usd"),
IRS(dt(2023, 1, 1), "1Y", "A", currency="eur", curves="eur"),
XCS(dt(2023, 1, 1), "1Y", "Q", currency="eur", leg2_currency="usd", curves=["eur", "eurusd", "usd", "usd"])
]
fxr = FXRates({"eurusd": 1.10}, settlement=dt(2023, 1, 3))
fxf = FXForwards(
fx_rates=fxr,
fx_curves={
"usdusd": usdusd,
"eureur": eureur,
"eurusd": eurusd,
}
)
solver = Solver(
curves=[usdusd, eureur, eurusd],
instruments=instruments,
s = [5.0, 2.5, -10],
instrument_labels=["USD 1Y", "EUR 1Y", "XCS 1Y"],
fx=fxf,
id="XCCY"
)
Ahora construyo cada uno de tus instrumentos y consulto el delta. Primero un swap de divisas de marcaje al mercado:
xcs = XCS(
dt(2023, 1, 1), "1Y", "Q",
notional=100e6, currency="eur",
leg2_currency="usd",
fx_fixings=1.10,
curves=["eur", "eurusd", "usd", "usd"]
)
xcs.delta(solver=solver, base="eur").style.format("{:.0f}")
Segundo un swap de divisas fijo-fijo.
ffxcs = FixedFixedXCS(
dt(2023, 1, 1), "1Y", "A",
notional=100e6, currency="eur", fixed_rate=2.41,
leg2_currency="usd", leg2_fixed_rate=5.01,
fx_fixings=1.10,
curves=["eur", "eurusd", "usd", "usd"]
)
ffxcs.delta(solver=solver, base="eur").style.format("{:.0f}")
Y finalmente un FXswap (He tenido que iterar la entrada de la tasa fija para obtener un FXSwap de mercado medio)
fxs = FXSwap(
dt(2023, 1, 1), "1y", "Z",
notional=100e6, currency="eur",
leg2_currency="usd", leg2_fixed_rate=2.54,
fx_fixing=1.10,
curves=["eur", "eurusd", "usd", "usd"],
)
fxs.delta(solver=solver, base="eur").style.format("{:.0f}")
El FXSwap tiene un riesgo de 216 EUR por pip en la tasa de cambio EURUSD porque cada pata del FXSwap tiene un valor presente neto en cada moneda local cuando se ejecuta al mercado medio. (Este es un FX swap sin divisiones, es decir, donde el nominal base es el mismo en las fechas efectiva y de terminación, lo que crea el riesgo FX. Con tasas de interés no en torno a cero, los swaps FX con nominales divididos son más comunes y no crean el riesgo FX al contado)