Prerequisites

Requires IR-01 (forward swap rates from the discount curve) and IR-02 (multi-curve discounting). No option pricing background needed: the change of numéraire is motivated from scratch, and only the theorem behind it is cited rather than reproved.

By the end, you can price any ATM swaption under Black or Bachelier and read the implied volatility surface off market data. ATM means at the money: the strike is set to today's forward swap rate, so the option has no built-in advantage either way.

The forward swap rate

A par swap equates fixed and floating legs (IR-01). Generalise to a swap starting at $T_\alpha$ with payments at $T_{\alpha+1}, \ldots, T_\beta$: the time-$t$ value of a payer swap (pay fixed $K$, receive floating) is $V_{\text{payer}}(t) = P(t, T_\alpha) - P(t, T_\beta) - K \, A_{\alpha,\beta}(t)$, with annuity $A_{\alpha,\beta}(t) = \sum_{j=\alpha+1}^{\beta} \tau_j \, P(t, T_j)$. The forward swap rate is the fixed rate that zeroes it:

Forward swap rate $$S_{\alpha,\beta}(t) = \frac{P(t, T_\alpha) - P(t, T_\beta)}{A_{\alpha,\beta}(t)}$$

One assumption is buried in that numerator. The floating leg is $\sum_i \delta_i \, F_i(t) \, P(t, T_i)$, with float accruals $\delta_i$ and forward rates $F_i$. It telescopes to $P(t,T_\alpha) - P(t,T_\beta)$ only when the projection and discount curves coincide. Under IR-02 multi-curve it does not, and the annuity keeps its own fixed-leg accruals $\tau_j$ regardless. Everything below is the single-curve form.

The running example is the 5Y×5Y payer swaption: expiry $T_\alpha = 5$, swap running to $T_\beta = 10$. Off the IR-01 curve, $P(0,5) = 0.8252$ and $P(0,10) = 0.6666$, so the floating leg is worth 0.1586.

Three swaptions on one time scale A common horizontal axis running from today to twenty years. Row one, labelled 5Y by 5Y, has a crimson option period from year 0 to year 5 and a navy swap period from year 5 to year 10, with five pairs of cashflow arrows on the swap period: crimson pointing down for fixed paid, navy pointing up for floating received. Row two, 2Y by 10Y, has a crimson option period from 0 to 2 and a navy swap period from 2 to 12. Row three, 10Y by 2Y, has a crimson option period from 0 to 10 and a navy swap period from 10 to 12. Rows two and three both end in year 12 and share nothing else. option period swap period expiry fixed down, floating up 5Y×5Y 2Y×10Y 10Y×2Y same end date 05Y10Y 15Y20Y YEARS FROM TODAY
Figure 1 · IR-03 The first number in 5Y×5Y is when you decide, the second is how long the swap then runs. Rows 2 and 3 end together in year 12 and share nothing else. Schematic; not library output.
The annuity stack and the break-even fixed rate Upper panel: one horizontal bar divided into five segments whose widths are the discount factors 0.7917, 0.7586, 0.7267, 0.6962 and 0.6666 for payments at years 6 to 10. A bracket under the whole bar is labelled A 5,10 of 0 equals 3.6398, the sum of the five. Lower panel: a navy bar of length 0.15863, the floating leg P of 0 comma 5 minus P of 0 comma 10, above three crimson bars of length K times 3.6398 at K equal to 3.0 percent, 4.358 percent and 5.0 percent. Only the middle crimson bar reaches the navy bar's right edge. The break-even is 0.15863 divided by 3.6398, which is 4.358 percent, the forward swap rate. ANNUITY STACK 0.79170.75860.7267 0.69620.6666 6Y7Y8Y 9Y10Y A5,10(0) = 3.6398 BREAK-EVEN floating leg = P(0,5) − P(0,10) = 0.15863 K = 3.0% K = 4.358% K = 5.0% break-even 0.15863 / 3.6398 = 4.358% = S5,10(0)
Figure 2 · IR-03 The annuity is a physical stack of discount factors, and the forward swap rate is the fixed rate that makes the two legs the same length. Slide $K$ until the crimson bar reaches the navy one. Source: xvafoundations.calibration.Stripper, via data/ir-03-swaptions-vol-surface.js.

Whole-year dates are a convention choice, not a different curve. Dating the same swap ACT/360 as IR-01 does, $\tau_j = 365/360$, gives $A_{5,10}(0) = 3.6744$ and $S_{5,10}(0) = 4.366\%$, eight tenths of a basis point higher.

The swaption payoff

A payer swaption with expiry $T_\alpha$ and strike $K$ is the right to enter that swap at expiry. You exercise only if the prevailing swap rate exceeds $K$:

Payer swaption payoff $$\text{Payoff}(T_\alpha) = \left(V_{\text{payer}}(T_\alpha)\right)^+ = A_{\alpha,\beta}(T_\alpha) \cdot \left(S_{\alpha,\beta}(T_\alpha) - K\right)^+$$

The familiar call payoff $(S - K)^+$, but on a swap rate rather than a stock price, scaled by the annuity. That scaling is what the annuity means economically: above the strike, one basis point of rate is 3.64 basis points of payoff.

Pricing in the annuity measure

We want the value today of that payoff. The risk-neutral measure $\mathbb{Q}$ buys exactly one thing: under it any traded price is the expectation of its discounted payoff. With bank-account numéraire $B(t) = \exp(\int_0^t r_s\,ds)$, any $T_\alpha$-payoff $X$ is worth $\mathbb{E}^{\mathbb{Q}}[B(T_\alpha)^{-1} X]$ today:

$$V_0 = \mathbb{E}^\mathbb{Q}\!\left[\exp\!\left(-\int_0^{T_\alpha} r_s\,ds\right) \cdot A_{\alpha,\beta}(T_\alpha) \cdot \left(S_{\alpha,\beta}(T_\alpha) - K\right)^+\right]$$

This expectation is difficult to evaluate directly because the stochastic discount factor $\exp(-\int_0^{T_\alpha} r_s\,ds)$, the annuity $A_{\alpha,\beta}(T_\alpha)$, and the forward swap rate $S_{\alpha,\beta}(T_\alpha)$ are all correlated random variables. The solution is a change of numéraire.

A numéraire is a unit of account. Prices quoted in euros and prices quoted in loaves of bread describe the same market; switching from one to the other changes no relative price, only the drift you measure against. Cash is the default unit and the wrong one here: the payoff already carries the annuity as a factor. A swaption desk does not quote in cash either: it quotes in basis points of annuity, because that is the unit its risk is traded in. Agree to measure in annuities and the discounting problem does not get solved, it disappears.

The annuity measure $\mathbb{Q}^A$ takes $A_{\alpha,\beta}(t)$ as the numéraire. The annuity is a strictly positive combination of zero-coupon bond prices, hence a self-financing portfolio of traded assets, which is what the change-of-numéraire theorem requires (Brigo and Mercurio [1], Section 2.4 and Proposition 2.3.1). It values any European payoff as $A_{\alpha,\beta}(0) \, \mathbb{E}^{\mathbb{Q}^A}[\text{Payoff} / A_{\alpha,\beta}(T_\alpha)]$, and here the annuity cancels:

Swaption price via annuity measure $$V_0 = A_{\alpha,\beta}(0) \cdot \mathbb{E}^{\mathbb{Q}^A}\!\left[\left(S_{\alpha,\beta}(T_\alpha) - K\right)^+\right]$$
What this rests on

The change-of-numéraire theorem is used here and not proved here. Both the annuity-measure price above and the martingale property below rest on it, and no chapter in this series derives it. Brigo and Mercurio [1], Sections 2.2 to 2.4, does.

Under $\mathbb{Q}^A$ the forward swap rate is a martingale with respect to the market filtration $\mathbb{F} = (\mathcal{F}_t)_{t \geq 0}$, the record of everything the market has observed by each date. Its numerator $P(t,T_\alpha) - P(t,T_\beta)$ is a self-financing portfolio, long a $T_\alpha$ bond and short a $T_\beta$ bond, hence a tradable price process, and its ratio to the numéraire is an $\mathbb{F}$-martingale by the same theorem. A martingale has no drift:

$$dS_{\alpha,\beta}(t) = (\text{something}) \cdot dW_t^A$$

with no $dt$ term, where $W^A$ is a Brownian motion under $\mathbb{Q}^A$. Pricing reduces to choosing a distribution for $S_{\alpha,\beta}(T_\alpha)$ and computing $\mathbb{E}^{\mathbb{Q}^A}[(S - K)^+]$. Two choices give the two industry-standard formulas.

Black's formula (lognormal model)

Assume $S_{\alpha,\beta}(t)$ is lognormally distributed under $\mathbb{Q}^A$: $dS = \sigma_B S \, dW^A$, with $\sigma_B$ constant (the Black volatility). The expectation has a closed form:

Black formula: payer swaption $$V_0^{\text{Black}} = A_{\alpha,\beta}(0) \left[ S_{\alpha,\beta}(0) \, \Phi(d_+) - K \, \Phi(d_-) \right]$$ $$d_{\pm} = \frac{\ln\!\big(S_{\alpha,\beta}(0)/K\big) \pm \tfrac{1}{2}\sigma_B^2 \, T_\alpha}{\sigma_B \sqrt{T_\alpha}}$$

where $\Phi(\cdot)$ is the standard normal CDF. This is structurally identical to the Black-Scholes formula, with the forward swap rate replacing the stock price and the annuity replacing the discount factor. It was the dominant quoting convention for decades, and it breaks at zero: $\ln(S/K)$ is undefined for $S \leq 0$ (Brigo and Mercurio [1], Section 1.8.1).

Bachelier's formula (normal model)

Two beliefs about where the 5Y swap rate lands in five years Two probability densities for the forward swap rate at expiry, drawn on a rate axis from minus 4 percent to 14 percent. The crimson solid curve is Black's lognormal law with sigma B of 23.678 percent: it starts at exactly zero at a rate of zero, peaks near 2.9 percent and has a long right tail. The gold dashed curve is Bachelier's normal law with sigma N of 102 basis points, so a standard deviation of 228 basis points over five years: it is symmetric about 4.358 percent and 2.8 percent of its mass, shaded, lies below zero. Both have mean 4.358 percent, the forward, because the forward swap rate is a martingale under the annuity measure. Bachelier puts 2.8% of its mass below zero. Black puts none: ln(S/K) needs S > 0. Black Bachelier −4%04.358% 8%12% the forward SWAP RATE AT EXPIRY DENSITY
Figure 3 · IR-03 Black and Bachelier are two beliefs about where the rate lands, and only one of them lets it go negative. Both have mean 4.358%, because $S_{\alpha,\beta}$ is a martingale under $\mathbb{Q}^A$. Densities plotted from $\sigma_N$ and $\sigma_B$ in data/ir-03-swaptions-vol-surface.js. The 102 bp $\sigma_N$ behind both is the illustrative surface cell of Figure 5, not a quote.

The Bachelier (normal) model assumes $dS = \sigma_N \, dW^A$, with $\sigma_N$ constant (the normal volatility, in absolute terms). The martingale property survives, and the expectation gives:

Bachelier formula: payer swaption $$V_0^{\text{Bach}} = A_{\alpha,\beta}(0) \left[ \big(S_{\alpha,\beta}(0) - K\big) \, \Phi(d) + \sigma_N \sqrt{T_\alpha} \; \varphi(d) \right]$$ $$d = \frac{S_{\alpha,\beta}(0) - K}{\sigma_N \sqrt{T_\alpha}}$$

where $\varphi(\cdot)$ is the standard normal PDF. At the money ($d = 0$) this collapses to $V_0 = A_{\alpha,\beta}(0) \, \sigma_N \sqrt{T_\alpha} / \sqrt{2\pi}$, a clean vol times square root of time scaling. On the running example, taking $\sigma_N = 102$ bp from the illustrative surface of Figure 5 rather than from a quote: $3.6398 \times 102\,\text{bp} \times \sqrt{5} / \sqrt{2\pi} = 331.19$ bp of notional, with delta $A_{\alpha,\beta}(0)/2 = 1.82$ (Brigo and Mercurio [1], Section 1.8.2).

Since around 2020 normal vol has been the dominant convention for USD and EUR swaptions. Converting at the money is one multiplication, $\sigma_N \approx \sigma_B \, S_{\alpha,\beta}(0)$: here $0.23678 \times 4.358\% = 103.2$ bp against the 102 bp it started from, so the shortcut runs 1.2% high, and it degrades as $S$ approaches zero.

Black and Bachelier price the same at-the-money swaption at 331.19 bp, then diverge: Bachelier is worth more at low strikes, Black more at high strikes.
Figure 4 · IR-03 Calibrating both models to the same ATM price makes them agree nowhere else. At a 1.5% strike Bachelier is worth 1082.0 bp against Black's 1044.2, and at 5.5% Black is worth 201.4 against 164.0. Source: xvafoundations.pricing.swaption, priced on the illustrative 102 bp vol of Figure 5; $\sigma_B$ solved to match the resulting 331.19 bp ATM price.

Python implementation

The pricer lives in the library, not on this page. It takes the annuity and forward swap rate from the IR-01 curve, and delta comes from autograd rather than a second closed form: at the money it must equal $A/2$.

Python · PyTorch
import torch

from xvafoundations.calibration import Stripper
from xvafoundations.data.sofr import INSTRUMENTS, VALUATION_DATE
from xvafoundations.instruments import (build_instruments,
                                        pillar_maturities, initial_rates)
from xvafoundations.pricing import bachelier_swaption, black_vol_from_normal_atm

torch.set_default_dtype(torch.float64)

# curve is the IR-01 bootstrapped SOFR curve: the Chapter 01 driver, unchanged.
pillars = torch.tensor(pillar_maturities(INSTRUMENTS, VALUATION_DATE))
rates   = torch.tensor(initial_rates(INSTRUMENTS))
stripper = Stripper(pillars, rates, instrument_factory=lambda c:
                    build_instruments(INSTRUMENTS, VALUATION_DATE, c))
stripper.calibrate()
curve = stripper.get_curve()

t0 = torch.tensor(0.0)
expiry = torch.tensor(5.0)
payment_times = torch.arange(6.0, 11.0)        # T_6 ... T_10
tau = torch.ones_like(payment_times)           # tau_j = 1 on this grid

annuity = (tau * curve.zc_price(t0, payment_times)).sum()
forward = (curve.zc_price(t0, expiry)
           - curve.zc_price(t0, torch.tensor(10.0))) / annuity

S = forward.detach().requires_grad_(True)      # delta comes out of autograd
K = forward.detach()                           # struck at the money
sigma_N = torch.tensor(102.0e-4)               # illustrative 5Y x 5Y cell, not a quote

price = bachelier_swaption(annuity, S, K, sigma_N, expiry)
price.backward()
sigma_B = black_vol_from_normal_atm(K, sigma_N, expiry)

print(f"A_5,10(0) = {annuity.item():.4f}")
print(f"S_5,10(0) = {forward.item() * 100:.4f}%")
print(f"price     = {price.item() * 1e4:.2f} bp")
print(f"delta     = {S.grad.item():.4f}  (A/2 = {annuity.item() / 2:.4f})")
print(f"sigma_B   = {sigma_B.item() * 100:.4f}%")

# A_5,10(0) = 3.6398
# S_5,10(0) = 4.3581%
# price     = 331.19 bp
# delta     = 1.8199  (A/2 = 1.8199)
# sigma_B   = 23.6782%

The ATM volatility surface

There is not one swaption; there are hundreds. The market quotes them across a grid of expiry $T_\alpha$ and swap tenor $T_\beta - T_\alpha$. Each cell holds the implied volatility: the single $\sigma_N$ you must feed the Bachelier formula to recover the price the market is trading. It is not a forecast. It is the traded price, restated in the one unit that makes strikes, expiries and tenors comparable. That grid is the ATM swaption volatility surface.

On this illustrative surface, volatility rises with swap tenor to a peak near 20Y, and is humped in expiry with a peak near 3Y.
Figure 5 · IR-03 An invented surface with the right shape: vol is humped in expiry and rises with tenor, so the quietest cells are the shortest and longest expiries. Read the shape, not the level: at 5Y tenor the invented cells run 68, 106, 69 bp at 1M, 3Y, 30Y. Hover any cell. Illustrative surface, not market quotes and not library output: the expiry hump and the tenor slope are real features of quoted vol, the levels are invented and smoother than anything traded. The 5Y x 5Y cell, 102 bp, is the input Figures 3 and 4 and the snippet above all price from: the pricing is library output, the vol is not.

What matters for XVA is whether the model fits this surface across the expiry-tenor grid. Hull-White 1F (IR-05, draft) fits it well enough for most CVA calculations. The smile, and SABR, are out of scope here.

What this chapter delivers for the XVA engine

The swaption market is the calibration target for any rate model. IR-06 (draft) will find Hull-White's $a$ and $\sigma$ by matching model swaption prices to this surface. The Bachelier formula is the inversion function: given a market price, compute $\sigma_N$; given model parameters, compute a model price; minimise the difference.

Swaptions have positive observed market prices, and that is only possible if rates are random: a deterministic path implies zero option value. IR-04 makes this precise.

References

  1. D. Brigo and F. Mercurio, Interest Rate Models: Theory and Practice, 2nd edition, Springer, 2006. Sections 1.4 (swap pricing), 1.8 (swaptions), 2.2-2.4 (change of numeraire), and 6.3 (swaption pricing under specific models).
  2. R. Rebonato, Volatility and Correlation, 2nd edition, Wiley, 2004. Chapters 6-8 cover the swaption volatility surface, smile dynamics, and calibration targets.
  3. F. Black, "The Pricing of Commodity Contracts," Journal of Financial Economics, 3(1-2), 1976. The original Black formula.
  4. L. Bachelier, "Théorie de la Spéculation," Annales Scientifiques de l'École Normale Supérieure, 1900. The earliest option pricing model.