Branch: Fixed Income Analytics (Finance-Plus ring) · Node FI1.03 · ~18 focused hours · Mastery gate ≥85%
A quoted bond yield is a single number standing in for something that is not actually single. When a bond pays coupons in six months, in a year, in three years, and its face value in five, each of those cash flows is really worth a different rate of time value (the market's price for money six months out is not its price for money five years out) and the bond's yield to maturity is only a blended average across all of them, weighted by how big and how near each cash flow happens to be. That average is useful for quoting and comparing bonds, but it cannot price anything else: not an off-the-run bond with a different coupon at the same maturity, not a swap, not an option on a bond, not a cash flow that lands on a date no traded bond happens to mature on. To price any of those you need the thing the blended yield is hiding, the actual rate the market assigns to a rupee or a dollar landing at each specific point in time. That object is the spot (zero-coupon) curve, and the problem is that nobody quotes it directly. The market quotes par yields on a handful of liquid, on-the-run coupon bonds and swaps at standard maturities, and nothing else. Getting from the sparse thing the market actually gives you to the complete thing you actually need is bootstrapping, and it is the single most load-bearing piece of machinery in fixed income: every duration number in FI1.02, every OAS in FI1.04, every swap valuation in DV1.01, and every discount rate anywhere in this program's DCF work ultimately rests on a curve that was built this way.
Advertisement
This module builds that machinery end to end and insists on proving it at every step. You will bootstrap a spot curve from on-the-run government bonds, in India and in the US; extract the forward rates the curve implies; use both to price a bond the curve was not built from; bootstrap a swap curve from OIS/SOFR and INR-OIS/MIBOR par rates using (you will prove this, not just be told it) the identical algorithm; read the swap spread between the two curves through the lens of segmentation and collateral technicals rather than credit risk; and close with a sketch of a short-rate model, so you have seen, at least once, what it means to model the curve's dynamics rather than just its snapshot. Every curve you build here is proved by discounting the very bonds and swaps used to build it and confirming the price comes back out to the cent, because a curve that does not reprice its own inputs is not a curve, it is a mistake wearing a curve's clothes. This Ring is additive institutional/CFA breadth, it presents the toolkit and the plumbing alongside, not in place of, the program's process-over-P&L, concentration-over-diversification philosophy.
One more thing to hold before you start, because this module sits in an unusually exposed spot for it: quantitative curve work is one of the corpus's highest AI-over-trust risk areas. An AI assistant can write you a fluent, confidently-commented bootstrapping script in ten seconds, with the compounding frequency subtly wrong, or the interpolation applied to the wrong curve, or a sign error in the forward-rate formula, and the output will look exactly like a correct curve: a smooth, plausible table of numbers with no red flag anywhere in its formatting. The only thing that catches this is the discipline this module is built around and will drill until it is reflexive: you do not trust a curve, you reprice it. Every bootstrapped curve below is checked by discounting its own input bonds back through it and confirming the price returns to par, and every forward rate is checked by proving the roll-forward identity numerically. That check is not optional scaffolding for the lesson, it is the actual professional discipline, and an AI-generated curve that has not passed it is not yet a curve you may use.
Learning objectives
By the end you can:
- Explain the chicken-and-egg problem that makes bootstrapping necessary, why the market's directly-quoted par yields cannot, by themselves, correctly price anything the curve was not built from.
- Bootstrap a spot (zero) curve from a set of on-the-run par/coupon bonds (India G-Secs and US Treasuries) using linear interpolation of the sparse par curve followed by sequential discount-factor solving, and prove it by discounting every input bond's own cash flows back through the curve and confirming an exact reprice to par.
- Compute implied forward rates from a spot curve via the no-arbitrage identity, and prove numerically that investing directly at a longer spot rate produces the identical terminal value as rolling at the shorter spot rate and then the implied forward rate.
- Price an off-the-run bond off a bootstrapped spot curve, solve for its yield to maturity, and explain (with a worked number, not just a rule) why that YTM generally differs from the par yield quoted at the same maturity (the coupon effect).
- State the expectations, liquidity-premium, and market-segmentation/preferred-habitat theories of the term structure in quantitative (algebraic) form, as decompositions of the forward rate, building explicitly on the narrative version of these theories already taught in M7.03.
- Bootstrap a swap curve (INR OIS/MIBOR or USD SOFR) from par swap rates, having first proved (via the floating-rate-note-at-par argument) why the identical bond-bootstrap algorithm applies; then compute and correctly interpret a swap spread, distinguishing it explicitly from a corporate credit spread (E11.01).
- Build and calibrate, as a deliberate sketch, a one-factor short-rate model (Vasicek); compare its model-implied curve to the empirical bootstrap; and state precisely what a short-rate model buys you that a static bootstrap cannot.
- Apply India (on-the-run G-Secs, FBIL/CCIL/FIMMDA conventions, SDLs, INR OIS/MIBOR) and US (on-the-run UST, SOFR) market conventions correctly, and never confuse the curve-shape/inversion-signal skill (M7.03) with the curve-construction skill taught here.
- (Productivity objective: R10 duality.) Use AI to accelerate drafting or debugging a bootstrapping script, or to explain a formula, while treating the reprice-and-roll-forward proof as the one non-negotiable verification step that no AI-produced curve, spread, or model fit is ever exempt from.
Prerequisites & connections
Builds on. FI1.01 (Bond Pricing & Yield Measures) is assumed fluent: YTM, current yield, and the money-market yield conversions are inputs to this module, not review; this module builds the curve that FI1.01's single-bond pricing takes as given. FI1.02 (Duration, Convexity & Interest-Rate Risk) is referenced, never re-taught: Macaulay/modified duration, PVBP/DV01, and key-rate duration all operate on the spot curve this module constructs, and a key-rate duration is literally "bump one point of this curve and reprice", but the mechanics of duration itself live in FI1.02, not here. M1.08 (Liabilities & Financing) §4.1 teaches bond accounting, amortized cost under the effective-interest method, the book-value roll-forward a company reports on its balance sheet. That is a different object from what this module does: M1.08 answers "what does the issuer's book say this liability is worth," carried at a historical effective rate; this module answers "what does the market say a cash flow landing at time t is worth today," off a curve that is re-built from current quotes every day. Never let the two blur into each other. M7.03 §4.10–§4.13 already introduced the yield curve's shape (normal/flat/inverted/humped), the inversion-as-recession-signal, the expectations-plus-term-premium decomposition of a long spot yield, the liquidity-preference and market-segmentation/preferred-habitat theories by name, and the duration formula. This module is the deliberate quantitative complement: it does not re-derive any of that narrative, it builds the machinery, the bootstrap, the forward-rate algebra, and the same three theories extended algebraically to the forward curve, that turns M7.03's shapes into priced numbers. E11.01 §11.2 established corporate yield = risk-free rate + credit spread; this module's swap-spread section leans on that scaffold explicitly and then shows why a swap spread is not a credit spread in E11.01's sense.
Feeds forward. FI1.04 (Embedded Options, OAS & Structured Products) takes the spot curve and the short-rate idea sketched here and builds the real machinery on top of them, a binomial interest-rate tree consistent with today's curve, option-adjusted spread, and CDS priced from hazard rates all assume you can already bootstrap and can already picture a short-rate model as dynamics, not just a snapshot. DV1.01 (Forwards, Futures & Swaps) values a swap as a bond-equivalent using exactly the curve-construction logic proved here. Every discount rate used anywhere else in this program traces back, eventually, to a curve built this way.
The one-sentence version of this module. The market only quotes par yields on a handful of liquid bonds and swaps; everything else you will ever need to price (an off-the-run bond, a forward rate, a swap, an option) requires the complete spot curve those sparse quotes imply, and bootstrapping is the provable, arbitrage-free arithmetic that gets you there and then proves, by repricing its own inputs, that it got there correctly.
Core teaching content
Bootstrapping the yield curve
Bootstrapping the yield curve is the step-by-step arithmetic that turns a few quoted par yields into a spot rate for every maturity. A par yield is a blend of the rates for all of a bond's cash flows, so you solve for the shortest spot rate first, then use it to solve the next one, and so on out along the curve. The finished curve must reprice every original par bond to exactly 100, which is how you know it is right.
6 min read, on its own page
Discount factors and pricing off the curve
Once the spot curve exists as a table of discount factors, pricing anything (including a bond the curve was never built from) is one line of arithmetic: sum each cash flow times the discount factor for its own maturity.
Price = Σ CF(t) × DF(t)
Contrast this, deliberately, with what a single flat discount rate does. If you instead discounted every one of a bond's cash flows at one flat rate (even a correct-looking flat rate, such as that bond's own spot rate at maturity) you would be implicitly assuming the curve is flat out to that maturity, which it almost never is. Common mistakes, below, computes exactly how large that error is on a real number; hold the principle here: the entire value of a curve, versus a single yield, is that every cash flow gets discounted at the rate for its own date, never at one rate borrowed from somewhere else on the curve. This is the property Worked Examples 1 and 2 use to price an off-the-run bond, one with a coupon that does not match the par rate at its maturity, so it was never a direct input to the bootstrap, and the property that lets you solve, separately, for that bond's own yield to maturity and observe (correctly) that it does not equal the par yield quoted at the same maturity.
Implied forward rate
An implied forward rate is the interest rate that today's spot curve implies for a period starting at a future date and running to a later one. It follows from a no-arbitrage argument: investing for the whole period at the longer spot rate must give the same result as investing at the shorter spot rate and then reinvesting at the forward rate. Two observed spot rates fully determine it, so no forecast is needed, and it does not automatically equal the market's best guess of the future spot rate.
4 min read, on its own page
Yield curve theories
The yield curve theories are three classic explanations for the shape of the curve. Pure expectations says a forward rate is exactly the market's expected future short rate, while liquidity-premium theory adds a premium for committing money further out. Market segmentation, or preferred habitat, says the rate in each maturity range is set by supply and demand within that range. Professionals read a forward curve as a blend of all three.
3 min read, on its own page
Swap curve bootstrapping
Swap curve bootstrapping builds a discount curve from par swap rates instead of par bond yields. A vanilla swap has zero value at inception, so the present value of its fixed leg must equal that of its floating leg, and that makes a par swap curve bootstrap with the identical algorithm as a par bond curve. You interpolate par swap rates between the standard maturities and solve for each discount factor in turn.
3 min read, on its own page
Swap spread
The swap spread at a given tenor is the swap rate minus the sovereign yield of matching maturity, for example, the 10-year SOFR swap rate minus the 10-year UST yield, or the 10-year INR OIS rate minus the 10-year G-Sec yield. It is not the credit spread of one issuer. It reflects the standing of the dealer sector and a set of market technicals, such as the cost of collateral and the supply of sovereign bonds. Long-tenor USD swap spreads have even been negative for an extended period.
4 min read, on its own page
Vasicek model
The Vasicek model (1977) is the simplest widely cited short-rate model. It says the instantaneous short rate drifts back toward a long-run level at a set speed, while random shocks push it around. Because the model is tractable, it gives a closed-form price for a zero-coupon bond and so a model-implied spot rate at any maturity. It is useful for simulating rate paths, but it cannot match a whole curve exactly, which is why the bootstrap still supplies today's prices.
6 min read, on its own page
Riding the yield curve
Riding the yield curve means buying a longer bond on an upward-sloping curve and selling it a year later as a shorter one. Carry is the coupon you collect over the holding period, plus what the coupons earn once reinvested. Roll-down is the price gain from the bond sliding to a shorter, lower-yielding point on an unchanged curve. Riding the curve is a bet that the curve will not do what the forwards imply, and an upward-sloping curve is not by itself evidence for that bet.
5 min read, on its own page
Level, slope and curvature of the yield curve
Level, slope and curvature are the three factors that explain almost all of the movement in a yield curve. A twenty-point curve has twenty degrees of freedom on paper, but about three in practice, which changes how a rates book is hedged and stress-tested. Principal component analysis finds the factors: the level factor moves every tenor the same way, the slope factor steepens or flattens the curve, and the curvature factor is the butterfly.
6 min read, on its own page
FBIL, CCIL and FIMMDA
FBIL, CCIL and FIMMDA are the three Indian institutions that sit behind the G-Sec market. FBIL publishes the daily reference G-Sec par yield curve and benchmark rates such as MIBOR. CCIL runs the NDS-OM trading platform and clears repo and OIS. FIMMDA is the industry body that sets valuation and day-count conventions, which you should check against its current circulars. On-the-run bonds are the most recently auctioned and most liquid benchmarks; off-the-run bonds are priced off the curve they build.
3 min read, on its own page
Common mistakes & how experts think differently
- "The bond's YTM basically is the spot rate at that maturity." It is not, except for a genuine zero-coupon instrument. A coupon bond's YTM is a blended average across every one of its cash flows' individual spot rates, weighted toward whichever dates carry the most cash. The expert's test: does this instrument have cash flows on more than one date? If so, its quoted yield is a blend, and pricing anything else off that single blended number (rather than off the full spot curve) is exactly the error this module exists to retire.
- Flat-discounting instead of true curve-discounting. Take the India 7-year, 7.15% G-Sec and discount all fourteen of its coupons plus redemption at one flat rate equal to its own 7-year spot rate (7.2072%) instead of at the properly bootstrapped curve (each cash flow at its own maturity's spot rate). The flat-discounted price comes out to 99.6898, a roughly 31-cent (≈31 bp) pricing error versus the true, curve-consistent value of par (100.00), even though the flat rate used was not an arbitrary guess but the bond's own, correctly-computed spot rate. The error exists purely because the early coupons, which should be discounted at the lower short-end rates, got discounted at the higher long-end rate instead. Experts never flat-discount a multi-cash-flow instrument off a single point on the curve, however well-chosen that point looks.
- Treating a forward rate as a forecast. A forward rate is an arbitrage-free mathematical fact about today's curve (full stop) not automatically the market's expectation of the future spot rate. Confusing the two is the pure-expectations-hypothesis trap: it silently assumes
φ = 0in the liquidity-premium decomposition, when in reality most observed forward curves are some blend of genuine expectation and term/liquidity premium, and (per market-segmentation theory) sometimes substantially neither. The expert's habit is to say "the curve implies a forward of X%" and stop there unless a separate, defensible premium estimate is on the table before converting that into "the market expects X%." - Confusing swap spread with credit spread. E11.01's
corporate yield = risk-free + credit spreadframework prices one issuer's default risk. A swap spread is not that, nobody defaults on a swap the way a corporate bond issuer can default, and the swap curve is not any single entity's cost of funds. Reading a widening swap spread as "the banking sector is riskier" without separately checking collateral/repo technicals, balance-sheet regulatory costs, and sovereign-supply effects is exactly the category error this module's swap-spread section exists to prevent, and it is the single most common mistake analysts trained only on corporate credit make the first time they look at a swap curve. - Interpolating spot rates (or YTMs of unlike bonds) directly, instead of interpolating the par curve first. Spot rates are not linear in maturity the way par rates approximately are near a bootstrap grid, interpolating them directly (or worse, interpolating the YTMs of two bonds with different coupons) can introduce a visible kink or bias that a par-curve-then-bootstrap approach avoids. This module's own algorithm interpolates the par curve, precisely because that is the object market convention (and FBIL's own published methodology) actually interpolates.
- Reading curve inversion here as if this were M7.03. This module builds the curve; M7.03 §4.10–§4.11 reads its shape as a macro signal (inversion as a recession forecast, term premium versus expectations, the four bull/bear steepener/flattener moves). They are different skills using the same object. Do not re-derive the inversion-signal discussion here, and do not mistake fluency in bootstrapping mechanics for fluency in reading what a curve's shape is telling you about the cycle, each lives in its own module for a reason.
- Over-trusting a short-rate model's fitted curve as if it were the market curve. The Vasicek fit above has a real, computed RMSE of 13.27 bp (India) and 19.97 bp (US) against the actual bootstrapped curve, not zero. A parsimonious model curve is for dynamics and simulation; the bootstrap remains the sole source of today's exact, tradeable prices. Pricing an actual instrument off the Vasicek-model curve instead of the bootstrap is a mistake regardless of how good the RMSE looks.
- Assuming India's G-Sec curve inversion carries the same recession-signal weight as a US Treasury inversion. M7.03 §4.10 already establishes why not. SLR-driven captive demand, RBI's hands-on liquidity operations, and a shallower, less globally-arbitraged market all distort the India curve's slope relative to the US curve's. That is a shape-reading judgment, referenced here, not re-argued.
- Trusting an AI-generated curve, spread, or calibration because the output looks clean. A fluent bootstrap script, a plausible swap-spread narrative, or a smooth Vasicek fit table can all be wrong in ways that produce no visible red flag in the formatting. The only real check, restated one final time because it is the law of this branch: reprice the input bonds, prove the roll-forward identity, and recompute at least one step by hand, every time, regardless of the source.
Worked examples
All figures in this section are synthetic and illustrative, dated 2026-07-28 for internal consistency, they are not live FBIL, RBI, US Treasury, or SOFR quotes, and every one of them was recomputed in a Python scratch script before being written here (the R3 law of this branch). Rates are annualized, semi-annual-compounded throughout; all bonds/swaps carry semi-annual cash flows on a 0.5-year grid.
Worked example 1: Bootstrapping the India G-Sec spot curve, and proving the reprice (India, ₹)
You are given the on-the-run G-Sec par curve, synthetic and dated 2026-07-28:
| Maturity | 0.5y | 1y | 2y | 3y | 5y | 7y | 10y |
|---|---|---|---|---|---|---|---|
| Par yield | 6.40% | 6.50% | 6.65% | 6.80% | 7.00% | 7.15% | 7.25% |
Solution. Step 1, interpolate the par curve onto the full semi-annual grid (0.5, 1.0, 1.5, …, 10.0, twenty points), linearly, between adjacent known benchmarks.
Step 2: bootstrap sequentially. At m = 0.5: a single-period instrument has no earlier cash flow to know, so its par yield is its spot rate directly: spot(0.5) = 6.4000%, DF(0.5) = 1/(1+0.064/2) = 0.968992. At m = 1.0: the par bond pays a 6.50%/2 = 3.25 coupon at t=0.5 (known) and 100+3.25 at t=1.0. Solve DF(1.0) = [100 − 3.25×0.968992] / 103.25 = 0.938022, giving spot(1.0) = 2×[0.938022^(−1/2) − 1] = 6.5016%, which is exactly how practice item P1 writes it. Continue the identical recursion out to 10 years. The full result, at the benchmark points:
| Maturity | 0.5y | 1y | 2y | 3y | 5y | 7y | 10y |
|---|---|---|---|---|---|---|---|
| Spot rate | 6.4000% | 6.5016% | 6.6566% | 6.8156% | 7.0345% | 7.2072% | 7.3235% |
| Discount factor | 0.968992 | 0.938022 | 0.877250 | 0.817863 | 0.707740 | 0.609189 | 0.487113 |
Notice the spot curve sits above the par curve at every maturity beyond the first period (e.g., 10y spot 7.3235% vs. 10y par 7.2500%), because this par curve is upward-sloping, so each par bond's early coupons are "cheap" (discounted at lower short rates) relative to a hypothetical zero paying only at maturity, which must earn a higher rate to compensate for having none of its value front-loaded at those cheaper short rates. This is a general fact, not a coincidence of these numbers: whenever the par curve rises with maturity, the spot curve rises faster.
Step 3: prove it. Discount each of the seven original par bonds' own cash flows through this finished curve. Every one reprices to 100.000000, exactly, to machine precision, the curve is proved self-consistent.
Worked example 2: Bootstrapping the US Treasury curve and pricing an off-the-run note (US, $)
You are given the synthetic, dated 2026-07-28 on-the-run UST par curve:
| Maturity | 0.5y | 1y | 2y | 3y | 5y | 7y | 10y |
|---|---|---|---|---|---|---|---|
| Par yield | 4.20% | 4.25% | 4.10% | 4.05% | 4.15% | 4.30% | 4.45% |
Notice this curve is not monotonic (it dips from 1y to 3y before rising again) which is exactly the shape a single-factor short-rate model will later struggle to fit (Core teaching content, Vasicek sketch).
Solution. Bootstrap using the identical three-step algorithm as Worked Example 1:
| Maturity | 0.5y | 1y | 2y | 3y | 5y | 7y | 10y |
|---|---|---|---|---|---|---|---|
| Spot rate | 4.2000% | 4.2505% | 4.0968% | 4.0457% | 4.1544% | 4.3214% | 4.4934% |
| Discount factor | 0.979432 | 0.958812 | 0.922095 | 0.886779 | 0.814164 | 0.741353 | 0.641231 |
Reprice check: all seven input USTs reprice to 100.000000 exactly.
Price an off-the-run note. A seasoned, low-coupon 6-year UST, say a 2.00% coupon note, off-the-run and never a bootstrap input, is priced by discounting its twelve semi-annual cash flows at the curve's own maturity-matched discount factors (interpolating the curve at the 6-year point where needed): fair value = 88.2861. Independently solving for this note's own (flat) yield to maturity from that price gives YTM = 4.2311%, versus an interpolated 6-year par yield of 4.2250%, a small but real and correctly-signed +0.61 bp gap. The direction is not arbitrary: because this curve is rising through the 5–7 year stretch, a low-coupon bond (more of its value concentrated in the final, higher-yielding redemption) pulls its blended YTM above the par yield. Pushed to the limit, a genuine zero-coupon 6-year note's YTM would equal exactly the 6-year spot rate, 4.2373%, the theoretical bound this off-the-run note's YTM sits between (4.2250% < 4.2311% < 4.2373%), confirming the pricing is internally consistent.
Worked example 3: Implied forward rates and the roll-forward proof (India, ₹)
Using the India spot curve from Worked Example 1, find the market-implied 1-year rate, one year forward (1y1y) and the 5-year rate, five years forward (5y5y), and prove the no-arbitrage identity numerically.
Solution. Apply the forward-rate formula from Core teaching content using the bootstrapped discount factors:
f(1,2) = 2 × [(DF(1)/DF(2))^(1/2) − 1] = 2 × [(0.938022/0.877250)^(1/2) − 1] = 6.8116% f(5,10) = 2 × [(DF(5)/DF(10))^(1/10) − 1] = 2 × [(0.707740/0.487113)^(1/10) − 1] = 7.6129%
Both forwards sit above their nearer spot rate (1y1y at 6.8116% vs. the 1y spot of 6.5016%; 5y5y at 7.6129% vs. even the longer 10y spot of 7.3235%), a direct consequence of this curve being upward-sloping and accelerating slightly further out; a forward rate for a later period can legitimately exceed even the longest observed spot rate when the curve is convex like this.
Prove the roll-forward identity. Take ₹100 two ways: (a) invest directly for 2 years at the 2-year spot rate; (b) invest for 1 year at the 1-year spot rate, then reinvest the proceeds for 1 more year at the 1y1y forward just computed.
(a) 100 × (1 + 0.066566/2)^4 = 113.992627 (b) 100 × (1 + 0.065016/2)^2 × (1 + 0.068116/2)^2 = 113.992627
The two match to 4×10⁻¹⁴: floating-point noise, i.e., exact. Repeating over the full 10-year horizon using the 5-year spot rate and the 5y5y forward: direct = 205.291033, rolled = 205.291033, difference −3×10⁻¹³. The identity holds exactly, both ways, because it is not an empirical regularity, it is the algebraic condition the forward rate was defined to satisfy.
Worked example 4: Bootstrapping the SOFR swap curve and reading the swap spread (US, $)
You are given a synthetic SOFR par-swap curve dated 2026-07-28:
| Maturity | 1y | 2y | 3y | 5y | 7y | 10y |
|---|---|---|---|---|---|---|
| Swap rate | 4.30% | 4.10% | 4.00% | 4.05% | 4.15% | 4.25% |
Solution. Bootstrap using the identical algorithm proved in Core teaching content (a par swap prices exactly like a par bond assuming a notional redemption at maturity):
| Maturity | 1y | 2y | 3y | 5y | 7y | 10y |
|---|---|---|---|---|---|---|
| Spot rate | 4.3000% | 4.0953% | 3.9927% | 4.0490% | 4.1609% | 4.2753% |
Reprice check: every input swap reprices to 100.000000 exactly, the same proof as a bond curve.
Swap spread (SOFR swap par rate minus UST par yield from Worked Example 2, matching tenor):
| Maturity | 1y | 2y | 3y | 5y | 7y | 10y |
|---|---|---|---|---|---|---|
| Swap spread | +5.0 bp | 0.0 bp | −5.0 bp | −10.0 bp | −15.0 bp | −20.0 bp |
The spread starts mildly positive at the front and turns increasingly negative further out, exactly the well-documented long-end negative-USD-swap-spread pattern described in Core teaching content (heavy Treasury issuance, a safe-asset convenience yield on UST, and post-crisis balance-sheet costs on swap positioning are the usual cited drivers; check the current levels and the prevailing explanation, since this is a live, moving market feature, not a fixed constant).
Worked example 5: Bootstrapping the INR OIS/MIBOR swap curve, the swap spread, and the SDL segmentation tie-in (India, ₹)
You are given a synthetic INR OIS/MIBOR par-swap curve dated 2026-07-28:
| Maturity | 1y | 2y | 3y | 5y | 7y | 10y |
|---|---|---|---|---|---|---|
| Swap rate | 6.55% | 6.70% | 6.85% | 7.05% | 7.20% | 7.35% |
Solution. Bootstrap identically to Worked Example 4:
| Maturity | 1y | 2y | 3y | 5y | 7y | 10y |
|---|---|---|---|---|---|---|
| Spot rate | 6.5500% | 6.7058% | 6.8651% | 7.0844% | 7.2574% | 7.4413% |
Reprice check: every input swap reprices to 100.000000 exactly.
Swap spread (INR OIS rate minus G-Sec par yield from Worked Example 1, matching tenor):
| Maturity | 1y | 2y | 3y | 5y | 7y | 10y |
|---|---|---|---|---|---|---|
| Swap spread | +5.0 bp | +5.0 bp | +5.0 bp | +5.0 bp | +5.0 bp | +10.0 bp |
Unlike the US pattern, this synthetic INR spread stays flat and mildly positive across most of the curve before widening slightly at 10 years, illustrative of a market where OIS trades at a modest premium to G-Secs across most tenors (check the current levels; this pattern is regime-dependent). Contrast this with the SDL spread over the same G-Sec curve (Core teaching content): both a swap spread and an SDL spread are "spread over G-Sec" numbers, but they are driven by economically different things, the swap spread by bank-sector/collateral/regulatory technicals in a derivatives market with no underlying bond changing hands, the SDL spread by a segmented cash-bond market where mandate-constrained investors (insurers, pension/provident funds) hold state paper that a G-Sec-only investor would not costlessly arbitrage into. Reading both spreads correctly means naming which of the two different mechanisms is doing the work, never defaulting to a single "credit spread" story for either.
Worked example 6: Riding the curve on the bootstrapped G-Sec curve (India, ₹)
Using Worked Example 1's finished curve, buy ₹100 face of the five-year par G-Sec at 100.000000 (7.00% coupon, ₹3.50 semi-annually). Hold one year, reinvesting the six-month coupon to the one-year date, then sell the position as a four-year bond. Compute the realised one-year return under two curve scenarios and compare each against the one-year alternative.
Solution. Step 1, name the benchmark before computing anything. The one-year spot is 6.5016% quoted semi-annually. On an effective annual basis that is (1 + 0.065016/2)² − 1 = **6.6073%**, and every realised figure below must be compared with 6.6073% rather than 6.5016%, because a one-year realised return is an effective annual number.
Step 2, scenario A, the curve is unchanged. Reinvest the ₹3.50 six-month coupon for half a year at the unchanged six-month spot of 6.4000%, so it grows to 3.50 × 1.032 = ₹3.6120, and add the ₹3.50 coupon received at the one-year date, giving ₹7.112000 of cash. The remaining eight semi-annual cash flows are now a four-year bond, priced off the same unchanged spot curve at ₹100.345406. Total proceeds are 100.345406 + 7.112000 = ₹107.457406, so the realised return is 107.457406/100 − 1 = **7.4574%**, a pickup of 85.01 bp over the 6.6073% alternative.
Step 3, scenario B, the forwards are realised. Now let the curve evolve exactly into the forward curve today implies. The six-month coupon compounds at the implied six-month forward rather than at today's spot, growing to ₹3.615558, and the four-year bond is priced off forward discount factors DF(1+u)/DF(1), giving ₹99.491746. Total proceeds are ₹106.607304 and the realised return is 106.607304/100 − 1 = **6.6073%**, equal to the one-year effective rate to four decimal places.
Step 4, find the breakeven and the loss profile. Solve for the parallel rise in the whole spot curve over the year that pulls scenario A's realised return back to 6.6073%.
| Parallel shift at the one-year mark | Sale price (₹) | Realised return | vs 6.6073% |
|---|---|---|---|
| unchanged | 100.345406 | 7.4574% | +85.01 bp |
| +24.90 bp (breakeven) | — | 6.6073% | 0.00 bp |
| +50 bp | 98.638334 | 5.7591% | −84.82 bp |
| +75 bp | 97.798037 | 4.9232% | −168.41 bp |
| +100 bp | 96.966428 | 4.0959% | −251.14 bp |
Read it. Scenario B is the result to remember, and it is exact rather than approximate: forward rates are defined as the rates that make holding-period returns equal, so a curve that simply becomes its own forwards pays the rider nothing at all for a year of extra price risk. The 85 bp in scenario A is therefore not a property of an upward-sloping curve; it is the payment for the curve failing to do what the forwards said. The breakeven of 24.90 bp is the honest size of the bet, and a 10 bp round-trip transaction cost cuts the pickup to 75 bp and the breakeven to about 21.8 bp before the market has moved at all. What this does not say: the table assumes parallel shifts, and a steepening that lifts the four-year point more than the average will bite harder than any row here suggests.
Worked example 7: A three-factor model of the G-Sec curve (India, ₹, synthetic panel)
A synthetic daily panel of G-Sec par yields at seven tenors produces the covariance matrix of daily yield changes below, in basis points squared. Every figure in this example is reproducible from this matrix alone by eigendecomposition, so treat the matrix as the data.
| bp² | 0.5y | 1y | 2y | 3y | 5y | 7y | 10y |
|---|---|---|---|---|---|---|---|
| 0.5y | 10.240 | 11.035 | 12.123 | 12.450 | 12.055 | 10.836 | 9.257 |
| 1y | 11.035 | 14.440 | 15.863 | 16.291 | 15.774 | 14.180 | 12.113 |
| 2y | 12.123 | 15.863 | 21.160 | 21.731 | 21.040 | 18.914 | 16.157 |
| 3y | 12.450 | 16.291 | 21.731 | 25.000 | 24.206 | 21.760 | 18.587 |
| 5y | 12.055 | 15.774 | 21.040 | 24.206 | 27.040 | 24.308 | 20.764 |
| 7y | 10.836 | 14.180 | 18.914 | 21.760 | 24.308 | 24.010 | 20.510 |
| 10y | 9.257 | 12.113 | 16.157 | 18.587 | 20.764 | 20.510 | 19.360 |
Solution. Step 1, read the diagonal first. Daily yield volatilities are √10.240 = 3.2, 3.8, 4.6, 5.0, 5.2, 4.9 and 4.4 bp from six months to ten years, so 51, 60, 73, 79, 83, 78 and 70 bp annualised at √252. The term structure is humped, peaking at five years, which is the shape to expect and the reason a basis point is not the same risk at every tenor.
Step 2, eigendecompose. The eigenvalues are 124.5030, 9.2923, 3.2421, 1.6350, 1.0523, 0.8107 and 0.7146 bp², summing to 141.250, which equals the trace of the matrix as it must. The variance shares are 88.14%, 6.58% and 2.30%, cumulating to 97.02% on three components.
Step 3, name the components by their sign patterns. PC1 loads positively at all seven tenors (level), PC2 changes sign once between three and five years (slope), and PC3 changes sign twice, positive at both ends and negative through the belly (curvature). The loadings are in the table in the factor-model section above.
Step 4, convert factors into curve moves. Multiply each loading vector by its factor's daily standard deviation, √124.5030 = 11.1581 bp, √9.2923 = 3.0483 bp and √3.2421 = 1.8006 bp. A one-standard-deviation level day moves the curve by +2.62, +3.38, +4.36, +4.84, +5.05, +4.68 and +4.06 bp; a one-sd slope day by +1.41, +1.49, +1.04, +0.37, −0.77, −1.24 and −1.32 bp.
Step 5, apply it to two portfolios FI1.02 already built. A bullet with all 4.50 years of key-rate duration at the five-year point and a barbell with 0.43 at one year and 4.07 at ten both have a total duration of 4.50 and are indistinguishable on that number.
| Level (PC1) | Slope (PC2) | Curvature (PC3) | |
|---|---|---|---|
| Bullet exposure | +2.0346 | −1.1340 | −0.7980 |
| Bullet 1-sd day | −0.2270% | +0.0346% | +0.0144% |
| Barbell exposure | +1.6092 | −1.5559 | +1.7549 |
| Barbell 1-sd day | −0.1796% | +0.0474% | −0.0316% |
Read it. The single duration number said these two portfolios were the same and the factor model says they are not. The barbell's level exposure is 21% lower, because the level factor loads most heavily through the three-to-seven-year belly where the bullet sits, and the two carry opposite signs on curvature, which is the barbell-versus-bullet result of FI1.02 restated in the language a risk system speaks. Three limits travel with the numbers. The factors are estimated on one window and will move with it, especially across a policy-regime break. The decomposition is linear and says nothing about any instrument's convexity. And PC1 is called the level factor because of the shape of its loadings, not because the analysis established anything about what drives it.
Practice set
Work each problem fully before reading its solution. A calculator (or spreadsheet) is assumed; numeric answers are to about ±0.5% relative unless stated otherwise. All curve figures are the synthetic, dated 2026-07-28 curves from the Worked examples above unless a problem states otherwise.
P1 (guided). Hand-bootstrap the first two India points. Using the India G-Sec par curve (0.5y = 6.40%, 1y = 6.50%), compute DF(0.5), spot(0.5), then DF(1.0) and spot(1.0).
Solution. DF(0.5) = 1/(1+0.064/2) = 1/1.032 = 0.968992; a single-period par bond's yield is its spot rate, so spot(0.5) = 6.4000%. For m=1.0: the 6.50% par bond pays a 3.25 coupon at t=0.5 and 103.25 at t=1.0. DF(1.0) = [100 − 3.25×0.968992] / 103.25 = [100 − 3.14922]/103.25 = 96.85078/103.25 = 0.938022. Converting: spot(1.0) = 2×[0.938022^(−1/2) − 1] = 6.5016%. Both match Worked Example 1 exactly.
P2 (guided). The 1y1y forward and its roll-forward proof. Using DF(1.0) = 0.938022 and DF(2.0) = 0.877250, compute the 1y1y forward rate and verify the roll-forward identity for ₹100 over 2 years.
Solution. f(1,2) = 2×[(0.938022/0.877250)^(1/2) − 1] = 2×[(1.069260)^0.5 − 1] = 2×[1.034050−1] = 6.8100% (rounding; the script's higher-precision value is 6.8116%). Roll-forward: direct 2-year growth = (1+0.066566/2)^4 = 1.139926; rolled growth = (1+0.065016/2)^2 × (1+0.068116/2)^2 = 1.139926. Both equal 113.9926 on a ₹100 base, the identity holds exactly.
P3 (guided). Price the off-the-run India bond and find its YTM. A 3.00% coupon, 6-year G-Sec (never a bootstrap input) is to be priced off the India spot curve. Its fair value comes out to 80.2573. Find its YTM by recognizing the bounds it must sit within.
Solution. The 6-year par yield (interpolated between the 5y = 7.00% and 7y = 7.15% benchmarks) is 7.0750%. Because this bond's 3.00% coupon is far below par, most of its value sits in the final redemption, pulling its blended YTM toward the 6-year zero-coupon bound, which is exactly the 6-year spot rate, 7.1192%. Solving the flat-yield equation that reprices this bond's cash flows to 80.2573 gives YTM = 7.0979%, correctly sitting between the par yield (7.0750%) and the zero-coupon bound (7.1192%), and closer to the bound than a bond with a coupon nearer to par would be, exactly because this coupon is so far below par.
P4. Par-curve interpolation. Using the India benchmarks at 7y (7.15%) and 10y (7.25%), find the linearly-interpolated 8-year par yield.
Solution. Weight = (8−7)/(10−7) = 1/3. par(8) = 7.15% + (1/3)×(7.25%−7.15%) = 7.15% + 0.0333% = 7.1833%.
P5. The flat-discounting mistake, quantified. Discount the 7-year, 7.15% G-Sec's fourteen semi-annual cash flows at one flat rate equal to its own 7-year spot rate (7.2072%), instead of at the properly bootstrapped curve. What price results, and how large is the error versus the true (curve-consistent) price of par?
Solution. Flat-discounting all fourteen cash flows at 7.2072% gives a price of 99.6898, versus the true, curve-consistent price of exactly 100.0000. The error is about 31 cents per 100 face (≈31 bp), arising because the bond's early coupons should be discounted at the lower short-end spot rates (6.40–6.82% across the first three years) but were instead discounted at the single higher long-end rate, understating their value and hence the bond's total price.
P6. INR OIS swap spread, interpreted. The 5-year INR OIS rate is 7.05% against a 5-year G-Sec par yield of 7.00%. State the spread and give one operational (non-credit-default) reason it might be positive.
Solution. Spread = 7.05% − 7.00% = +5.0 bp. A plausible operational driver: G-Secs may carry a modest convenience/collateral premium of their own (statutory SLR-driven captive bank demand, per M7.03 §4.10), which can hold G-Sec yields down slightly relative to a derivatives-market OIS rate that has no equivalent captive buyer, the spread reflects collateral and habitat technicals, not a claim that OIS carries "more credit risk" than the sovereign (nothing in an OIS transaction resembles a G-Sec default).
P7. The negative long-end US swap spread, explained. The 10-year SOFR swap rate is 4.25% against a 10-year UST yield of 4.45%. State the spread and name two commonly cited drivers of this sign.
Solution. Spread = 4.25% − 4.45% = −20.0 bp. Two commonly cited drivers (check the current levels/consensus): (1) a safe-asset convenience yield on Treasuries, structural demand from regulatory and reserve-asset buyers that bids UST prices up and yields down relative to swaps; (2) heavy Treasury issuance at the long end, which some periods cheapens (raises the yield of) long USTs, and post-crisis dealer balance-sheet/leverage-ratio costs that make warehousing large swap-versus-Treasury positions expensive, both pushing the swap rate below the Treasury yield rather than above it.
P8. The zero-coupon YTM bound, verified. Explain why a genuine zero-coupon bond's YTM must exactly equal the spot rate at its maturity, and confirm this using the US 6-year point (spot 4.2373%, per Worked Example 2).
Solution. A zero-coupon bond has exactly one cash flow, at maturity, so "the flat rate that reprices its cash flows to its market price" and "the discount rate applied to a single cash flow at that maturity" are, by definition, the same computation; there is no blending across multiple dates for a YTM solve to differ from a spot rate on. A 6-year zero priced off the US curve at 100×DF(6) will therefore solve, by construction, to a YTM of exactly 4.2373%, the 6-year spot rate itself, with zero gap, confirming the bound that Worked Example 2's 2.00%-coupon note's YTM (4.2311%) had to sit below.
P9. Expectations theory, with a term premium subtracted. The India 5y5y forward rate is 7.6129%. If you attribute a term/liquidity premium of 35 bp to this forward tenor, what average future short rate does the pure-expectations component of the curve imply for years 5–10?
Solution. Under the liquidity-premium decomposition f(m₁,m₂) = E[s(m₁,m₂)] + φ, solving for the expectations piece: E[s] = f − φ = 7.6129% − 0.35% = 7.2629%. The full forward rate is not, by itself, evidence that the market expects short rates to average 7.61% over years 5–10, only that it expects something in that neighborhood net of whatever premium is embedded, and the 35 bp assumption here is doing real analytical work that must itself be independently justified (e.g., against an estimated term-premium model such as the ACM model referenced in M7.03), not invented to fit a conclusion.
P10. Market segmentation and the SDL spread. SDLs of a given state trade at a persistent spread over the G-Sec curve of matching maturity that does not fully close even when the state's fiscal metrics are stable. Using the market-segmentation/preferred-habitat framework, explain why this spread can persist without implying a rapidly changing view of the state's credit risk.
Solution. Preferred-habitat theory holds that specific investor classes (insurers and pension/provident funds with statutory or prudential incentives to hold designated categories of paper) are effectively confined to a maturity/instrument "habitat" rather than freely arbitraging across the whole curve. If G-Secs and SDLs are not perfect substitutes in the eyes of every marginal buyer (some mandated toward G-Secs specifically, others content to hold SDLs for a modest pickup), the spread is set by supply and demand within each habitat and can sit at a stable, persistent level for reasons having nothing to do with fresh credit-risk information, exactly the signature the theory predicts, and exactly why a spread that does not move in lockstep with credit fundamentals is not, by itself, evidence of mispricing.
P11. The Vasicek asymptote versus the 10-year bootstrapped point. Using the calibrated India Vasicek parameters (a = 0.35, b = 7.5296%, σ = 1.00%), the model's asymptotic (T → ∞) semi-annual-compounded long-run rate works out to 7.6308%, above the bootstrapped 10-year spot of 7.3235%. Explain why this is not a contradiction.
Solution. The bootstrap has no opinion about maturities beyond its longest quoted input (10 years here), it simply stops. The Vasicek model, by contrast, is a continuous-time process with an implied rate at every maturity, including ones far beyond anything quoted; its asymptote is the rate its own mean-reversion dynamics converge to as T grows without bound. Given the calibrated speed of mean-reversion (a = 0.35), the model's curve is still rising toward that long-run level at the 10-year mark (as the earlier table of 30y/60y/100y model rates shows), so the fact that the eventual asymptote sits above the 10-year point is simply the model saying "if this curve extended further using these dynamics, it would keep climbing a bit more", a legitimate, calculable statement, not an inconsistency with the exact 10-year anchor point the calibration was built to match.
P12. Why the fit quality differs between curves. The Vasicek fit's RMSE against the bootstrapped curve is 13.27 bp for India but 19.97 bp for the US. Explain the difference in terms of curve shape, not "one model is better than the other."
Solution. The India par curve is simple and monotonically upward-sloping across every benchmark tenor, a shape a single mean-reverting factor tracks comfortably. The US curve dips between 1 and 3 years before rising again (par yields 4.25% → 4.10% → 4.05% → 4.15% → 4.30% → 4.45%), a hump/dip that a one-factor model, whose spot-rate curve is a smooth, monotone function moving toward a single long-run level, cannot replicate at all; its largest single miss (33.53 bp at the 3-year point) sits exactly where the real curve's dip is sharpest. The same model, same parameter count, fits a simpler-shaped curve better purely because there is less shape to miss, not because the calibration process itself was worse.
P13. Why the swap-curve bootstrap uses the same algorithm as the bond-curve bootstrap. State the argument, in your own words, for why a par swap curve can be bootstrapped with the identical formula as a par bond curve.
Solution. A par swap has zero value at inception, so the fixed leg's present value must equal the floating leg's. A floating-rate instrument paying exactly its reference index (no spread), discounted at a curve consistent with that same index, is always worth exactly its notional (a standard identity) which means its coupon strip alone (no notional redemption, as a swap has) is worth notional × (1 − DF(maturity)). Setting the fixed leg equal to that expression produces an equation identical in form to the par-bond pricing condition (coupon/freq × ΣDF = 1 − DF(maturity), per 1 unit of notional in each case), so the same sequential, discount-factor-solving recursion applies without modification.
P14. Synthesis, reading two swap-spread term structures side by side. The India INR-OIS-over-G-Sec spread is flat near +5 bp before widening to +10 bp at 10 years; the US SOFR-over-UST spread declines from +5 bp at 1 year to −20 bp at 10 years. What does each pattern suggest about its respective sovereign bond market's collateral/convenience premium and regulatory environment, without asserting a single "true" cause for either?
Solution. The US pattern (a swap spread that turns increasingly negative at longer tenors) is consistent with a growing UST convenience/safe-asset premium and dealer balance-sheet costs that bite harder at longer, more capital-intensive tenors, both of which push long UST yields down relative to swaps (Core teaching content; Worked Example 4). The India pattern (a small, fairly stable positive spread that only mildly widens at the long end) is consistent with a G-Sec market whose own captive, SLR-driven bank demand (M7.03 §4.10) keeps G-Sec yields modestly below a derivatives-market OIS rate across most of the curve, without the same magnitude of long-end convenience/regulatory effects seen in the far larger, more heavily-arbitraged USD market. Neither reading is a certainty from the spread alone, both are hypotheses to be weighed against collateral, regulatory, and issuance data specific to each market, exactly the discipline Core teaching content's swap-spread section insists on.
P15. The benchmark a curve ride must beat (India, ₹). On the module's bootstrapped curve the one-year spot is 6.5016%, quoted semi-annually. A colleague reports that a one-year ride on a five-year G-Sec returned 6.6073% and calls it "a 10.6 bp pickup over the one-year". State what is wrong with that comparison and give the correct pickup.
Solution. The two numbers are on different compounding bases. A realised one-year return is an effective annual figure, while 6.5016% is a semi-annually compounded quote, and the effective annual equivalent is (1 + 0.065016/2)² − 1 = **6.6073%**. The correct pickup is therefore 0.00 bp, not 10.6. The whole apparent gain was the compounding convention. This is not a contrived error: a realised return of exactly the one-year rate is what riding the curve pays when the forwards are realised, so a spurious 10.6 bp would have turned a break-even trade into a reported win.
P16. Breakeven on a curve ride (India, ₹). The ride in Worked Example 6 earns 85.01 bp over the one-year alternative if the curve is unchanged, and the bond's modified duration at the sale date is 3.4395 years. (a) Estimate the parallel rise over the year that wipes out the pickup, and compare it against the exact figure of 24.90 bp. (b) State two ways the trade can lose even if rates do not rise at all.
Solution. (a) A first-order estimate divides the pickup by the modified duration at the sale date: 0.8501% / 3.4395 = **24.7 bp**, against the exact 24.90 bp found by repricing. The 0.2 bp gap is convexity: the exact calculation reprices the bond at the shifted curve while the estimate assumes a straight line. (b) The curve can simply become its own forwards, in which case the ride returns the one-year rate and the pickup was never there to lose. Or transaction costs take it: a 10 bp round trip leaves 75 bp and moves the breakeven to about 21.8 bp, and on a less liquid state development loan the bid-offer can take a third of the carry before anything moves.
P17. Name the factor from its loadings (India, ₹). A PCA on daily G-Sec yield changes returns three components with these loadings across 0.5, 1, 2, 3, 5, 7 and 10 years. X: 0.24, 0.30, 0.39, 0.43, 0.45, 0.42, 0.36. Y: 0.52, 0.30, −0.33, −0.54, −0.18, 0.20, 0.40. Z: 0.46, 0.49, 0.34, 0.12, −0.25, −0.41, −0.43. Name each, give the rule you used, and say which one you expect to carry the largest share of variance.
Solution. Count sign changes across the tenors. X never changes sign, so it is the level factor. Z changes sign exactly once, between three and five years, so it is slope. Y changes sign twice, positive at both ends and negative through the belly, so it is curvature. Expect X to dominate: on the module's own panel level carries 88.14% of total variance against 6.58% for slope and 2.30% for curvature. The sign-change count is the whole rule, and it is worth applying rather than assuming the components arrive in the order level, slope, curvature; a short or badly conditioned panel can return components that do not sort that way, and a mislabelled factor propagates into every hedge built on it.
P18. Factor exposure from a key-rate profile (India, ₹). A portfolio's key-rate durations are 0.00 at 0.5y, 0.43 at 1y, 0.00 at 2y and 3y, 0.00 at 5y and 7y, and 4.07 at 10y. Using the loadings PC1 = (0.2349, 0.3029, 0.3908, 0.4339, 0.4521, 0.4191, 0.3634) and a level-factor daily standard deviation of 11.1581 bp, compute the portfolio's level exposure and its return on a one-standard-deviation level day. Then state why a manager holding a bullet at 4.50 years of duration at the five-year point gets a different answer despite having the same total duration.
Solution. Level exposure is Σ KRD_j × loading_j = 0.43 × 0.3029 + 4.07 × 0.3634 = 0.130247 + 1.478838 = **1.6092**. A one-sd level day moves each tenor by loading_j × 11.1581 bp, so the portfolio return is −1.6092 × 11.1581 / 10,000 = **−0.1796%**. The bullet's exposure is 4.50 × 0.4521 = **2.0346**, giving −0.2270%, about 26% larger, because the level factor's loadings peak in the three-to-seven-year belly (0.4339 to 0.4521) and fall away at both ends (0.2349 at six months, 0.3634 at ten years). The bullet sits exactly on the peak; the barbell splits its duration into the two regions where the level factor loads least. Total duration cannot see any of that, which is the reason key-rate durations and a factor model exist.
P19. Volatility term structure and a mis-weighted hedge (India, ₹). Daily yield volatilities from the same covariance matrix run 3.2, 3.8, 4.6, 5.0, 5.2, 4.9 and 4.4 bp at 0.5, 1, 2, 3, 5, 7 and 10 years. A trader hedges ₹100 crore of five-year exposure with an equal DV01 of ten-year exposure and calls the book flat. (a) Annualise the two relevant volatilities. (b) State what the equal-DV01 hedge does and does not neutralise.
Solution. (a) 5.2 × √252 = **82.55 bp** a year at five years and 4.4 × √252 = **69.85 bp** at ten. (b) An equal-DV01 hedge neutralises the book against a parallel move, and nothing else. It leaves the trader short the belly and long the ten-year in factor terms, so a curvature move, in which the belly falls while both wings rise, produces a loss on both legs at once, and a slope move produces a gain or loss depending on direction. The volatility figures say the residual is not small: the five-year point moves 18% more per day than the ten-year, so the two legs of the "flat" book are not even exposed to the same amount of yield movement. The fix is to hedge on key-rate durations, or on factor exposures, rather than on a single DV01 number.
Applied mini-project
Bootstrap a real curve, today, and prove it.
Unlike this module's own worked examples, which use clearly-labeled synthetic numbers for teaching consistency, this project requires real, currently-quoted data from a named primary source, because that is the only honest way to practice this skill on a curve you did not already know the answer to.
Do this, in order:
- Source real par yields. Choose one market. For India, use FBIL's published daily G-Sec par yield curve (or another CCIL/RBI-published source); for the US, use the Treasury's daily par yield curve rates. Record today's on-the-run par yields at a minimum of six maturities spanning at least 1 to 10 years. Write down the exact source and the date you pulled it (Guardrail: Trace, Cite).
- Bootstrap. In Python, interpolate your sparse par curve onto a semi-annual grid and sequentially bootstrap the spot curve, exactly as this module's Core teaching content and Worked Examples 1–2 do. Print the full grid of discount factors and spot rates.
- Prove it. Reprice every one of your original input bonds through the finished curve and report the difference from par for each, every one must reprice to within a rounding tolerance of 100 (report the actual differences; do not simply assert they passed).
- Extract forwards. Compute at least two implied forward rates from your bootstrapped curve (e.g., a
1y1yand a longer one of your choice) and prove the roll-forward identity numerically for each, exactly as Worked Example 3 does. - Price one off-the-run instrument. Choose (or invent, clearly labeled as hypothetical) a bond with a coupon and maturity that was not one of your six-plus inputs. Price it off your bootstrapped curve, solve its YTM, and compare that YTM to the interpolated par yield and to the zero-coupon bound at the same maturity, explaining the direction of any gap the way Worked Example 2 and Practice P3 do.
- Interpret, briefly. In three to five sentences, state one thing your real, live curve's shape is telling you (cross-referencing M7.03's shape-reading framework rather than re-deriving it) and one place your forward-rate calculation would change if you re-ran this project a month from now.
Case Lab: this project is the hands-on version of the Bootstrapping the G-Sec Curve case design for this branch (build a spot & forward curve from on-the-run G-Secs, price an off-the-run bond, and carry the result into a duration/DV01 read per FI1.02), complete this project first if that Case Lab is live in your track.
Deliverable and self-check. One notebook or script plus a short written summary, containing: the sourced par-yield table with citation and date; the full bootstrapped spot-curve table; the reprice-check output for every input bond (differences shown, not asserted); at least two forward rates with their roll-forward proofs; the off-the-run pricing-and-YTM comparison with a stated direction and reason for the gap; and the closing interpretation paragraph. Score yourself out of 10, 2 points each for: (a) a real, cited, dated primary source used (not this module's synthetic numbers); (b) every input bond repricing to par, with actual numeric differences shown; (c) both forward-rate roll-forward proofs shown to be exact (or explained if a rounding tolerance was used); (d) the off-the-run YTM-versus-par-yield gap correctly signed and explained; (e) the closing interpretation correctly separates a shape-reading claim (M7.03's territory, referenced not re-derived) from a pure arithmetic result of this module. Pass at 8/10 with no zero on any item.
Reading & resources
Everything below is an anchor to learn from and verify against, never a substitute for tracing a real figure to its own primary source.
Core texts (the bootstrap, forwards, and term-structure theory):
- Fabozzi, Bond Markets, Analysis, and Strategies: the standard reference for bootstrapping, the par/spot/forward relationship, and the three term-structure theories in full depth. [Paid] [Intermediate–Advanced]
- CFA Institute curriculum readings on the term structure and interest rate dynamics (Level II/III Fixed Income), the closest direct match to this module's scope and depth. [Paid] [Intermediate–Advanced]
- Choudhry, Analysing and Interpreting the Yield Curve, a practitioner-level deep dive on curve construction and interpretation, including swap curves. [Paid] [Advanced]
Short-rate models (for the sketch, and for going deeper):
- Hull, Options, Futures, and Other Derivatives: the interest-rate-derivatives chapters cover Vasicek, CIR, and Hull-White cleanly, with the closed-form bond-pricing results this module states and uses. [Paid] [Advanced]
- Vasicek, "An Equilibrium Characterization of the Term Structure" (1977), the original short-rate model paper. [Paid/library access varies] [Advanced]
Primary sources: India:
- FBIL (Financial Benchmarks India Pvt Ltd), the published daily G-Sec par yield curve, MIBOR, and INR OIS reference-rate methodology. [Free] [Beginner–Advanced]
- CCIL (Clearing Corporation of India Ltd), market infrastructure, handbooks, and data on G-Sec, repo, and OIS trading. [Free] [Intermediate–Advanced]
- FIMMDA circulars, valuation and accrual conventions for the Indian bond market; check the current circular before relying on any specific day-count claim. [Free/membership varies] [Advanced]
- RBI publications on G-Secs and SDLs. [Free] [Beginner–Advanced]
Primary sources: US:
- US Treasury Daily Par Yield Curve Rates (treasury.gov), the live primary source for the exercise in the Applied mini-project. [Free] [Beginner–Advanced]
- SEC EDGAR: for any issuer-specific figure that ever needs tracing back to a filing. [Free] [Beginner–Advanced]
- Federal Reserve Bank of New York, the ACM term-premium model (already introduced in M7.03) for an actual, published estimate of the term premium referenced in Practice P9. [Free] [Advanced]
- ARRC (Alternative Reference Rates Committee) materials on the SOFR transition, for the institutional background behind the single-curve SOFR-OIS treatment this module uses. [Free] [Intermediate–Advanced]
Tooling (for the Modern Data Analysis callout and the mini-project):
QuantLib/QuantLib-Pythondocumentation: production-grade curve-bootstrapping classes. [Free, open source] [Advanced]pandasandscipy.optimizedocumentation, for organizing curve data and solving YTM/root-finding problems respectively. [Free] [Beginner–Intermediate]
Do this, not just read: pull one real curve (India or US) from its named primary source today, and bootstrap it yourself before you look at anyone else's answer, the Applied mini-project is this reading list turned into a verified result.
Teach it back & journal
Feynman prompt. Explain to a colleague who trusts a single bond's quoted YTM as "the interest rate" why that number cannot price a different bond maturing on the same date, using the idea that a YTM is a blend across every one of that bond's own cash flows, and that the blend is only valid for pricing the exact instrument it came from. Then walk them through, out loud and from memory, the three-step bootstrap (interpolate the par curve, solve sequentially for each discount factor, then prove it by repricing the original inputs), if you cannot state Step 3 without looking it up, you have not yet earned the belt this module gates on. Close by explaining, in one sentence, why a fluent AI-written bootstrap script is not itself proof that the curve it produced is correct.
Journal prompt. Run the Applied mini-project's Step 1–3 on a real curve you pull yourself, and log what happens: did every input bond reprice to par on the first attempt, or did you find a bug, and if you did, what was it (a compounding-frequency mismatch, an interpolation error, something else)? Compare the shape of the real curve you pulled to this module's synthetic India or US curve, is it upward-sloping, humped, partially inverted? Cross-reference (do not re-derive) what M7.03 would say that shape implies about policy expectations. Then write a short paragraph on this: which single habit from this module, proving the reprice, proving the roll-forward identity, or separating "this is arbitrage-free math" from "this is a forecast" when reading a forward rate, would most change how a colleague trusts a curve you hand them, and what will you do this week to make that habit automatic?
This module's flashcards and mastery quiz are wired into the app: see the node's Quiz and Reviews.