Here is the problem in its sharpest form. Suppose the on-the-run 5-year Government of India security (G-Sec) pays a semi-annual coupon and trades at par (price 100), yielding 7.00%. That 7.00% is a single number, but the bond's ten semi-annual cash flows are not all worth the same rate: the coupon landing in six months carries almost no time-value risk and should logically discount at something close to the shortest, safest rate the market has; the redemption landing in five years carries five years of rate uncertainty and should discount at whatever the market charges for that horizon. The quoted 7.00% is a blended internal rate of return across all ten cash flows, it is not, and was never meant to be, the market's actual price for a rupee arriving at each individual date. As long as you only ever need to price that exact bond, the blend is harmless. The instant you need to price anything else, an off-the-run bond with a different coupon maturing at the same date, a single isolated cash flow, a swap, an option, the blend actively misleads you, because it silently assumes every one of its own cash flows was discounted at the same rate, which is only true if the curve happens to be perfectly flat.
Advertisement
What is the spot curve, and why do you need to bootstrap it?
What you actually need is the spot curve (also called the zero curve): the discount rate that applies to a single cash flow landing at each individual future date, with no coupons in between to blend it. If you had that, pricing anything would be trivial, discount every cash flow at its own maturity's spot rate and add them up. The problem is that the market does not quote spot rates directly, except at the very front of the curve (a genuine zero-coupon T-bill or Treasury bill is a directly observable spot rate). Beyond the money-market tenors, the only liquid, actively-quoted instruments are coupon-bearing par bonds and par swaps at a handful of standard on-the-run maturities: 1, 2, 3, 5, 7, 10 years, say. Each one of those quotes is itself a blend, exactly like the 7.00% above. You have a system of blended averages and you need the individual ingredients each average was built from. Bootstrapping is the recursive arithmetic that unscrambles it: solve for the shortest unknown spot rate first (using only already-known, shorter spot rates plus one new par quote), then use that freshly-solved spot rate to unlock the next one out, and so on, walking out along the curve one maturity at a time until every point is known. It is called bootstrapping because each step literally pulls itself up using only the steps already solved, there is no other way to get the full curve out of a sparse set of blended par quotes.
Building the spot curve: the bootstrap algorithm
Formalize it. Let the market quote par yields at a sparse set of benchmark maturities: call them the on-the-run bonds. A par bond is, by construction, a bond priced at exactly 100 (per 100 face) whose coupon rate equals its own yield at that maturity; that fact is what makes the algebra solvable. Work in semi-annual periods (the real convention for both G-Secs and US Treasuries), so a bond maturing in m years has 2m coupon dates, paying a fixed coupon c/2 per 100 face each period, where c is the annual par yield.
Step 1: fill the grid. Real benchmark quotes are sparse (say 0.5, 1, 2, 3, 5, 7, 10 years) but bootstrapping needs a par yield at every coupon date up to the longest maturity (every half-year point). Fill the gaps by linearly interpolating the par yield curve between adjacent known benchmarks, this is standard market practice (it is exactly how FBIL builds the published daily G-Sec par curve from a sparser set of live-traded benchmarks), not a simplification unique to this module.
How do you solve for each spot rate in turn?
Step 2: solve sequentially. Walk out along the now-complete grid of maturities m = 0.5, 1.0, 1.5, 2.0, …. At each step, every discount factor for a maturity shorter than m is already known from the previous steps. The par condition, a bond with coupon equal to the par yield at m must price to exactly 100, gives you exactly one equation in exactly one unknown, the discount factor at m:
DF(m) = [100 − Σ (coupon × DF(t))] / (100 + coupon)
where the sum runs over every earlier coupon date t < m (all already known), and coupon = par_yield(m) / 2 × 100 is this bond's own semi-annual coupon in rupees or dollars per 100 face. Once DF(m) is known, convert it to an annualized, semi-annual-compounded spot rate:
spot(m) = 2 × [ DF(m)^(−1/(2m)) − 1 ]
Repeat at the next grid point, now treating DF(m) as one more known quantity for the step after it. By the time you reach the longest maturity, you have a complete spot curve at every half-year point, built from nothing but the sparse par quotes and pure arithmetic, no external assumption about shape required.
How do you check that the curve is right?
Step 3: prove it. This is the step a shortcut-taker skips and the step this module refuses to skip. Take each of the original benchmark par bonds, the actual quoted instruments the curve was built from, and discount its own cash flows through the finished curve. Every single one must reprice to exactly 100.00, because that is algebraically what Step 2 solved for; if any of them does not, there is a bug (a compounding-frequency mismatch, an off-by-one in which discount factors counted as "already known," a broken interpolation) and the curve is not yet trustworthy. Worked Examples 1 and 2 run this exact three-step algorithm start to finish on the India G-Sec curve and the US Treasury curve and show the reprice check passing to the cent.