Ring: Finance-Plus (Fixed Income Analytics) · Node FI1.01 · ~16 focused hours · Standard mastery gate ≥85%
You already know that a bond is a promise: a schedule of coupons and a face value, and that its price is the present value of that schedule. M3.01 taught you to price one at a single, given yield ("a bond is an annuity plus a zero") and M1.08 taught you what happens to that same bond's carrying amount on an issuer's books once it is out in the market, amortizing toward par at whatever yield it was issued at. Both of those are half the picture, and both hold the discount rate fixed as a given. This module removes that crutch. Real bond markets do not hand you one discount rate; they hand you a curve (a different rate for every maturity) and they do not hand you a yield at all; they hand you a price, quoted every second on a screen, and it is your job to invert that price back into the yield the market is actually paying you. That inversion, done properly across every convention the market uses to quote it (a plain coupon bond, a T-bill, a callable note) is the analytics spine this module builds. 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.
Advertisement
One flag before anything else, because it matters more here than almost anywhere else in the program. Fixed income is a corner of finance where the right answer is a precise number (a price to four decimals, a yield to two) and a precise, confidently-stated wrong number is indistinguishable, on the page, from a precise, confidently-stated right one. That is exactly the failure mode AI0.01 named as the root cause of every AI error: a model optimizes for plausible, not true, and a fabricated YTM reads exactly as fluent as a correctly computed one. This makes Fixed Income Analytics one of the highest AI-over-trust risk regions in the entire corpus, and this module says so plainly, up front: AI is an amplifier for drafting a formula, explaining a convention, or scaffolding a Python function, never a substitute for computing the number yourself and tracing every convention (a call price, a day-count basis, a curve level) to its actual primary source. The by-hand, Python-verified skill this module drills is gated; it is not optional, and no tool buys you a pass on it.
A note on synthetic instruments and real mechanics, before anything else. Every bond, curve, bank, and issuer used for arithmetic in this module (G-Secs, corporate NCDs, T-bills, CDs, callable notes) is synthetic: invented so the numbers are clean and no real security or issuer is being quoted, misquoted, or defamed. The mechanics and conventions, how a discount curve prices a bond, how a bank-discount yield differs from a bond-equivalent yield, how a call schedule produces a yield-to-worst, how a horizon return decomposes into three sources, are real, taught as accurately as a teaching text can, and flagged " " wherever a specific market convention (a day-count basis, a benchmark's current administrator, a statutory detail) is the kind of thing that drifts and must be checked against the live FIMMDA/RBI/FBIL or US market documentation before you trade on it. Every number in every worked example and practice item below was computed and checked in Python, the scratch arithmetic is not an afterthought, it is the skill, and reproducing it is what turns this from a reading into a competence.
Learning objectives
By the end you can:
- Price a bond off a discount (spot-rate) curve (discount each cash flow at the spot rate matching its own maturity rather than one flat assumed yield) and explain, with a worked case, when and why curve-consistent pricing and flat-yield pricing diverge (and by how much, for a normal, an inverted, and a humped curve).
- Solve for yield to maturity (YTM) by iteration given an observed market price, explaining why no closed-form formula exists and connecting the calculation explicitly to an internal-rate-of-return (IRR) solve.
- Compute current yield, and correctly state, and prove numerically, both directions, the ordering among coupon rate, current yield, and YTM for a premium bond and for a discount bond.
- Compute the full chain of money-market yield measures for a discount instrument (a T-bill, a CD, commercial paper) (bank-discount yield, holding-period yield, money-market (add-on) yield, bond-equivalent yield (BEY), and effective annual yield (EAY)) and explain why each fixes a specific limitation of the one before it.
- Compute yield to call (YTC) across a full call schedule and identify yield to worst (YTW), and demonstrate (with a numeric counter-example) why YTW can never be assumed to sit at the nearest call date or at maturity without actually computing every redemption scenario.
- Decompose a bond's realized total return over a holding period into its three sources (coupon income, reinvestment income, and capital gain/loss) and use that decomposition to explain, quantitatively, how a rate move splits its effect between reinvestment income and resale price.
- Price a corporate bond as risk-free-rate-plus-spread, applying (not re-deriving) E11.01's credit-triangle relationship to translate an observed spread into an implied default probability.
- (Productivity objective: R10 duality.) Use an AI tool to accelerate drafting a yield-conversion function or explaining a convention, while treating every AI-stated number, call price, or day-count fact as unverified until traced to a primary source (a term sheet, the FIMMDA handbook, SEC EDGAR, FBIL/CCIL data), because this region is where a fluent, wrong number does the most damage.
- Situate every calculation in both India and US institutional conventions, on-the-run G-Secs, CCIL/FBIL/FIMMDA quoting conventions, SDLs, and INR OIS/MIBOR on one side; on-the-run UST, agency MBS, corporate callables, and CDX on the other, enough to know which convention governs a given instrument and where to confirm it.
The duality, stated once (R10). Objectives 1–7 and 9 are the understanding gate, the mastery check rewards computing correctly, not knowing which button to press. Objective 8 is the productivity payoff you carry forward: knowing that AI can draft the scaffolding of a pricing script or explain a convention in plain language, but that in this region, where a wrong number is invisible until it costs money, verification against your own Python arithmetic and a named primary source is never optional.
Prerequisites & connections
Builds on. M3.01 (time value of money): you already price a bond given one flat yield ("a bond is an annuity plus a zero"); this module keeps that arithmetic and does two new things to it: generalizes the single discount rate to a full spot-rate curve, and inverts the equation to solve for the yield a market price implies. M1.08 §4.1 (debt at amortized cost), you already built effective-interest amortization schedules for a bond already on an issuer's books at a given market yield; that is the accounting lens, looking backward from a known yield. This module is the investor's lens, looking forward from an observed price to the yield, and from a curve (not one rate) to a price. M7.03 §4.10–4.13 (the yield curve, curve shapes, and duration), you already know what a spot/discount curve is, what determines its shape (expectations plus term premium), how it moves (the four steepener/flattener moves), and the intuition behind duration; this module does not re-derive any of that, it takes a curve as a given input and does the pricing arithmetic on top of it. E11.01 §11.2 (spreads for credit), you already decomposed a corporate yield into risk-free rate plus credit spread, and spread into PD × LGD (the credit triangle); this module applies that relationship as a given building block in one worked example, it does not re-teach it.
Feeds forward. FI1.02 (Duration, Convexity & Interest-Rate Risk) turns this module's total-return decomposition into a formal shock-based sensitivity framework. Macaulay/modified duration, PVBP/DV01, and immunization are the rigorous machinery behind the "reinvestment income and price move in opposite directions" intuition you build here. FI1.03 (Term Structure) teaches you how the very spot curve this module takes as a given input is actually built, bootstrapped from a par/coupon curve, and extends the two-force curve-shape story from M7.03 into forward rates and swap curves. FI1.04 (Crown: Embedded Options, OAS & Structured Products) takes the YTC/YTW yield-based approach this module teaches and replaces it with the rigorous answer, binomial-tree option-adjusted valuation, for any callable, putable, or mortgage-backed instrument where a static yield-to-worst is not good enough. FI1.05 (Instruments, Issuance & Trading) now precedes this module in study order and owns the taxonomy of what actually trades, the day-count conventions in full, accrued interest and the clean-versus-dirty price, settlement, and matrix pricing. Every convention this module names in passing is worked properly there, so take a real term sheet to FI1.05 rather than to this module's summary of it.
The one-sentence version of this module. A bond's price is never really "the" price at one yield, it is the sum of its cash flows each discounted at the market's own price of time for that maturity, and everything this module teaches (curve pricing, the zoo of yield conventions, YTC/YTW, total-return decomposition) is the discipline of reading that price correctly, in whichever convention the specific instrument was quoted in, verified by your own arithmetic rather than trusted on faith.
Core teaching content
The bond as a cash-flow machine, priced two different ways
Nothing about a bond's cash flows is in dispute: a schedule of coupons on fixed dates, plus a redemption amount on a fixed (or contingent, for a callable) date. What is genuinely a choice is the discount rate you apply to that schedule, and there are exactly two disciplined ways to make that choice. The first, the one M3.01 taught, is flat-yield pricing: pick one rate (an assumed or quoted YTM) and discount every cash flow at it, regardless of when it lands. The second (the one this module adds) is curve-consistent pricing: build (or take as given) a full discount curve, a schedule of spot rates by maturity, and discount each cash flow at the spot rate matching its own maturity. The two methods agree exactly when the curve is flat (every maturity has the same spot rate) and diverge, sometimes materially, whenever it is not, and real curves are essentially never flat (M7.03 §4.10–4.11 taught you why: the expectations component and the term premium mean the curve normally slopes, sometimes inverts, and occasionally humps).
Why does this matter enough to be the opening idea of the module? Because a market price is a fact (it is what the curve, in aggregate, says the cash flows are worth) while a single quoted "YTM" is a derived summary statistic of that fact, a complicated weighted average of every spot rate the bond's cash flows touch, weighted by how much present value sits at each maturity. Confusing the summary statistic for the underlying mechanism is how analysts mis-price anything whose cash-flow timing differs from a vanilla bullet bond, a sinking fund, an amortizing loan, a portfolio of bonds with different maturities compared on YTM alone. Hold the sharp version of the idea for the rest of this module: a curve prices; a YTM merely summarizes what the curve already said, from one particular bond's vantage point.
Pricing off a discount curve: no-arbitrage, cash flow by cash flow
Take a discount factor DF(t) as the price today of ₹1 (or $1) to be received at time t, literally a traded object if a zero-coupon bond of that maturity exists, and a purely mathematical one otherwise. If your curve's spot rates are quoted on a semiannual-compounding basis (the near-universal convention for both G-Secs and USTs), the discount factor at maturity t years from a spot rate s(t) is:
DF(t) = 1 / (1 + s(t)/2)^(2t)
Price the bond as Price = Σ CF(tᵢ) × DF(tᵢ), summing over every coupon date and the final redemption. This is no-arbitrage pricing: if the market did not price the bond this way, you could strip its cash flows, sell each piece at the curve's own price for that maturity, and pocket a riskless profit (or the reverse, buy the pieces and reassemble the bond cheaper than its market price). The curve itself (where these spot rates come from) is FI1.03's subject (bootstrapped from a par/coupon curve of on-the-run instruments); here you take it as a given input, exactly the way M7.03 handed you a curve's shape without asking you to build one.
Worked Example 1 makes the divergence from flat-yield pricing concrete with a real number: pricing a bond off an upward-sloping curve versus flatly at its long end or its short end produces three different prices, none of them arbitrary, each is the exact consequence of which spot rates you chose to apply to which cash flows. Practice items P10 and P17 extend the same lesson to an inverted curve and a humped curve respectively, because the direction and size of the mispricing from using a flat rate depends entirely on the curve's shape, and you should be able to predict the direction before you compute it: discounting a cash flow at a rate lower than its true spot rate always inflates that cash flow's present value, and vice versa.
Modern Data Analysis note. Everything above is one function of two inputs (a cash-flow schedule and a curve) applied to a loop. The Python/pandas way to do this at scale: hold each bond's cash-flow dates and amounts as a small DataFrame, hold the discount curve as an interpolated function (
numpy/scipy.interpolateover your spot-rate nodes), and price every bond in a portfolio with one vectorized apply instead of one bond at a time by hand. Solving YTM for hundreds of bonds becomes a loop (or a vectorized call) around a numerical root-finder (scipy.optimize.brentqbracketing the price-yield function, or Newton-Raphson with the analytic derivative) rather than hand-iteration, the exact bisection logic this module does by hand, just run in milliseconds instead of minutes. Purpose-built libraries (QuantLib, with its Python bindings) wrap this entire pipeline, curve construction, day-count conventions, and bond pricing, in tested, production-grade code. This is a preview, not a build-out: the quant-code galaxy's DA branch (data-and-automation-in-code) is where you will actually write and test this pipeline; the discipline carried over from this module is that a script's output is never trusted merely because it ran, it is verified against a hand-solved case (exactly the worked examples below) before it is trusted on a single real bond.
Yield to maturity
Yield to maturity (YTM) is the single, constant discount rate that makes the present value of a bond's promised cash flows equal its market price. It is the internal rate of return of those cash flows from the buyer's side. With more than two cash flows no algebra isolates it, so you find it by trial: price the bond at a guessed rate, then adjust until the price matches. It works as a cash-flow-weighted average of the spot rates the bond touches.
2 min read, on its own page
Current yield, and the ordering that tells you where a bond sits
Current yield is the simplest income yardstick a bond has: current yield = annual coupon ÷ price. It says nothing about capital gain or loss at redemption, a bond priced at 60 with a fat coupon can show an eye-catching current yield while being a value trap that repays only 60% of face at maturity. Its value is not as a total-return measure (that is YTM's and, over a shorter horizon, total-return decomposition's job later in this module) but as a fast, no-iteration sanity check, and as the anchor for one of the cleanest diagnostic rules in fixed income, the ordering rule, provable from the mechanics of discounting alone and verified numerically, both directions, in this module's worked examples:
- Premium bond (price above face, because coupon > YTM): coupon rate > current yield > YTM.
- Discount bond (price below face, because coupon < YTM): coupon rate < current yield < YTM.
- Par bond (coupon = YTM): all three are equal.
The logic: current yield divides the same coupon by a price that is above face (premium) or below face (discount), so it necessarily sits between the coupon rate and the fully adjusted YTM (which additionally reflects the capital loss-to-par for a premium bond, or capital gain-to-par for a discount bond, that current yield ignores entirely). Any time you see the three numbers out of this order, you have made an arithmetic error, this is a free error check you should run on every yield calculation you do for the rest of your career.
Bank discount yield
Bank discount yield is the way US Treasury bills are traditionally quoted: the discount as a share of face value, scaled up to a 360-day year. Because it divides the discount by face value, which is more than the price paid, and uses a 360-day year, it understates the true return. Analysts convert it to a holding period yield and then to a bond-equivalent yield, so a bill can be compared with a coupon bond.
6 min read, on its own page
Yield to worst
Yield to worst (YTW) is the lowest yield a callable bond can give you: the minimum across its yield to maturity and the yield to each call date in its schedule. The name is precise: an issuer holds the call option and will exercise it in whichever way is worst for the bondholder, so a disciplined analyst prices, and reports, the worst case, never the case they'd prefer. The worst case is not always the nearest call, so compute every date in the schedule.
3 min read, on its own page
Bond horizon yield
A bond's horizon yield, also called its horizon return or total return, is what an investor actually earns over a specific holding period, and it can differ from the yield to maturity quoted at purchase. It splits into coupon income plus two effects that depend on rates: interest earned by reinvesting coupons, and the capital gain or loss when you sell. Those two effects pull in opposite directions when rates move, and they cancel to first order when your horizon equals the bond's Macaulay duration.
7 min read, on its own page
Where credit and the curve meet: pricing a corporate bond
Every technique above generalizes immediately to a corporate bond, with one addition: a corporate borrower is not the risk-free entity the sovereign curve describes, so its cash flows are discounted at the risk-free spot rate for the matching maturity plus a credit spread (E11.01 §11.2 built this decomposition, corporate yield = risk-free rate + credit spread, and spread ≈ PD × LGD, the credit triangle). This module does not re-derive where that spread comes from or how it is estimated; it applies the relationship as a given input, exactly the way it takes a discount curve as a given input from M7.03/FI1.03. Worked Example 5 prices a corporate bond this way end to end, risk-free spot plus a quoted spread, producing a price and a YTM that (by construction) reproduce the same all-in discount rate, and then runs the credit triangle in the other direction, turning the observed spread into an implied annual default probability, given an assumed recovery rate. That two-way fluency, spread to price, and spread to implied PD, is precisely the "analytics/math complement" this Ring exists to add on top of E11.01's already-taught credit lens.
The payoff, and the discipline that makes it safe to use
Put the pieces together and a single discipline emerges, and it is the discipline this whole module exists to install: every bond price and every yield number is the output of an explicit, checkable calculation, never a fact to be taken on faith from a screen, a colleague, or a chat assistant. A discount curve prices; a YTM summarizes what the curve said for one bond's specific cash-flow pattern; a money-market yield is only meaningful once you know which of four conventions it was quoted in; a YTW is only correct if every redemption date was actually checked; a total return only makes sense once decomposed into the three sources that produced it. None of these require anything beyond arithmetic you can run by hand or in ten lines of Python, which is exactly why there is no excuse, in this region above almost any other in the corpus, for reporting a number you have not personally verified.
Common mistakes & how experts think differently
- "YTM and current yield are basically the same thing." They coincide only at par. For any premium or discount bond they diverge in a predictable, provable direction (the ordering rule above), and treating them as interchangeable is the single fastest way to misjudge a bond's true return. The expert's first move on seeing any yield number is to ask which of the several yield measures it is, because the label matters as much as the number.
- "The curve is basically flat, so I can just use one representative rate." A curve is flat only by coincidence; the expected-future-short-rates-plus-term-premium mechanics M7.03 taught mean curves normally slope, sometimes invert, and occasionally hump. This module's own worked evidence (Worked Example 1, and Practice P10 and P17) shows the mispricing from a flat-rate shortcut moving in both directions depending on the curve's shape, the expert always asks "flat compared to what shape, and which direction does that push the price?" before assuming the shortcut is harmless.
- "A T-bill's quoted 'yield' is its actual return." Whichever convention a screen shows you (bank-discount, add-on, or BEY) is not automatically the number to compare against a coupon bond's YTM. Only BEY (365-day, price basis) is built for that comparison; the expert converts before comparing, every time, and never assumes the screen has already done it.
- "Yield to worst is always the yield to the nearest call date." Often true, never guaranteed. Worked Example 3's counter-example (a rich near-term call price paired with a cheap mid-schedule par call) produces a YTW that sits at neither the first call nor maturity. The expert computes every date in the schedule and takes the minimum; they never shortcut to "it must be the first call" or "it must be maturity."
- "A bond's realized return always equals the YTM you bought it at." Only true if you hold to maturity and reinvest every coupon at that exact same rate, an assumption almost no real holding period satisfies. The expert decomposes any actual holding period into coupon income, reinvestment income, and capital gain/loss, and expects the realized number to differ from the purchase-date YTM whenever rates moved.
- "Rising rates are simply bad for a bond investor." Only for the price component. A rate rise simultaneously raises reinvestment income on every coupon received after the move. The expert always asks which of the two offsetting effects dominates for their specific horizon, the whole basis of duration-matched immunization (FI1.02), rather than reflexively treating any rate move as unambiguously good or bad.
- "Money-market day-count conventions are the same everywhere, so one formula travels." US convention (bank-discount, 360-day year) and Indian convention (price-basis, 365-day year) are genuinely different defaults, and both drift over time by regulatory or market-body action. The expert opens the term sheet or the current FIMMDA/RBI (India) or market-practice (US) documentation for the specific instrument rather than assuming a formula that worked last time still applies.
- "An AI assistant's stated call price, day-count basis, or curve level is good enough to compute against." This is the AI0.01 failure mode wearing fixed-income clothes: a fabricated or stale figure is exactly as fluent as a correct one, and in this domain the "figure" is usually a precise number feeding directly into a price or yield calculation. The expert treats every such fact as a pointer to go verify (the actual prospectus, the FBIL/CCIL data feed, SEC EDGAR) never as the number itself.
Worked examples
Worked example 1: Pricing a G-Sec off a discount curve, and inverting for YTM (India, ₹)
A synthetic 3-year Government of India security, ₹100 face value, coupon 7.20% p.a. paid semi-annually (₹3.60 every six months, the standard G-Sec convention), has six remaining cash flows at t = 0.5, 1.0, 1.5, 2.0, 2.5, and 3.0 years (the final one ₹103.60, coupon plus redemption). The market's synthetic INR sovereign spot curve today, semiannual-compounding, illustrative shape only; pull FBIL's actual published G-Sec par/spot curve for live work: reads: 0.5y = 6.50%, 1y = 6.60%, 1.5y = 6.72%, 2y = 6.80%, 2.5y = 6.90%, 3y = 6.95%.
Solution. Step 1: price off the curve. Discount factor at each maturity: DF(t) = 1/(1+s(t)/2)^(2t). Computing all six (0.968523, 0.937129, 0.905613, 0.874818, 0.844010, 0.814681) and summing CF(tᵢ) × DF(tᵢ) gives a curve-consistent price of ₹100.71.
Step 2, compare to the two naive flat-yield shortcuts. Discounting every cash flow at the long (3-year) spot rate of 6.95% flat gives ₹100.67, close, but slightly below the curve price, because it applies 6.95% to the early coupons too, whose true spot rates (6.50–6.90%) are all lower, over-discounting them a hair relative to the curve. Discounting everything at the short (0.5-year) spot rate of 6.50% flat instead gives ₹101.88, visibly too high, because it discounts the large, distant final cash flow far too gently relative to its true 6.95% spot rate. Neither shortcut is "close enough" to treat as free; the direction and size of the error is exactly predictable from which end of the curve you borrowed the wrong rate from, apply too high a rate to a cash flow and you undervalue it; apply too low a rate and you inflate it.
Step 3: invert for YTM. Solving iteratively (bisection) for the single flat rate that reproduces the ₹100.71 curve price gives YTM = 6.93%, sitting, as the Core section predicted, between the curve's short end (6.50%) and long end (6.95%), pulled toward the long end because the bulk of this bond's present value sits in the large final cash flow.
Step 4, current yield and the ordering check. Current yield = 7.20 ÷ 100.71 = 7.15%. Check the ordering: coupon (7.20%) > current yield (7.15%) > YTM (6.93%), exactly the premium-bond ordering the Core section derived, because this bond's 7.20% coupon sits above every spot rate on the curve, making it a premium instrument (price above face).
Read it. Three different, all internally consistent numbers came out of one bond: a curve-consistent price of 100.71, a "close but wrong" flat-long price of 100.67, and a badly wrong flat-short price of 101.88. None of them is an error in the ordinary sense, each is the exact, correct answer to a different pricing question. The skill this example drills is knowing which question you are actually being asked, and never silently substituting a convenient flat rate for the real curve without checking the size of the resulting gap.
Worked example 2: The full money-market yield chain on a US Treasury bill (US, $)
An on-the-run 182-day US Treasury bill, face $10,000, is purchased for $9,850, illustrative; pull the actual current auction result from TreasuryDirect for live pricing.
Solution. Step 1, the dollar discount. D = F − P = 10,000 − 9,850 = $150.
Step 2: bank discount yield. rBD = (D/F) × (360/t) = (150/10,000) × (360/182) = 2.97%. Note both understatements at once: it divides by the $10,000 face value the buyer never actually paid, and it annualizes on a 360-day year.
Step 3: holding period yield. HPY = D/P = 150/9,850 = 1.5228%, the honest, un-annualized return actually earned over the 182 days.
Step 4: money-market (add-on) yield. rMM = HPY × (360/t) = 1.5228% × (360/182) = 3.01%, fixes the face-vs-price problem, still a 360-day year.
Step 5: bond-equivalent yield. BEY = HPY × (365/t) = 1.5228% × (365/182) = 3.05%, the number to actually compare against a coupon bond's YTM.
Step 6: effective annual yield. EAY = (1+HPY)^(365/t) − 1 = 3.08%, the only one of the four that truly compounds, and (as it must be) the largest.
Read it. Four different "yields" for one $150 discount on one $9,850 trade: 2.97% < 3.01% < 3.05% < 3.08%. Every step up is not the market becoming more generous, it is the same fixed, historical fact (you paid $9,850, you get back $10,000 in 182 days) restated on a progressively less-understating basis. A T-bill's headline "discount rate" (rBD) is, by design, the smallest number in this list, treat it as a quoting convention, never as "the return."
Worked example 3: Yield to call, yield to worst, and a genuine counter-example (US, $)
Highline Networks Inc. (synthetic), a 10-year corporate bond, $1,000 face, 6.00% coupon paid semi-annually ($30 every six months), trades at $1,050. Its call schedule: callable in 5 years at 102, callable in 8 years at par (100).
Solution. Step 1: YTM to the 10-year maturity. Solving the semiannual IRR of 20 coupons of $30 plus $1,000 at maturity against the $1,050 price gives YTM = 5.35%.
Step 2: YTC to each call date. To the 5-year call (10 semiannual periods, redemption $1,020): solving gives YTC₁ = 5.21%. To the 8-year call (16 periods, redemption $1,000): solving gives YTC₂ = 5.23%.
Step 3: yield to worst. Comparing all three: 5.35% (maturity), 5.21% (5-year call), 5.23% (8-year call), the minimum is YTW = 5.21%, at the first call date. Here, the intuitive pattern held: the earliest call hurt the premium bondholder most, because it cut short the coupon income that was supposed to earn back the $50 premium paid.
Step 4, a genuine counter-example, same mechanics, different call schedule. Change only the call schedule on an otherwise-identical bond (6% semiannual coupon, $1,000 face) now priced at $1,060: callable in 2 years at a rich 108 (a make-whole-style early-redemption premium), callable in 7 years at par, maturing in 10 years at par. Solving all three: YTC(2-year @ 108) = 6.56%; YTC(7-year @ par) = 4.97%; YTM(10-year @ par) = 5.22%. The minimum, the actual yield to worst: is 4.97%, at the 7-year call: neither the nearest call nor maturity. The rich early call price (108) makes the near call the best outcome for the holder (it more than compensates for the short holding period), while the mid-schedule par call, offering neither a rich redemption price nor much time to earn back the premium via coupons, turns out to be the genuine worst case.
Read it. Step 3 confirms the common intuition; Step 4 breaks it on purpose, with real, solved numbers, precisely because "the nearest call is usually worst" is true often enough to be dangerous, it will pass unnoticed for years until one call schedule with an unusual early premium makes the shortcut wrong, silently, on the one bond where it matters. Compute every date. Every time.
Worked example 4: Total-return decomposition under two rate paths (India, ₹)
Nilgiri Transmission Ltd. (synthetic), a 5-year NCD, ₹100 face, 8.00% coupon paid annually, was bought at issue at par (₹100, coupon equals the initial YTM of 8%). The investor's horizon is 3 years (2 years short of the 5-year maturity), after which the bond, now a 2-year-remaining instrument: is sold.
Solution, Scenario A: rates fall (reinvest at 7.00%, resell at a market yield of 7.50%).
Step 1: reinvestment income. Coupons of ₹8 arrive at the end of years 1, 2, and 3. The year-1 coupon compounds for 2 more years at 7%, the year-2 coupon for 1 more year, the year-3 coupon is received right at the horizon with no further compounding: FV = 8×1.07² + 8×1.07 + 8 = ₹25.72. Coupon income (the simple sum) = ₹24.00; reinvestment income = 25.72 − 24.00 = ₹1.72.
Step 2: capital gain. At the 3-year horizon, the bond has 2 annual coupons of ₹8 plus ₹100 redemption left, priced at the new 7.50% market yield: 8/1.075 + 108/1.075² = ₹100.90. Capital gain = 100.90 − 100.00 = ₹0.90.
Step 3: total and check. Total future value = 25.72 + 100.90 = ₹126.62; total ₹ return over 3 years = ₹26.62 = 26.62% (annualized 8.18%). Check: coupon income (24.00) + reinvestment income (1.72) + capital gain (0.90) = 26.62: ties exactly.
Scenario B: rates rise instead (reinvest at 9.00%, resell at a market yield of 9.50%). Repeating the same three steps: FV of reinvested coupons = ₹26.22 (reinvestment income ₹2.22, higher than Scenario A, because coupons compound at the now-higher 9% rate); resale price = ₹97.38 (capital loss of ₹2.62, because the 2 remaining years of cash flow are now discounted at a higher 9.50% yield); total future value = ₹123.60; total return = 23.60% over 3 years (annualized 7.32%).
Read it. Same bond, same 3-year horizon, opposite rate paths, and the two effects run in genuinely opposite directions each time: falling rates gave less reinvestment income but a capital gain; rising rates gave more reinvestment income but a capital loss. Neither scenario's realized annualized return (8.18% and 7.32%) exactly equals the bond's original 8.00% YTM, realized return only equals purchase-date YTM in the special case where you hold to maturity and every coupon happens to reinvest at that same original rate. This offsetting relationship, quantified here as two dollar-return decompositions, is precisely what FI1.02's duration-matched immunization formalizes into an engineerable hedge.
Worked example 5: Pricing a corporate bond as risk-free-plus-spread, and the credit-triangle tie-in (US, $)
Bishop Analytics Corp. (synthetic) issues a 5-year note, $1,000 face, 6.25% coupon paid semi-annually. The matching 5-year on-the-run UST spot rate is 4.05%; the market prices Bishop's credit risk at a 180 bp spread over that risk-free rate. (For clarity, this example uses one matched-tenor discount rate rather than a full multi-tenor curve-plus-spread build, the rigorous cash-flow-by-cash-flow version, spreading over every tenor point, is exactly Worked Example 1's technique, applied here with a credit spread added at each point.)
Solution. Step 1, the all-in discount rate. Corporate rate = risk-free (4.05%) + spread (1.80%) = 5.85%.
Step 2: price. Discounting 10 semiannual coupons of $31.25 plus $1,000 redemption at 5.85% (semiannual bond basis) gives $1,017.13, a premium, since the 6.25% coupon sits above the 5.85% all-in discount rate.
Step 3, current yield and the consistency check. Current yield = 62.50 ÷ 1,017.13 = 6.14%, sitting, as expected for a premium bond, between the coupon (6.25%) and YTM. Solving YTM back out of the $1,017.13 price recovers 5.85% exactly, confirming the pricing was self-consistent.
Step 4, the credit triangle, applied not re-derived. Using E11.01's relationship spread ≈ PD × LGD, and assuming a 40% recovery rate (LGD = 60%): implied annual default probability = 1.80% ÷ 0.60 = 3.00%.
Read it. Two skills fused into one bond: the curve-and-spread pricing machinery this module teaches, and the credit-triangle relationship E11.01 already taught, used here exactly as it was handed to you, as a given tool, not re-derived. This is the "analytics/math complement" this Ring exists to add: E11.01 tells you what a spread means; this module shows you precisely how that spread turns into a price and a yield.
Worked example 6: Certificate of deposit yield conversion, India convention (India, ₹)
Sahyadri Bank (synthetic) issues a 91-day Certificate of Deposit, face ₹5,00,000, priced at ₹4,90,500.
Solution. Step 1, the discount. D = 5,00,000 − 4,90,500 = ₹9,500.
Step 2: holding period yield. HPY = D/P = 9,500/4,90,500 = 1.94%.
Step 3, the India convention: price basis, 365-day year. Yield = HPY × (365/91) = 7.77%, this is the annualized number the India money-market convention reports, and it already sits on a price basis (fixing the face-vs-price issue the US bank-discount method never fixes by default). (Check the current FIMMDA/RBI day-count convention against the instrument's own term sheet before pricing a real CD, conventions are set by market-body circular and can change.)
Step 4: two contrasts. A bank-discount-style yield on this same trade (face-value basis, 365-day year, shown only to illustrate the difference in denominator, this is not the actual India market convention) would read 7.62%, lower, for the identical reason rBD understates in the US example. A 360-day, price-basis (add-on) yield, directly comparable to Worked Example 2's US convention: would read 7.66%.
Read it. The same ₹9,500 discount on the same ₹4,90,500 trade produces three different annualized numbers (7.62%, 7.66%, 7.77%) purely from the choice of denominator (face vs. price) and day-count (360 vs. 365), never assume which one a screen, a colleague, or an AI-drafted script used without checking.
Worked example 7: The duration gap and the crossover in realised return (US, $)
A ten-year, 6.00% annual-coupon US corporate note, $1,000 face, is bought at par to yield 6.00%. Immediately after purchase the market yield shifts once, either to 5.00% or to 7.00%, and stays there for the whole holding period; every coupon is reinvested at the prevailing yield. Compute the realised annual return at horizons of 4 years, 7.8017 years and 10 years, and read the duration gap in each case.
Solution. Step 1, price and duration. At 6.00% the note prices at $1,000.000000, as it must at par. Its Macaulay duration is 7.801692 years and its modified duration 7.360087 years.
Step 2, reprice at each shocked yield, on day one. P(5%) = $1,077.217349; P(7%) = $929.764185. Nothing else about the two rate paths needs to be modelled, which is the point of the closed form.
Step 3, apply r(H) = (1 + y₁) × [P(y₁)/P₀]^(1/H) − 1.
| Horizon H | Duration gap (D − H) | Realised at 5% | Realised at 6% | Realised at 7% |
|---|---|---|---|---|
| 4.0000 | +3.8017 | 6.9708% | 6.0000% | 5.0696% |
| 7.8017 | 0.0000 | 6.0059% | 6.0000% | 6.0059% |
| 10.0000 | −2.1983 | 5.7839% | 6.0000% | 6.2236% |
Step 4, verify by an independent route. Take the four-year horizon on the 7% path and build it by hand. The four coupons of $60, accumulated forward at 7%, are worth $266.396580 at year 4. The six remaining cash flows, discounted at 7% back to year 4, are worth $952.334603. Total wealth is $1,218.731183, which is exactly (1.07)^4 × 929.764185, and (1218.731183/1000)^(1/4) − 1 = 5.069576%, matching the table. The ten-year, 5% cell checks the same way: coupons accumulate to $754.673552, plus the $1,000 redemption gives $1,754.673552 and a realised 5.783914%.
Read it. At a four-year horizon the gap is strongly positive, price risk dominates, and the rate rise costs 93 basis points a year against the 6.00% you thought you were buying. At ten years the gap has turned negative, reinvestment risk dominates, and the same rate rise now adds 22 basis points a year. The sign of the exposure flipped, and the duration gap told you where. At the horizon that matches Macaulay duration, both shocks land on 6.0059%, over-earning the purchase yield by 0.59 of a basis point in each direction, which is the convexity residual and the reason immunisation is called a first-order result rather than an identity. Two things this does not say: the crossover assumes one parallel shift with no further moves, and the realised numbers are annual returns rather than dollar wealth, so a longer horizon that earns a higher rate still ends with the larger balance.
Practice set
Work every problem fully before reading its solution. Numeric answers are to about ±2% unless a tolerance is stated. All entities are synthetic unless a real primary source is named; all figures were computed and checked in Python.
P1 (guided). Curve pricing, a shorter bond. A 2-year, ₹100-face, 6.50% semiannual-coupon G-Sec is priced off a synthetic curve: 0.5y = 6.00%, 1y = 6.10%, 1.5y = 6.20%, 2y = 6.30%. Price it off the curve, and compute its current yield.
Solution. Discounting the four cash flows (₹3.25, 3.25, 3.25, 103.25) at their own maturities' spot rates gives price = ₹100.39. Current yield = 6.50/100.39 = 6.48%. Coupon (6.50%) > current yield (6.48%), already signaling a small premium, ahead of solving YTM.
P2 (guided). Solving YTM for a discount bond. A US$1,000-face, 4% semiannual-coupon (4-year, 8-period) bond trades at $940. Solve for YTM.
Solution. Iterating (bisection) on the 8-period semiannual IRR against a $940 price gives YTM = 5.70% (check: pricing the bond at 5.70% reproduces $940.00 exactly).
P3 (independent). The ordering check, on P2's bond. Compute the current yield for P2's bond and confirm the discount-bond ordering.
Solution. Current yield = 40/940 = 4.26%. Ordering: coupon (4.00%) < current yield (4.26%) < YTM (5.70%), exactly the discount-bond pattern, the mirror image of Worked Example 1's premium case.
P4. US T-bill, fresh numbers. A 91-day T-bill, face $25,000, is purchased for $24,700. Compute rBD, HPY, rMM, BEY, and EAY.
Solution. D = $300. rBD = (300/25,000)×(360/91) = 4.75%. HPY = 300/24,700 = 1.21%. rMM = HPY×(360/91) = 4.80%. BEY = HPY×(365/91) = 4.87%. EAY = (1+HPY)^(365/91) − 1 = 4.96%. Ordering holds: 4.75 < 4.80 < 4.87 < 4.96.
P5. India CD, fresh numbers. A 182-day CD, face ₹10,00,000, priced at ₹9,55,000. Compute HPY and the annualized yield on both the India (365-day, price-basis) and the US-comparable (360-day, price-basis / add-on) conventions.
Solution. D = ₹45,000. HPY = 45,000/9,55,000 = 4.71%. 365-day price basis (India convention) = 4.71%×(365/182) = 9.45%. 360-day price basis (add-on, for comparison) = 4.71%×(360/182) = 9.32%. EAY = 9.67%.
P6. Single YTC vs YTM. A $1,000-face, 7% semiannual-coupon bond trades at $1,080, callable in 4 years at 103, maturing in 12 years at par. Compute YTC and YTM, and state YTW.
Solution. YTC (8 periods, redemption $1,030) = 5.43%. YTM (24 periods, redemption $1,000) = 6.05%. YTW = 5.43%, at the call, the premium-bond pattern, early call hurts most, here.
P7. YTW across two calls plus maturity, annual-pay (India, ₹). A ₹100-face, 8.50% annual-coupon bond trades at ₹106, callable in 3 years at 102, callable in 6 years at 100.50, maturing in 9 years at par.
Solution. YTC₁ (3-year @ 102) = 6.84%. YTC₂ (6-year @ 100.50) = 7.30%. YTM (9-year @ 100) = 7.56%. YTW = 6.84%, the first call, check all three; here the intuitive pattern (earliest call worst) held, but Worked Example 3's counter-example shows it need not.
P8. Total-return decomposition, rates rise (India, ₹). A ₹100-face, 7.50% annual-coupon 4-year bond, bought at par, is held 2 years (2 years remaining at sale), reinvesting the one coupon received at 7.00% and reselling at a market yield of 8.00%.
Solution. Coupon income = ₹15.00 (2 coupons of 7.50); FV of reinvested coupons = 7.50×1.07 + 7.50 = ₹15.53 (reinvestment income ₹0.53). Sale price of the 2-year-remaining bond at 8.00% = 7.50/1.08 + 107.50/1.08² = ₹99.11 (capital loss of ₹0.89). Total future value = 15.53 + 99.11 = ₹114.63; total 2-year return = 14.63% (annualized 7.07%): below the original 7.50% YTM, as expected when rates rise and the price effect isn't offset by enough extra reinvestment income over a short horizon.
P9. Total-return decomposition, semiannual, dollars (US, $). A $1,000-face, 5% semiannual-coupon 5-year note, bought at par, is held 3 years (6 semiannual periods; 2 years/4 periods remaining at sale), reinvesting coupons at 4.50% annualized (2.25%/period) and reselling at a market yield of 4.75% annualized.
Solution. Coupon income = 6 × $25 = $150.00. FV of the six reinvested coupons (each compounding at 2.25%/period for the remaining periods to horizon) = $158.69 (reinvestment income $8.69). Sale price of the 4-period-remaining note at 4.75%/2 per period = $1,004.72 (capital gain $4.72). Total future value = $1,163.41; total 3-year $ return = $163.41 = 16.34% (annualized 5.17%): above the original 5.00% coupon/YTM, since here the resale capital gain from a lower resale yield outweighs the shortfall in reinvestment income.
P10. Curve vs. flat-yield pricing on an inverted curve (US, $). A $1,000-face, 5% semiannual-coupon 3-year note is priced off a synthetic inverted curve: 0.5y=5.20%, 1y=5.10%, 1.5y=5.00%, 2y=4.90%, 2.5y=4.80%, 3y=4.70%. Compute the curve-consistent price and both flat-yield shortcuts.
Solution. Curve-consistent price = $1,007.91. Flat at the long (3y=4.70%) rate = $1,008.30, close, slightly high, because the long rate is a hair below most of the true intervening spot rates. Flat at the short (0.5y=5.20%) rate = $994.51, badly low, because it over-discounts the large final cash flow relative to its true, much lower long-end spot rate. Note the direction reverses from Worked Example 1's upward-sloping case: on an inverted curve, borrowing the short rate for everything now understates the price, and borrowing the long rate slightly overstates it.
P11. The credit triangle, both directions. (a) A bond trades at a 250 bp spread; assumed recovery is 35%. Implied annual PD? (b) Your own estimate is PD = 2.5%, recovery 50%. What spread would you consider fair?
Solution. (a) LGD = 65%; implied PD = 2.50%/0.65 = 3.85%. (b) LGD = 50%; fair spread = 2.5% × 0.50 = 125 bp.
P12. US commercial paper, 60-day. Face $1,000,000, priced at $992,500. Compute rBD, HPY, rMM, BEY, EAY.
Solution. D = $7,500. rBD = (7,500/1,000,000)×(360/60) = 4.50%. HPY = 7,500/992,500 = 0.76%. rMM = HPY×(360/60) = 4.53%. BEY = HPY×(365/60) = 4.60%. EAY = (1+HPY)^(365/60) − 1 = 4.69%.
P13 (timed: 20 minutes, 5 parts). Cross-instrument sprint. (i) A 364-day India T-bill, face ₹1,00,000, priced at ₹96,500: HPY and the 365-day annualized yield? (ii) A US $1,000-face, 4.5% semiannual-coupon 2-year bond priced at a flat 5.00% YTM, price? (iii) That bond's current yield? (iv) An Indian NCD, ₹100 face, 9% annual coupon, priced at ₹108, callable in 2 years at 101: YTC? (v) A ₹100 bond bought at par, paying one ₹6 coupon, sold after 1 year at ₹101.50: total 1-year ₹ return?
Solution. (i) HPY = 3,500/96,500 = 3.63%; 365-day yield = 3.63%×(365/364) = 3.64%. (ii) Price = $990.60. (iii) Current yield = 45/990.60 = 4.54%. (iv) YTC = 5.17%. (v) Total return = 6.00 + (101.50−100.00) = ₹7.50 = 7.50%. Scoring: 5/5 in 20 minutes is fluent across every yield family this module teaches; ≤3 correct means revisit the relevant worked example before the mastery check.
P14. Quick ordering check, annual pay. A ₹100-face, 5% annual-coupon 2-year bond trades at ₹96. Compute current yield and YTM; confirm the ordering.
Solution. Current yield = 5/96 = 5.21%. YTM (solved) = 7.22%. Ordering: coupon (5.00%) < current yield (5.21%) < YTM (7.22%), the discount-bond pattern.
P15. Why BEY, not rBD, is the number that belongs next to a coupon bond's YTM. Using P4's T-bill (rBD = 4.75%, BEY = 4.87%), explain in two sentences why comparing that T-bill's rBD against a coupon bond's YTM would make the T-bill look like a worse investment than it actually is.
Solution. rBD divides the discount by face value ($25,000) rather than the $24,700 actually paid, and annualizes on a 360- rather than 365-day year, both choices mechanically shrink the reported number relative to the instrument's true, price-basis, 365-day return. Comparing a 4.75% rBD against a coupon bond's YTM (which is quoted price-basis, 365-day) would understate the T-bill's true return by roughly 12 basis points (its actual BEY is 4.87%), small on one trade, but a real and avoidable distortion across a whole book of short paper.
P16. Prove the decomposition sums, fresh numbers. A ₹100-face, 6.50% annual-coupon bond, bought at par, is held 2 years, reinvesting the year-1 coupon at 6.00%, and is sold at the horizon for a given price of ₹98.50. Decompose the total return into its three sources and confirm they sum to the total ₹ return.
Solution. Coupon income = 2 × 6.50 = ₹13.00. FV of reinvested coupons = 6.50×1.06 + 6.50 = ₹13.39 (reinvestment income ₹0.39). Capital gain/(loss) = 98.50 − 100.00 = −₹1.50. Total future value = 13.39 + 98.50 = ₹111.89; total ₹ return = ₹11.89 = 11.89% over 2 years (annualized 5.78%). Check: 13.00 + 0.39 + (−1.50) = 11.89, ties exactly to the total future value minus purchase price, computed independently.
P17. Curve shape and mispricing direction, a humped curve (US, $). A synthetic curve is humped: 0.5y=5.00%, 1y=5.30%, 1.5y=5.50%, 2y=5.60%, 2.5y=5.55%, 3y=5.40%, 10y=5.00%. Price a $1,000-face, 5% semiannual-coupon 3-year bond off the true curve, and compare to pricing it flat at the 10-year rate. Which way is the error, and why?
Solution. Curve-consistent price = $988.93. Flat at the 10-year rate (5.00%) = $1,000.00, a difference of $11.07, and the flat-10-year shortcut overprices the bond, because the bond's real cash flows (concentrated in years 0.5–3) sit against true spot rates (5.00–5.60%) that are mostly above the 10-year rate being borrowed, discounting at too low a rate always inflates present value. The lesson: never assume a single "benchmark" point on the curve is a safe stand-in for a shorter or longer instrument's true rate without checking the curve's actual shape in the relevant range.
P18 (timed: 15 minutes, 5 parts, all skills). Final sprint. (i) A ₹100-face, 6% annual-coupon 3-year bond is priced off a curve: 1y=6.00%, 2y=6.10%, 3y=6.20%, price? (ii) Its flat YTM? (iii) A US T-bill, face $10,000, priced at $9,700, 270 days to maturity: BEY? (iv) Given YTM=5.85%, YTC(call 1)=6.10%, YTC(call 2)=6.02%: YTW? (v) A $1,000 bond pays one $55 coupon and is sold at $1,015 after 1 year: total $ return?
Solution. (i) Price = ₹99.49. (ii) YTM = 6.19%. (iii) BEY = 4.18%. (iv) YTW = 5.85%, here YTM itself is the lowest of the three, a reminder that maturity, not a call, can be the worst case (this happens for a bond priced at a discount to some or all of its redemption values, the opposite situation from Worked Example 3's premium bond). (v) Total return = 55 + (1,015−1,000) = $70 = 7.00%. Scoring: 5/5 in 15 minutes means every yield family in this module is now fluent; treat anything below 4/5 as a signal to redo the relevant worked example before attempting the mastery check.
P19. Sign the exposure with a duration gap (India, ₹). You owe a fixed ₹1 crore liability in exactly 6 years. You fund it by buying a ₹100-face, 5.00% annual-coupon 9-year bond at par. Compute the bond's Macaulay duration and the duration gap, then say which direction of parallel rate move leaves you short of the liability, and why.
Solution. For a par bond the Macaulay duration has a closed form, D = [(1+y)/y] × [1 − (1+y)^−n], so D = (1.05/0.05) × (1 − 1.05⁻⁹) = 21 × 0.355391 = **7.463213 years**. The duration gap is 7.463213 − 6 = **+1.463213 years**, comfortably positive. A positive gap means the bond outlives the horizon, so price risk dominates and a rise in yields is what leaves you short. At year 6 you must sell a bond with three years still to run, and a higher yield means a lower sale price. The extra reinvestment income the six coupons earned offsets only part of that. The fix is to fund the liability with a shorter bond, or a barbell, whose duration is 6 rather than 7.46; FI1.02 turns that into portfolio machinery.
P20. Realised return at two horizons under a 200 bp shock (US, $). Take Worked Example 7's ten-year, 6.00% annual-coupon note bought at par, and let the yield jump once to 8.00% immediately after purchase and stay there. Compute the realised annual return at a 5-year horizon and at the 7.8017-year horizon, and state what the pair shows.
Solution. Reprice at 8.00% on day one: P(8%) = **$865.798372**. Then apply r(H) = (1 + y₁) × [P(y₁)/P₀]^(1/H) − 1. At H = 5: 1.08 × (0.865798372)^(1/5) − 1 = **4.9318%**, with a duration gap of 7.8017 − 5 = +2.8017, so price risk dominates and the shock costs about 107 basis points a year. At H = 7.8017: 1.08 × (0.865798372)^(1/7.8017) − 1 = **6.0235%**, a gap of zero and a realised return 2.35 basis points above the 6.00% purchase yield. Two readings. The immunised horizon works just as well for a 200 bp shock as for the 100 bp shock in Worked Example 7, because the cancellation is a property of the horizon rather than of the shock size. And the convexity residual grows with the square of the shock, from 0.59 bp at 100 bp to 2.35 bp at 200 bp, roughly four times as large for twice the move, which is exactly the quadratic behaviour FI1.02 formalises.
Applied mini-project
Price and yield a real bond, both sides of the border. Time: 3–4 hours. This project moves you from synthetic practice numbers to real, current market data, pulled by you, verified by you, computed by you.
- The India leg. Pull the current FBIL-published G-Sec par or spot yield curve (or CCIL's NDS-OM data, if accessible to you) and identify one on-the-run G-Sec. Using the curve, price that G-Sec cash-flow-by-cash-flow (as Worked Example 1 did), and separately solve its YTM by iteration. Compare your curve-consistent price to the security's actual quoted market price, are they close? If not, name the most likely reason (a stale curve snapshot, a liquidity premium not in the sovereign curve, a timing mismatch between your data pull and the quote).
- The US leg. Pull the US Treasury's daily par yield curve rates (treasury.gov) and price an on-the-run UST note the same way. Separately, pull a recent 26-week (182-day) T-bill auction result from TreasuryDirect and compute its bank-discount yield, money-market yield, BEY, and EAY from the auction's own price and face value.
- The callable leg. Find one real US corporate bond with a public call schedule (SEC EDGAR full-text search on the issuer's prospectus, or a bond-data terminal/screen if you have access) or one real Indian NCD with a call feature (the issuer's information memorandum via BSE/NSE). Compute YTM and every YTC in its schedule, and state YTW, showing your work exactly as Worked Example 3 does, checking every date rather than assuming the answer.
- The total-return leg. Pick a historical 2–3 year holding period for a bond you can find historical yield data for (e.g., an on-the-run UST note bought and "sold" between two real historical dates using publicly available historical Treasury yields). Decompose the realized (backward-looking, hypothetical) total return into coupon income, reinvestment income (using the actual short-term rates that prevailed during the period as your reinvestment proxy), and capital gain/loss.
- Memo. One page, conclusion first: "Which of these four legs produced the biggest gap between the 'obvious' number (a flat-yield price, a headline discount rate, an assumed nearest-call YTW, or the purchase-date YTM) and the correctly computed one, and by how much?"
Scoring rubric (self-grade after writing; pass ≥ 12/16):
| Criterion | 0 | 1 | 2 |
|---|---|---|---|
| G-Sec curve pricing + YTM computed and sourced to FBIL/CCIL | Missing/wrong | Computed, source unclear | Computed correctly, curve dated and sourced |
| UST note curve pricing + YTM, sourced to Treasury.gov | Missing/wrong | Computed, source unclear | Computed correctly, curve dated and sourced |
| T-bill money-market yield chain (all four measures) from a real auction result | Absent | Partial/errors | All four correct, auction result cited |
| YTC/YTW computed on every date of a real call schedule | Absent | Only one date checked | Every date checked, YTW correctly identified, source document cited |
| Total-return decomposition ties (coupon + reinvestment + capital gain = total) | Not attempted | Computed, doesn't tie | Computed and ties, reinvestment-rate proxy justified |
| Every figure traceable to a named primary source (FBIL, CCIL, Treasury.gov, TreasuryDirect, EDGAR, BSE/NSE) | No sourcing | Partial | Every number sourced |
| Curve-vs-flat and nearest-call-vs-true-YTW gaps explicitly quantified, not just described | Absent | Described only | Quantified with the actual computed gap in the relevant units |
| Memo: conclusion-first, load-bearing numbers | Rambling | Structured, weak proof | Crisp verdict, numbers do the work |
Keep the worksheet in your permanent notes (M0.04 system), this is the exact "predict, compute, verify" reflex the rest of the Fixed Income branch, and the AI-Augmented branch's Guardrail, both assume you already have.
Reading & resources
Everything below is an anchor to verify against and learn from, never a substitute for your own Python arithmetic. Level tags run beginner → advanced.
The bond-math core:
- Frank Fabozzi, Bond Markets, Analysis, and Strategies (any recent edition), the standard reference; its chapters on bond pricing, yield measures, and money-market instruments map almost line-for-line onto this module. [Paid] [Intermediate–Advanced]
- CFA Institute curriculum, Level I ("Fixed-Income Cash Flows and Types," "Fixed-Income Issuance and Trading," "Yield and Yield Spread Measures") the direct professional-exam mirror of this module's scope. [Paid] [Intermediate]
- Aswath Damodaran's fixed-income teaching notes (NYU Stern pages), bond pricing and yield-to-maturity intuition from the same first-principles angle this module takes. [Free] [Intermediate]
- Khan Academy (bonds and interest rates) a gentle, visual first pass on price/yield mechanics before the denser material above. [Free] [Beginner]
- Zerodha Varsity, the bond/fixed-income module: India-specific framing of G-Sec and NCD conventions, current yield, and YTM. [Free] [Beginner]
Primary-source anchors, trace every real figure here, never to an AI's summary:
- FBIL (Financial Benchmarks India Pvt Ltd): the primary publisher of India's G-Sec par/spot yield curves and reference money-market benchmarks. [Free] [Intermediate–Advanced]
- CCIL (Clearing Corporation of India) (NDS-OM) live and historical G-Sec trade and yield data. [Free/subscription] [Advanced]
- FIMMDA (Fixed Income Money Market and Derivatives Association of India), day-count, valuation, and quoting-convention handbook for Indian fixed income. [Membership/subscription, check current access] [Advanced]
- RBI, "FAQs on Government Securities" and the RBI Handbook of Statistics on the Indian Economy. T-bill and G-Sec issuance mechanics, SDL data. [Free] [Beginner–Intermediate]
- US Department of the Treasury. Daily Par Yield Curve Rates (treasury.gov), the primary source for the on-the-run UST curve. [Free] [Beginner–Advanced]
- TreasuryDirect: T-bill, note, and bond auction results. [Free] [Beginner]
- SEC EDGAR (full-text search): the primary source for a real corporate bond's prospectus, indenture, and call schedule. [Free] [Beginner–Advanced]
- FINRA TRACE: US corporate bond trade-price reporting. [Free (delayed data)/subscription (real-time)] [Intermediate]
Going deeper on the Modern Data Analysis angle:
numpy-financialandscipy.optimizedocumentation: the building blocks for a first Python IRR/YTM solver. [Free] [Intermediate]- QuantLib documentation, and Luigi Ballabio's Implementing QuantLib, the industrial-grade, production-tested version of everything this module built by hand: curve construction, day-count conventions, and bond pricing in code. [Free (docs)/Paid (book)] [Advanced]
Do this, not just read: pull one real on-the-run G-Sec or UST note's quoted price and yield today, price it yourself off the current published curve, and see how close your number lands to the screen's. The gap (if any) is where the real skill of this module, and the honest limits of a synthetic curve: actually lives.
Teach it back & journal
Feynman prompt. Explain to a colleague who has only ever heard "the bond's yield is X%" why that single number can mean four completely different things depending on whether the bond is a plain coupon bond, a T-bill, a callable note, or something you plan to sell before maturity. You must, in under one page: (1) name all four situations and which yield measure belongs to each (YTM/current yield; the money-market chain; YTC/YTW; total-return decomposition); (2) include one tiny numeric example (three lines is enough) showing a case where the "obvious" number and the correctly computed number differ; and (3) end with the one sentence that ties it together: why a fluent, confidently-stated wrong yield is indistinguishable from a correct one until you check it yourself.
Journal prompt. Pull one real bond or money-market instrument you can find current data for (a G-Sec, a UST, a T-bill, a corporate note) and price or yield-convert it yourself, by hand or in a five-line Python script, before looking at what any screen or data provider reports for it. Write three sentences: (1) how close your computed number came to the reported one, and if there was a gap, your best explanation for it (a stale curve, a different day-count convention, a liquidity premium); (2) which of this module's yield measures you found yourself least confident computing from memory, and why; and (3) one habit from this module, always naming which yield measure you're looking at, always checking every call date, always decomposing a realized return into its three sources, that you will make automatic the next time a "yield" crosses your desk.
This module's flashcards and mastery quiz are wired into the app: see the node's Quiz and Reviews.