Quant Memo
Core

Bootstrapping the Zero Curve

How to turn a handful of quoted coupon bonds into a clean rate for every single future date. You solve one maturity at a time, each answer feeding the next, which is why it is called bootstrapping.

Prerequisites: Yield to Maturity, Bond Pricing and Accrued Interest

You want to value a cash flow arriving in exactly three years. What rate do you discount it at? The obvious move is to grab a three-year bond and use its Yield to Maturity — but that yield is a blend. It is one average rate smeared across payments in year one, year two and year three, and the blend depends on the size of that bond's coupon. Two three-year bonds with different coupons have different yields, so "the three-year rate" is ambiguous before you have done any work.

What you actually want is a zero rate: the pure interest rate for a single payment on a single date, with nothing else mixed in. Zero rates are what discount factors are made of, and every derivative pricing model starts from them.

The problem is that pure zero-coupon bonds barely trade past a year or two. Almost everything quoted in the market is a coupon bond. So you have to extract the zeros from the coupon bonds — and you do it the way you solve a chain of simultaneous equations by hand, one unknown at a time, each solved value making the next equation solvable. Hence bootstrapping: pulling yourself up by your own bootstraps.

Bootstrapping walks up the maturity ladder. At each step, every cash flow except the last is discounted with rates you already solved, leaving exactly one unknown — so you can solve for it directly, with no optimiser and no guesswork.

Setting up

Write znz_n for the annual zero rate to year nn, and DnD_n for the matching discount factor, the present value today of 1 unit paid at year nn:

Dn=1(1+zn)n.D_n = \frac{1}{(1 + z_n)^{n}} .

In words: the discount factor is just the zero rate rewritten as a price. If D2=0.919D_2 = 0.919, then a promise of 100 in two years is worth 91.9 today, and that is the same statement as "the two-year zero rate is 4.31%".

We will bootstrap from par bonds — bonds whose coupon is set so they trade at exactly 100. That is the cleanest case because the price on the left-hand side is always 100.

one unknown per rung 1y bond z1 2y bond known z2 3y bond known known z3 year 1 year 2 year 3
Green cells are cash flows you can already discount because you solved that rate on an earlier rung. Amber is the single unknown on each row. The whole method is arranging the problem so there is never more than one.

Worked example: three rungs

Par yields are quoted at 4.00% for one year, 4.30% for two and 4.50% for three, all annual coupons.

Rung 1. The one-year bond pays 104.00 once, and costs 100:

100=104.001+z1z1=4.000%.100 = \frac{104.00}{1 + z_1} \quad\Rightarrow\quad z_1 = 4.000\% .

At the shortest maturity there is only one payment, so par yield and zero rate are identical. This is the only rung where that is true.

Rung 2. The two-year bond pays 4.30 next year and 104.30 the year after. Discount the first with z1z_1, which we now know:

100=4.301.04+104.30(1+z2)2.100 = \frac{4.30}{1.04} + \frac{104.30}{(1+z_2)^{2}} .

The first term is 4.1346, so the second must supply 95.8654. Then (1+z2)2=104.30/95.8654=1.08799(1+z_2)^2 = 104.30 / 95.8654 = 1.08799, and taking the square root gives 1+z2=1.043071 + z_2 = 1.04307, so z2=4.307%z_2 = 4.307\%.

Rung 3. Same move, one step further out:

100=4.501.04+4.501.08799+104.50(1+z3)3.100 = \frac{4.50}{1.04} + \frac{4.50}{1.08799} + \frac{104.50}{(1+z_3)^{3}} .

The two known terms come to 4.3269 and 4.1361, totalling 8.4630. So the final payment must be worth 91.5370 today, giving (1+z3)3=104.50/91.5370=1.14162(1+z_3)^3 = 104.50/91.5370 = 1.14162, and the cube root leaves z3=4.514%z_3 = 4.514\%.

MaturityPar yieldZero rateDiscount factor
1y4.000%4.000%0.96154
2y4.300%4.307%0.91913
3y4.500%4.514%0.87595

The zero curve sits above the par curve, and the gap widens with maturity. That is not a coincidence: when the curve slopes up, a par bond's early coupons get discounted at low short rates, which drags its blended yield below the true rate for its final payment.

Worked example: using the curve

Now price a three-year bond with a 6% coupon — an off-market bond nobody quoted. Discount each payment with its own factor:

P=6(0.96154)+6(0.91913)+106(0.87595)=5.769+5.515+92.850=104.13.P = 6(0.96154) + 6(0.91913) + 106(0.87595) = 5.769 + 5.515 + 92.850 = 104.13 .

Its yield to maturity works out to about 4.50%, below the three-year zero rate of 4.514%, because a chunk of its value is discounted at the cheaper one- and two-year rates. That is the blending effect made concrete, and it is why you price off zeros and quote in yields, never the reverse.

The finished curve is the raw material for everything else in rates. Drag the level, slope and curvature sliders below and watch how the shape moves — the same three degrees of freedom that a bootstrapped curve exhibits in real data:

Yield curve
0%2%4%3m1y3y7y20y
2y 2.95%10y 4.00%10y−2y 1.04%upward sloping

In practice

Real desks bootstrap from a mixed ladder: cash deposits and futures at the front, swaps further out, since those are the most liquid instruments at each horizon. Between quoted maturities you must interpolate, and the choice matters more than beginners expect — linear interpolation on zero rates produces jagged, sometimes negative Forward Rates and Implied Forwards, which is why practitioners prefer monotone or spline schemes. Since the 2008 crisis, one curve is no longer enough: discounting uses an OIS or SOFR curve while cash flows project off another, so the bootstrap runs several curves at once.

A par yield is not a zero rate, and neither is a yield to maturity. They coincide only at the very first maturity and whenever the curve is perfectly flat. Discounting a lump sum at a coupon bond's YTM is a small error on a short bond and a serious one on a long steep curve.

Key terms

  • Zero (spot) rate — the rate for a single payment on a single date.
  • Discount factor — present value of 1 unit paid at a future date.
  • Par bond — a bond whose coupon equals its yield, so it prices at 100.
  • Bootstrapping — solving maturities in order, reusing each solved rate in the next equation.
  • Interpolation — filling the gaps between quoted maturities.

Related concepts

Practice in interviews

Further reading

  • Tuckman & Serrat, Fixed Income Securities (Ch. 2)
  • Hull, Options, Futures, and Other Derivatives (Ch. 4)
ShareTwitterLinkedIn