Interpreting FX Delta for Cross-Currency Swaps
Summary
The document explains why a cross-currency swap may appear to have no foreign-exchange exposure in a risk report. The reported EURUSD sensitivity is expressed per pip, so a small value shown with limited decimal precision can round to zero even when the underlying delta is nonzero. Rescaling that sensitivity to a full rate unit or a percentage move changes its displayed magnitude, not the underlying exposure.
It proposes checking the reported sensitivity with a finite-difference calculation: revalue the swap after moving the FX rate by one pip and compare the NPVs. The answer also notes that omitting FX fixings removes FX risk in the described setup. Cashflows associated with a notional exchange occurring today can offset between the currency legs, whereas a swap whose exchange occurred in the past may have larger leg NPVs and greater FX sensitivity. These conclusions depend on the instrument setup, valuation base, fixings, and risk units; the document includes a conflicting answer that calls the result a software mistake.
Key ideas
- Cross-currency swap FX sensitivity may be reported per pip and appear negligible after rounding.
- Finite-difference revaluation can check the delta implied by a small FX-rate move.
- Sensitivity values must be interpreted using their stated units and scaling convention.
- The presence of FX fixings and the timing of notional exchanges affect the reported risk in the example.
- Cashflows on currency legs may offset for an exchange occurring today, while past exchanges can leave larger FX exposure.
Tags
Full text
# Why doesn't this rateslib code show FX risk for xCCY?
# Why doesn't this rateslib code show FX risk for xCCY?
In this answer to a question about cross currency swaps, the author shows the following deltas for a xCCY swap, but it shows no FX risk. How come? If we enter a EUR USD xCCY swap and we are based in EUR, then the USD leg needs to be converted to EUR and that gives us some fx risk.
## Answer by Attack68 (score 1)
https://quant.stackexchange.com/a/84063
The rateslib EURUSD FX rate risk is expressed per EURUSD pip, i.e. for a movement in the rate of 0.0001.
The actual value calculated in the DataFrame is 0.029846181396350164 EUR per pip, which you have rounded to 0.
You can also validate this with a finite difference calculation:
```
xcs = XCS(
dt(2023, 1, 1), "1Y", "Q",
notional=100e6, currency="eur",
spec="eurusd_xcs",
fx_fixings=1.10,
float_spread=-10.0,
curves=["eur", "eurusd", "usd", "usd"]
)
df = xcs.delta(solver=solver, base="eur")
before = xcs.npv(solver=solver, base="eur")
fxr.update({"eurusd": 1.1001})
solver.iterate()
after = xcs.npv(solver=solver, base="eur")
print("finite diff for 1 pip in EURUSD:", after - before)
# finite diff for 1 pip in EURUSD: <Dual: 0.029843, (eur0, eur1, eurusd0, ...), [0.0, 0.0, -0.0, ...]>
```
If you want to scale this per unit of EURUSD the value is 298.4 EUR. If you want to scale this per 1% movement in EURUSD FX rate the value is 0.0298 * 100 * 1.10 = 3.27 EUR
If you enter no `fx_fixings` then there is no FX risk.
One further comment is that the constructed XCS has cashflows today, so the NPV of each currency leg nets outs. If you build a XCS whose notional exchange was in the past, then each leg has a large NPV in the respective currency and you will get much more FX risk:
```
# Use IBOR here so only need to provide 1 historical fixing
xcs = XCS(
dt(2022, 12, 1), "1Y", "Q",
notional=100e6, currency="eur",
spec="eurusd_xcs",
fixing_method="ibor",
leg2_fixing_method="ibor",
fixings=[1.0],
leg2_fixings=[1.0],
fx_fixings=1.10,
float_spread=-10.0,
curves=["eur", "eurusd", "usd", "usd"]
)
xcs.delta(solver=solver, base="eur")
```
## Answer by JakcieJnr (score -2)
https://quant.stackexchange.com/a/84059
You are correct. There is FX risk on the foreign leg, so this is a mistake in rateslib.Shown in full with attribution under the source's licence. Licence: CC BY-SA 4.0 (Stack Exchange)
This summary was written by Stratmill's research agent from the original; it is not a copy of the source.