How Cross-Currency Swaps and FX Swaps Carry Market Risk
Summary
The post compares the risk exposures of floating-floating and fixed-fixed cross-currency swaps with an FX swap. It distinguishes exposure to spot foreign exchange, each currency’s interest-rate curves, and the cross-currency basis. The answer illustrates the comparison by building market curves and pricing instruments with a rates library, then querying their sensitivities.
The example finds spot FX sensitivity in an FX swap with equal base notionals at its start and end, because each leg has a local-currency mark-to-market value. It notes that FX swaps with split notionals, common when rates are away from zero, do not create that spot FX exposure. The post raises the curve-risk question but does not include the displayed delta results, so it offers limited evidence for comparing all the instruments’ rate and basis sensitivities. Its risk conclusions depend on instrument structure and setup.
Key ideas
- Cross-currency swaps can combine exposure to both currencies’ rates and cross-currency basis, alongside FX effects.
- The answer compares instrument deltas using a curve-based pricing setup.
- An FX swap with equal base notionals can have spot FX sensitivity because both legs have local-currency value.
- Split notionals can remove that spot FX sensitivity in the described FX-swap structure.
- The post does not show the delta tables needed to verify every risk comparison.
Tags
Full text
# XCS and FX swaps: market risks
# XCS and FX swaps: market risks
XCS (cross currency swap) can be:
- Float vs float #1
- Fixed vs fixed #2
- Float vs fixed #3
> #2 can be constructed with 2 fixed vs float irs and 1 xccy basis swap #1
> #3 can be constructed with 1 irs and #1
An FX swap is equivalent to #2 risk wise (I think?)
Is it true that: #1 has fx risk, interest rate risk for each of the two currencies involved, and xccy basis risk?
If so, does that mean that #2 and fx swaps don’t have any interest risk? Only xccy basis and fx risk?
Or if not true then perhaps #1 only has fx risk and xccy basis risk? And then it follows that #2 and fx swaps do have, on top of fx and xccy basis risk, interest risk for each currency?
## Answer by Attack68 (score 3)
https://quant.stackexchange.com/a/75554
Broadly you are on the right track. I have used Python's `rateslib` to make these calculations.
Setup the curves and the risk engine
```
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"
)
```
Now I build each of your instruments and query the delta. First a mark-to-market cross currency swap:
```
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}")
```
Second a fixed-fixed cross currency swap.
```
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}")
```
And finally an FXswap (I have had to iterate the fixed rate input to get a mid-market FXSwap)
```
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}")
```
The FXSwap has 216 EUR per pip risk to the EURUSD FX rate because each leg of the FXswap has an NPV in each local currency when executed at mid market. (This is an FX swap without splits, i.e. where the base notional is the same at the effective and termination dates, which creates the FX risk. WIth interest rates not around zero, FX swaps with split notionals are more common and these dont create the spot FX risk)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.