Learn how to derive missing spot rates, discount factors, and consistent bond prices using no-arbitrage principles. This practice vignette guides you step by step through the bootstrapping process while highlighting potential pitfalls, transaction costs, and real-world complexities.
Enhance Your Learning:
So, you’ve made it this far in your exploration of the arbitrage-free valuation framework. By now, you probably know a bit about discount curves, spot rates, forward rates, and the Law of One Price. But how do we put those ideas into practice when we’re given a messy market with (sometimes) missing data, mispriced bonds, and the possibility of arbitrage? That’s exactly what we’ll tackle in this practice vignette. We’ll walk through a hypothetical bond market scenario where some spot rates are known, others are implied, and a few bonds are priced in such a way that might tempt you to exploit an arbitrage opportunity—if you can find it.
If you recall from earlier sections in Chapter 7 (and Chapter 4 on term structure), we rely on the notion that each cash flow can be discounted at a rate appropriate to its maturity. When the bonds’ prices—or their implied yields—aren’t consistent with these spot rates, an arbitrage situation may arise. We’re going to dissect that step by step, fill in missing spot rates, and confirm that all prices are aligned with no-arbitrage logic.
Imagine we have three annual-pay bonds in the market. Each pays coupons once per year, and each has the same maturity date for its final payment. The following data are posted in the market:
Separately, we know the 1-year spot rate r₁ is 3.15% (annual, on a bond-equivalent basis). However, we do not know the 2-year spot rate r₂. We might also want to check the implied forward rate for year 2—something we should do after we pin down r₂.
Some interesting wrinkles:
• Bond Z trades slightly below its theoretical price if we strictly used the posted 1-year spot rate.
• The 2-year coupon bond (Bond A) is at a discount (below par), suggesting a yield above its coupon rate.
• Bond B, on the other hand, is trading at a premium (above par).
One might suspect there’s a subtle inconsistency or mispricing here—particularly if we can’t get the same 2-year discount factor from Bond A and Bond B. Let’s see.
Before diving into spot rates, let’s write down the expected cash flows for each bond. Assume each bond has a par (face) value of 100.
• Bond Z (zero-coupon, 1-year maturity):
• Bond A (4.0% coupon, 2-year maturity):
• Bond B (5.0% coupon, 2-year maturity):
First, let’s confirm the discount factor for Year 1, using the posted spot rate r₁ = 3.15%. Typically, the clean approach is:
(1) d₁ = 1 / (1 + r₁)
But, let’s see if the market price of Bond Z (our zero-coupon) aligns with that.
• The theoretical price of Bond Z, using r₁ = 3.15%, would be:
Price(Z) = 100 / (1 + 0.0315) = 96.90 (approximately).
Check: The actual market price given is 97.00. That’s slightly above 96.90, so there’s a mild difference (maybe a small premium of 0.10). Not a massive discrepancy, but it’s a sign that real markets can have fractional misalignments. For the purpose of no-arbitrage bootstrapping, we might proceed with the posted r₁ = 3.15% or re-derive an implied r₁ from 97.00. (We’ll keep 3.15% but just note the discrepancy.)
So we set:
(2) d₁ = 1 / (1 + 0.0315) ≈ 0.9689
Now, let’s look at Bond A. In a perfect no-arbitrage world, we can express its price as the present value of its cash flows discounted at the relevant spot rates.
• Payment in Year 1: 4.00 discounted at d₁
• Payment in Year 2: 104.00 discounted at d₂ (the 2-year discount factor)
Bond A’s price must equal 98.50, so:
(3) 98.50 = 4.00 × d₁ + 104.00 × d₂
But we know d₁ from above (0.9689). So:
(4) 98.50 = (4.00 × 0.9689) + 104.00 × d₂
98.50 = 3.8756 + 104.00 × d₂
98.50 – 3.8756 = 104.00 × d₂
94.6244 = 104.00 × d₂
d₂ = 94.6244 / 104.00 ≈ 0.9100
So the discount factor d₂ for Year 2 is approximately 0.9100. If you want the 2-year spot rate r₂, that’s simply:
(5) d₂ = 1 / (1 + r₂)²
Thus:
(6) 0.9100 = 1 / (1 + r₂)²
(7) (1 + r₂)² = 1 / 0.9100 = 1.0989
(8) 1 + r₂ = √(1.0989) = 1.0485 (approximately)
(9) r₂ = 0.0485 = 4.85%
So from Bond A, we get a 2-year spot rate of about 4.85%. However, let’s check if Bond B (5.0% coupon) is consistent with that.
Now turn to Bond B. If r₂ = 4.85%, the theoretical price of Bond B should be:
(10) Price(B) = 5.00 × d₁ + 105.00 × d₂
We already have d₁ = 0.9689 and d₂ = 0.9100. So:
(11) Price(B) = 5.00 × 0.9689 + 105.00 × 0.9100
= 4.8445 + 95.55
= 100.3945 (approximately)
Compare that with the actual price of Bond B, which is 100.50. We’re seeing another small discrepancy, but again, it’s pretty close (off by about 0.11 or so). This slight mismatch could be due to real-world factors like transaction costs, bid-ask spreads, or small sample rounding. But from a purely theoretical no-arbitrage perspective, we’re only off by about 0.10 or 0.11. That’s usually within an acceptable margin for exam calculations.
If we wanted to be extremely precise, we could juggle the data to make them line up perfectly. But in a real exam scenario, we’d interpret that Bond A’s implied 2-year spot rate of 4.85% is likely “close enough” to confirm no major arbitrage.
Now let’s ensure that the forward rates implied by these spot rates make sense. The 1-year forward rate for the second year, f(1,2), should satisfy:
(12) (1 + r₂)² = (1 + r₁) × (1 + f(1,2))
We can solve for f(1,2):
(13) f(1,2) = (1 + r₂)² / (1 + r₁) – 1
Plugging in r₂ = 4.85% and r₁ = 3.15%:
(14) f(1,2) = (1.0485)² / (1.0315) – 1
= 1.0996 / 1.0315 – 1
= 1.0660 – 1
= 0.0660 = 6.60%
A forward rate of about 6.60% for the second year might suggest that the market expects rates to rise in that period. If the forward rate were drastically different, that might signal an arbitrage if, say, a forward contract or a 2-year bond strategy had an obvious profit route. So far, we see a forward rate that’s plausible, though it’s quite a jump from 3.15% to 6.60%—which is not unheard of if the yield curve is upward sloping. Of course, in real markets, you’d confirm this with actual forward market quotes as well.
At this point, if any bond’s implied forward rate or spot rate drastically contradicted these relationships, you’d suspect an arbitrage. In practice, you’d buy undervalued securities and short overvalued ones (or replicate them via derivatives) to lock in a riskless profit. But the minor differences here (0.10 or 0.11 discrepancy in bond prices) might be wiped out by transaction costs.
Bond markets rarely present big glaring mispricings for large volumes. If you do spot them, chances are they’ll be overshadowed by:
• Transaction costs (brokerage, bid-offer spreads)
• Collateral or margin requirements for short-selling
• Real-world constraints on shorting certain instruments
One question to ask when you see a mismatch is: “Is the difference large enough to yield a real arbitrage after fees?” Because if you net out all the friction, you might find that what appears to be a money machine is actually unprofitable. So, while you might get excited if you see a few pennies difference in bond valuations, keep in mind that in reality, exploiting that difference might not be enough to cover all the friction involved.
Another issue is credit risk. If each bond has a slightly different credit profile, lumps in liquidity, or is subject to different contractual conditions, they might not be perfect substitutes for each other—so we can’t treat them as purely identical from a risk perspective.
Without transaction costs, the mathematics is crystal clear: each bond’s price in the market must be consistent with the present values of its coupons and principal, discounted by the spot rates. If not, a riskless profit is possible.
But transaction costs muddy the picture. Even if you do spot a theoretical arbitrage, some chunk of your profit will be eaten up by commissions, bid-ask spreads, or slippage. You might also have to put up collateral against short positions, which has an associated opportunity cost. Hence, what looks like a sure bet in a frictionless textbook example can vanish under real-world conditions.
In reality, you’d perform the same steps we just did, but you’d probably have a more extensive set of bonds (with different maturities, coupon structures, or embedded options). You’d likely use a computer to calibrate an entire yield curve—often using an iterative technique that collectively adjusts all the discount factors so that the sum of squared pricing errors is minimized. That’s a fancier version of the same principle: no-arbitrage consistency across the entire curve.
You might also incorporate smoothing or interpolation methods (if you have a missing maturity point), or advanced curve-fitting routines (like the Nelson-Siegel model). But in the end, the same universal theme stands: you can’t have a bond be systematically cheaper or more expensive than the portfolio of zero-coupon (or riskless) instruments that replicate it.
Constructing arbitrage-free prices is one of those “bread-and-butter” exercises for fixed income analysts. You start with whatever yields or spot rates are known, then carefully bootstrap the missing pieces using real market bond prices. As soon as there’s an inconsistency, you have to decide if it’s big enough to exploit. Often, the final “aha” moment is that actual markets never fully align, but the slight differences are generally too small to yield a true no-risk profit. Still, the no-arbitrage framework is your guiding star for setting up fair values and interpreting forward-looking rates.
Keep practicing these calculations. Don’t let the small arithmetic bits confuse you—especially under time pressure in an exam setting. Once you get the hang of plugging in known discount factors, solving for unknown ones, and re-pricing each bond, it becomes second nature.
• Vignette: A scenario-based question set in the CFA exam that merges multiple concepts into one storyline.
• Bootstrapping: Iterative method to derive sequential spot rates from coupon bond prices.
• Discount Factor Consistency: Ensuring all derived discount factors match observed market prices for each maturity.
• Arbitrage Check: Comparing the cost/value of a security to that of a replicating portfolio of simpler instruments to see if any free-lunch profit exists.
• Premium/Discount Bond: A bond priced above or below par value, reflecting coupon rate differences relative to market yields.
• CFA Program Curriculum (2025), Level II, “Fixed Income,” especially the sections on No-Arbitrage Bond Pricing.
• Practitioner articles and working papers from the Federal Reserve (and other central banks) on bond mispricing and yield curve modeling.
• Online resources like Khan Academy or Coursera for tutorials on bootstrapping yield curves.
• Previous chapters in this volume on “The Term Structure of Interest Rates” (Chapter 4) for a deeper look at spot, par, and forward rates.
Important Notice: FinancialAnalystGuide.com provides supplemental CFA study materials, including mock exams, sample exam questions, and other practice resources to aid your exam preparation. These resources are not affiliated with or endorsed by the CFA Institute. CFA® and Chartered Financial Analyst® are registered trademarks owned exclusively by CFA Institute. Our content is independent, and we do not guarantee exam success. CFA Institute does not endorse, promote, or warrant the accuracy or quality of our products.