Hull-White is what you use when Vasicek fails, and it fails for one reason: three parameters cannot reproduce today’s yield curve. Hull-White fixes exactly that, and the fix is smaller than people expect.
![]()
One change. The constant long-run level
becomes a **function of time**
. Everything else — the Gaussian short rate, the exponential-affine bond prices, the closed forms — survives untouched.
Theta
is not calibrated. It is read off the curve.
This is the part that confuses people coming from Vasicek, where all three parameters are fitted. In Hull-White,
is **determined**, not optimised:
![]()
where
is today’s instantaneous forward curve. Give the model a curve and
follows by formula. There is no optimisation, no residual, no fit quality to report.
The consequence is that the model reproduces the initial curve **exactly**. Taking a realistic curve — inverted at the front, humped, the kind of shape Vasicek cannot produce at all:
| Maturity | Market zero | Model zero | Error |
|---|---|---|---|
| 1y | 4.3000% | 4.3000% | 0.00bp |
| 2y | 3.9000% | 3.9000% | 0.00bp |
| 5y | 3.6500% | 3.6500% | 0.00bp |
| 10y | 3.9000% | 3.9000% | 0.00bp |
| 20y | 4.1000% | 4.1000% | 0.00bp |
| 30y | 4.0500% | 4.0500% | 0.00bp |
Zero to machine precision, at every point, including the hump. Not a good fit — an identity.
And
is whatever the curve demands. On that curve it takes values like
at six months,
at two years,
at twenty. It is not a “long-run rate” in any economic sense; it is a bookkeeping function whose job is to bend the drift so the model lands on the right bond prices.
What you actually calibrate
Two parameters remain free:
and
. And they are calibrated to a completely different market.
The curve tells you about **levels** and is absorbed by
. Caps, floors and swaptions tell you about **volatility**, and that is what
and
are fitted to.
That separation is the whole design. Each market informs the thing it actually knows about, and the two never fight each other. In Vasicek they do — you cannot ask three parameters to match both a curve and a volatility surface.
What mean reversion really controls
Here is the part that is rarely made concrete, and it matters more than the textbook treatment suggests.
In an affine model the sensitivity of a
-maturity yield to the short rate is
where
. That single expression governs how much of a short-rate move propagates to the long end:
| 10y sensitivity | 30y sensitivity | |
|---|---|---|
| 0.01 | 0.9516 | 0.8639 |
| 0.05 | 0.7869 | 0.5179 |
| 0.15 | 0.5179 | 0.2198 |
| 0.50 | 0.1987 | 0.0667 |
At
, a 100bp move in the short rate moves the 30-year yield by **under 7bp**. The long end is effectively pinned.
So
is not really “how fast rates revert”. It is **how much of the curve moves together** — the decorrelation between short and long rates. High
means a curve that pivots; low
means a curve that shifts in parallel.
This is why calibrations to long-dated swaptions routinely produce very small
, sometimes pinned near zero or even negative. Real long-end volatility is high, and only a low mean reversion delivers it. If you see
on a book of 30-year Bermudans, the model is telling you the long end barely moves, which the market disagrees with.
What Hull-White does not fix
Two things, and both are worth being honest about.
**Negative rates.** The short rate is still Gaussian, so it still goes below zero — and on the curve above, more often than in the Vasicek example:
| Horizon | sd of |
|
|---|---|---|
| 1y | 0.98% | 0.00% |
| 5y | 1.98% | 3.06% |
| 10y | 2.51% | 4.36% |
| 30y | 3.08% | 9.86% |
Post-2014 this is much less of an objection than it used to be — negative rates happened, in several currencies, for years. A Gaussian model describes that regime correctly where a lognormal one cannot. If it still bothers you, the shifted lognormal or a CIR-type specification addresses it, at the cost of the closed forms.
**One factor means one shape of movement.** The entire curve is driven by a single Brownian motion, so all yields are perfectly correlated instantaneously. Real curves steepen, flatten and twist independently. For a Bermudan swaption that is usually tolerable. For anything with genuine curve-shape exposure — CMS spread options, constant maturity structures — you need two factors, and Hull-White extends to that naturally.
Why it survives anyway
Everything analytic in Vasicek carries over. Bond prices stay exponential-affine, zero-coupon bond options have closed forms, and options on **coupon** bonds decompose exactly via Jamshidian’s trick — which makes European swaptions analytic and gives you a model-independent check on any implementation.
That combination is rare: a model that fits the curve exactly, calibrates to swaptions, and still lets you validate your numerics against closed form. It is why Hull-White is still the default for Bermudan swaptions, callable bonds and rate exposure in XVA engines decades after it was published.
Code
import numpy as np
a, sig = 0.05, 0.010
mats = np.array([0.25,0.5,1,2,3,5,7,10,15,20,30])
mkt = np.array([4.60,4.55,4.30,3.90,3.70,3.65,3.75,3.90,4.05,4.10,4.05])/100
def P0(T): return np.exp(-np.interp(T, mats, mkt)*T)
def f0(T, h=1e-5): # instantaneous forward
return -(np.log(P0(T+h)) - np.log(P0(max(T-h, 1e-9))))/(2*h)
def theta(t, h=1e-3): # read off the curve, not fitted
df = (f0(t+h) - f0(t-h))/(2*h)
return df + a*f0(t) + sig**2/(2*a)*(1 - np.exp(-2*a*t))
for t in (0.5, 1, 2, 5, 10, 20):
print(f"t={t:>5.1f} f(0,t)={f0(t):.4%} theta={theta(t):+.5f}")
# how much of a short-rate move reaches each maturity
for T in (2, 10, 30):
B = (1 - np.exp(-a*T))/a
print(f"{T:>3}y sensitivity to the short rate: {B/T:.4f}")
The test worth building in: price the initial zero-coupon bonds through your model and compare with the input curve. The error must be zero, not small. If it is small,
is being fitted rather than derived, and you have reintroduced the problem Hull-White exists to solve.
The takeaway
Hull-White is Vasicek with a time-dependent drift, and that single change is what makes it usable.
is derived from today’s forward curve rather than calibrated, so the model reprices the curve exactly by construction, leaving
and
free for the volatility market.
The parameter that repays attention is
: it is not really a reversion speed but a decorrelation control, deciding how much of a short-rate move reaches the long end. At
a 100bp short-rate move shifts the 30-year yield by 7bp, which is why long-dated calibrations push it toward zero.
Read alongside the Vasicek model, which is what this extends and why the extension was necessary.
Short-rate models, curve calibration and the numerical checks behind them are worked through from the ground up in the course modules.
Get the Quant Reference Card — four pages covering stochastic calculus, measure change, the models you’ll meet, discretisation, rates, credit and XVA. Free.