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}")
![introduce la descripción de la imagen aquí]()
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}")
![introduce la descripción de la imagen aquí]()
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}")
![introduce la descripción de la imagen aquí]()
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)