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:
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.
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$:
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:
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:
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:
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:
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)
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:
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.
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$.
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.
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.
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
- 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).
- R. Rebonato, Volatility and Correlation, 2nd edition, Wiley, 2004. Chapters 6-8 cover the swaption volatility surface, smile dynamics, and calibration targets.
- F. Black, "The Pricing of Commodity Contracts," Journal of Financial Economics, 3(1-2), 1976. The original Black formula.
- L. Bachelier, "Théorie de la Spéculation," Annales Scientifiques de l'École Normale Supérieure, 1900. The earliest option pricing model.