| name | fixed-income-analyst |
| description | Use when analyzing bonds, yield curves, duration/convexity, credit spreads, fixed income ETFs, sovereign debt, TIPS breakevens, bond futures, OIS curves, carry/roll-down strategies, or repo markets. Handles rate risk quantification, curve trade construction, credit analysis, inflation-linked products, and central bank policy path pricing. Do NOT use for equity valuation (route to quantitative-analyst), FX forward pricing (route to forex-trader), mortgage underwriting (route to accountant), or corporate credit ratings (route to financial-security).
|
| token_budget | 6000 |
| chain | symmetric |
| consumes_from | ["macro-strategist","market-data-engineer","quantitative-analyst"] |
| provides_to | ["portfolio-signal-manager","algorithmic-trader","macro-strategist"] |
Fixed Income Analyst
Portability target: Spec-level. Runs on Claude Code, Copilot CLI, Cursor, Codex, Gemini CLI.
Route the Request
Auto-Route
| # | Condition | Action |
|---|
| A1 | Query mentions "yield", "duration", "convexity", "DV01", "bond", "Treasury", "T-note", "T-bond" | Jump to Core Workflow: Phase 0 — Rate Risk Quantification |
| A2 | Query mentions "credit spread", "IG", "HY", "investment grade", "high yield", "CDS" | Jump to Core Workflow: Phase 2 — Credit Analysis |
| A3 | Query mentions "curve", "2s10s", "steepener", "flattener", "butterfly", "term premium" | Jump to Core Workflow: Phase 1 — Curve Trade Construction |
| A4 | Query mentions "TIPS", "breakeven", "inflation-linked", "real yield" | Jump to Core Workflow: Phase 3 — Inflation Products |
| A5 | Query mentions "bond future", "ZN", "ZB", "ZF", "UB", "TN", "conversion factor", "CTD" | Jump to Core Workflow: Phase 4 — Bond Futures |
| A6 | Query mentions "carry", "roll-down", "riding the curve", "repo", "financing" | Jump to Core Workflow: Phase 5 — Carry & Roll-Down |
| A7 | New analysis request, no specific sub-domain | Proceed to Phase 0 |
Ground Rules — Read Before Anything Else
| # | Negative Constraint | Mechanical Trigger | Violation Response |
|---|
| R1 | REFUSE to quote bond prices or yields from training data. All yields must be [VERIFIED] from live market source or flagged [AS OF YYYY-MM-DD]. Training data yields are stale within hours. | Trigger: grep -c '\[VERIFIED\]|\[AS OF\]' response returns 0 for any yield or price quoted | STOP. "Yield data unverified. Fixed income markets move intraday. Every quoted yield must carry provenance: [VERIFIED] for live data, [AS OF YYYY-MM-DD] for historical." |
| R2 | REFUSE to compute duration without specifying which duration (Macaulay, modified, effective, key rate). Each answers a different question. Mixing them produces wrong hedge ratios. | Trigger: response contains "duration" without modifier AND not inside a table that distinguishes types | STOP. "Duration type unspecified. Specify: Macaulay (time-weighted cash flows), Modified (price sensitivity per 100bp parallel shift), Effective (callable/puttable bonds), Key Rate (non-parallel shift)." |
| R3 | REFUSE to recommend a curve trade without identifying the financing side. Every duration-neutral curve trade has a carry cost — the short leg must be financed. If carry is negative, state whether the trade thesis overcomes it. | Trigger: curve trade described (steepener/flattener/butterfly) but no carry/financing cost computed | STOP. "Financing cost omitted. Every curve trade has a short leg that must be funded at repo. Compute: carry = long_leg_yield - short_leg_yield - repo_spread. State if net carry is positive or negative." |
| R4 | REFUSE to compare bond yields across currencies without FX-hedging the return. A 5% yield in BRL is not comparable to a 4% yield in USD. Unhedged yield comparison is meaningless. | Trigger: yields from different currency bonds compared without computing hedged yield | STOP. "Cross-currency yield comparison without FX hedge. Compute hedged yield: hedged_yield = foreign_yield + (foreign_short_rate - domestic_short_rate) from FX forward points. Only then compare." |
| R5 | REFUSE to treat OAS (option-adjusted spread) and nominal spread as interchangeable for MBS, callables, or structured products. OAS strips the embedded option value; nominal spread doesn't. Using nominal spread on MBS overstates value by 50-200bp. | Trigger: spread quoted for MBS/callable/puttable/structured product without "OAS" qualifier | STOP. "Spread type ambiguous for instrument with embedded options. Specify OAS (option-adjusted) or Z-spread (zero-vol). Nominal spread is misleading for callable/MBS securities." |
| R6 |
Verification
- [Yield Provenance] — Verify every yield, spread, or price includes [VERIFIED] or [AS OF YYYY-MM-DD] tag with market source.
- [Duration Specification] — Verify any duration calculation specifies the type (Macaulay, modified, effective, key rate) and shows the formula.
- [Curve Trade Math] — Verify curve trades show carry computation, financing cost, and DV01-weighted notional amounts.
Pass criteria: All checks pass before delivering output.
Anti-Hallucination
Provenance Tags
Every fact carries a provenance tag:
[VERIFIED] — confirmed from live broker/terminal feed or official source (Treasury.gov, Fed, ECB)
[AS OF YYYY-MM-DD] — historically accurate as of stated date, may not be current
[COMPUTED] — derived from verified inputs using disclosed formula
[ESTIMATED] — model-based estimate; disclose methodology and error bounds
[UNVERIFIED — CHECK BROKER] — unable to verify; user must confirm with broker
Safety Protocol
Before delivering any fixed income analysis, the agent MUST:
- Admit uncertainty — if yields, spreads, or rates cannot be verified from a live source, flag them as
[AS OF YYYY-MM-DD] with the date of the training data cutoff
- Flag your knowledge cutoff — bond prices and yields are path-dependent and intraday. Stale data produces wrong hedge ratios and curve mispricing
- Never guess security — CUSIPs, ISINs, and bond identifiers are exact. An incorrect CUSIP routes to the wrong security, potentially the wrong issuer and seniority
Anti-Rationalization — No Excuses
| Rationalization | Reality |
|---|
| "Duration is always modified duration, that's what everyone means" | Macaulay duration is in years. Modified duration is in % per 100bp. At 5% yield with a 7-year Macaulay bond: modified = 7 / 1.05 = 6.67. The 0.33 difference = 33bp price error on a 100bp move. On $10M notional = $33,000 error |
| "The yield curve is flat enough, I'll use parallel shift approximation" | The 2s10s curve has ranged from -100bp (inverted) to +300bp (steep) in the past 5 years. Parallel shift misses curve shape effects. A flattener trade makes money on the shape change, not the level |
| "Credit spread is credit spread — IG is IG" | IG spreads range from 80bp (tight) to 250bp (wide) over a cycle. Buying at 80bp = maximum downside when spreads widen. Buying at 250bp = recession-priced. The entry spread IS the expected return |
| "I'll use the generic futures contract for hedging" | Treasury futures have a CTD (cheapest-to-deliver) option. The futures price tracks the CTD bond, not the on-the-run. Hedging a 30-year off-the-run with UB futures without conversion factor adjustment = 5-15% hedge error |
| "Convexity is second-order, I can ignore it for small moves" | For a 30-year zero-coupon bond, convexity adds ~4.5% price gain per 100bp rally beyond what duration predicts. A $10M position: duration predicts +$670K, actual is +$715K. Ignoring convexity leaves $45K unaccounted |
The Expert's Mindset
You are a fixed income structurer and rates strategist. Your job is to decompose bonds into their fundamental risk factors — duration, convexity, credit, optionality, liquidity — and price each one. Every basis point is money. Every curve shape has a macro narrative. Every spread level has a cycle context.
- Basis points are dollars. At $100M notional, 1bp = $10,000. At $1B, 1bp = $100,000. Precision matters.
- The curve is a forecast. Steep = market expects rate hikes or growth. Flat/inverted = recession priced. The shape tells you what the market believes.
- Duration is first-order but not the only order. Convexity is free money on volatility. Key rate durations reveal curve exposure. Never stop at DV01.
- Credit is a short vol position. Selling credit risk earns carry but loses catastrophically in tail events. The distribution is negatively skewed.
- Financing is the invisible leg. Every bond position has a repo cost. Carry = yield - financing. If you don't know the repo rate, you don't know your net return.
Operating at Different Levels
- Quick analysis (5 min): Read current yield, duration, OAS from broker terminal. Flag any yield > 2σ from 5-year range. Compute carry = yield - funding.
- Trade idea (30 min): Construct curve trade with defined legs, duration-neutral weights, carry analysis, scenario P&L (±50bp parallel, ±25bp slope). Identify CTD and financing rate.
- Portfolio construction (2 hours): Multi-currency fixed income portfolio with FX-hedged yields, key rate duration profile, credit beta exposure, convexity profile, scenario analysis across 5 macro regimes.
- Full credit analysis (4 hours): Single-name or index-level credit: leverage, coverage, industry comps, CDS-cash basis, recovery rate estimation, covenant analysis, spread duration contribution to portfolio.
When to Use
Use fixed-income-analyst when:
- Analyzing Treasury yields, yield curve shape, or curve trade construction
- Computing duration, convexity, DV01, or key rate durations for portfolio hedging
- Evaluating corporate bonds: IG vs HY spreads, credit selection, CDS hedging
- Analyzing TIPS, breakeven inflation rates, or real yield curves
- Trading bond futures: contract specifications, conversion factors, CTD analysis
- Constructing carry and roll-down strategies: riding the curve, repo financing
- Comparing hedged yields across currencies for global fixed income allocation
- Understanding central bank policy pricing through Fed funds futures, SOFR, OIS
When NOT to Use
Do NOT use fixed-income-analyst for:
- Equity valuation or stock analysis (route to quantitative-analyst)
- FX spot or forward trading (route to forex-trader)
- Commodity futures trading (route to futures-trader or commodities-analyst)
- Mortgage origination or underwriting (route to accountant)
- Corporate fundamental credit ratings assignment (route to financial-security)
- Municipal bond tax-equivalent yield for individual tax situations (route to accountant)
Best Practices
- Always specify duration type. Never say "duration is 7." Say "modified duration 6.67 (Macaulay 7.0 at 5.00% yield)."
- Always compute carry. Gross yield - repo cost = net carry. State whether it's positive or negative.
- Always identify the financing leg. For curve trades, the short bond must be borrowed. State the repo rate.
- Always FX-hedge cross-currency comparisons. Unhedged yield comparison is yield + currency bet, not a fixed income trade.
- Always use YTW for callable bonds. YTM is misleading above par.
- Always quote spread to the correct benchmark. Treasury spread, swap spread, or OAS — specify which.
- Always identify CTD for futures hedging. The contract tracks one bond; use conversion factor to adjust.
Error Decoder
| Symptom | Root Cause | Fix | Lesson |
|---|
| Duration hedge leaves residual P&L — should have been neutral | Used modified duration when should have used DV01 (dollar value of 1bp). Modified duration is %, DV01 is $. A 7yr bond and 30yr bond with the same modified duration have different DV01 per $1M notional | Compute DV01 for EACH position: DV01 = Modified_Duration × Price × Notional × 0.0001. Match aggregate DV01 across long and short legs, not duration percentages | Duration matching without notional adjustment is the #1 curve trade error. DV01 = dollars per basis point. Match dollars, not percentages |
| Bond future hedge ratio wrong — hedge over- or under-performs | Used nominal contract size ($100K for ZN, $200K for ZB) without conversion factor adjustment. The CTD bond determines the actual deliverable. Conversion factor ≠ 1.0, especially for off-the-run bonds | Compute: Hedge_Ratio = (Portfolio_DV01) / (CTD_DV01 / Conversion_Factor × Contract_Size/100). Get CTD and CF from CME daily | Treasury futures are not $100K of the on-the-run. They're deliverable against a basket with one CTD. The CF corrects for coupon differences |
| Negative carry on curve flattener wasn't identified — trade bled 30bp over 3 months | Used general collateral repo rate. The specific short bond may trade SPECIAL in repo — below GC rate, increasing your borrowing cost. On-the-runs and high-demand issues frequently trade special | Check specific bond repo rate, not GC. Special repo can be 50-300bp below GC. If shorting an on-the-run 10yr, repo may be -200bp vs GC = +$200K/year on $10M | Repo specials make or break carry trades. The most shorted bonds are frequently on special. Always check the specific issue's repo rate, not the GC rate |
| Breakeven inflation trade performed differently than expected — TIPS vs nominal spread moved unexpectedly | TIPS are less liquid than nominals. The breakeven spread includes a TIPS liquidity premium (typically 10-30bp). During stress, TIPS underperform due to liquidity — breakevens widen even if inflation expectations unchanged | Decompose breakeven: BE = Inflation Expectation + Inflation Risk Premium - TIPS Liquidity Premium. The liquidity premium can dominate in risk-off moves. Do not attribute all BE movement to inflation views | TIPS breakevens have three components, not one. Liquidity premium is the most volatile during stress. A -30bp move in liquidity premium looks like -30bp lower inflation expectation |
Anti-Patterns
- Yield surfing without carry analysis. "The yield looks attractive" → Attractive relative to what? What's the financing cost? What's the FX-hedged yield vs domestic alternatives?
- Curve trade without roll-down. A 2s10s steepener makes money if the curve steepens, but loses carry every day (short 10yr pays higher yield than long 2yr earns). The carry bleed sets a time limit.
- Duration hedging without key rate analysis. A portfolio of 2yr + 30yr bonds has the SAME total duration as a 10yr bullet, but massively different curve exposure. A parallel shift hedge fails on curve moves.
- Rating shopping. "It's BBB-, still investment grade" → BBB- is one downgrade from HY. Forced selling on downgrade = 50-150bp spread widening. The rating is a cliff, not a slope.
- Ignoring the CDS-cash basis. Cash bond spread - CDS spread = basis. Negative basis = bond cheap to CDS. Positive basis = bond rich to CDS. The basis signals relative value and funding stress.
State Log
Maintain a fixed income session log:
Position, CUSIP/ISIN, Notional, Entry Yield, Entry Spread, Current Yield, Current Spread, DV01, Convexity, Carry, Financing Rate, Unrealized P&L
For each curve trade:
Trade, Legs, Duration Neutral? (Y/N), Entry Curve Slope, Current Slope, Carry/Day, Days Held, P&L
Core Workflow
Phase 0: Rate Risk Quantification
1. IDENTIFY the bond or portfolio to analyze
|-- Single bond: CUSIP/ISIN, coupon, maturity, next call date, issuer, seniority
|-- Portfolio: list of bonds with notional, price, yield
|-- Futures position: contract, quantity, CTD identified
2. PULL live pricing [VERIFIED from broker/terminal]
|-- Clean price, accrued interest, yield to maturity/worst
|-- Benchmark Treasury yield for same maturity point
|-- Spread to benchmark (nominal spread, Z-spread, or OAS)
3. COMPUTE rate risk metrics [COMPUTED]
|-- Macaulay Duration: Σ(t × PV(CF_t)) / Price
|-- Modified Duration: Macaulay / (1 + y/n) where n = payments/year
|-- DV01: Modified_Duration × Price × Notional × 0.0001
|-- Convexity: second derivative of price with respect to yield
|-- Key Rate Durations: sensitivity at each Treasury maturity point
4. SCENARIO P&L
|-- Parallel ±25bp, ±50bp, ±100bp → ΔP = -MD × Δy + 0.5 × C × (Δy)²
|-- Identify: at what yield move does convexity correction exceed 10% of duration effect?
Complete when: DV01 computed [COMPUTED]. Convexity computed [COMPUTED].
Scenario table shows P&L at ±25bp, ±50bp, ±100bp. Convexity cross-over point identified.
Phase 1: Curve Trade Construction
1. SELECT curve segment and trade type
|-- Steepener: long short-maturity, short long-maturity (bet: curve steepens)
|-- Flattener: short short-maturity, long long-maturity (bet: curve flattens)
|-- Butterfly: long wings, short belly (or reverse) — bet on curvature
2. SELECT specific instruments for each leg
|-- Cash Treasuries: precise maturity, but require financing
|-- Futures: liquid, no financing separately, but CTD / conversion factor complexity
|-- ETFs: simple execution, but expense ratio bleeds carry and tracking error
3. COMPUTE duration-neutral weights
|-- weight_A × DV01_A = weight_B × DV01_B → weight_B = weight_A × (DV01_A / DV01_B)
|-- Notional_A / Notional_B = DV01_B / DV01_A (inverse: higher DV01 = less notional)
4. COMPUTE carry for the trade
|-- Carry = yield_long - yield_short - (repo_short - repo_long)
|-- If short leg on special in repo → higher borrow cost → lower net carry
|-- Daily carry in $: carry_bp × notional / 10000 / 365
5. SCENARIO P&L
|-- Curve ±25bp slope change: ΔP_curve = ±(Δslope × DV01 × duration_spread)
|-- Parallel ±25bp: net zero if duration-neutral (verify!)
|-- Roll-down: if curve is upward sloping, bonds gain as they age (positive roll-down)
Complete when: Duration-neutral weights computed [COMPUTED].
Carry $/day computed [COMPUTED]. Scenario P&L table: 3 curve + 3 parallel scenarios.
Phase 2: Credit Analysis
1. IDENTIFY the credit — single name or index
|-- Corporate bond: issuer, CUSIP, coupon, maturity, seniority (senior secured → subordinated)
|-- Credit index: CDX IG/HY, iTraxx, or ETF (LQD, HYG, JNK)
|-- Sovereign: country, bond, currency, seniority (local law vs foreign law)
2. ASSESS credit quality
|-- Rating: S&P, Moody's, Fitch. Note: rating agencies lag markets by 6-12 months
|-- CDS spread: 5-year CDS level and 1-month change [VERIFIED]
|-- Leverage: Debt/EBITDA, Interest Coverage (EBIT/Interest), Net Debt/EBITDA
|-- Liquidity: Cash + Revolver Availability / Near-Term Maturities
|-- Industry context: peer spread comparison, sector outlook
3. COMPUTE spread metrics
|-- OAS (option-adjusted spread) for bonds with embedded options
|-- Z-spread (zero-volatility spread) for bullet bonds
|-- CDS-bond basis: CDS spread - bond Z-spread
|-- Spread duration: contribution to portfolio spread risk
4. STRESS TEST
|-- Recession scenario: spreads widen to historical 90th percentile
|-- Downgrade scenario: spread impact of 1-2 notch downgrade
|-- Default scenario: recovery rate × notional in event of default
Complete when: Credit metrics compiled [VERIFIED for market data, AS OF for fundamentals].
Spread duration computed. Stress test scenarios P&L quantified.
Phase 3: Inflation-Linked Products
1. IDENTIFY the TIPS/TIPS-like instrument
|-- US TIPS: CUSIP, coupon, maturity, index ratio (accrued inflation adjustment)
|-- UK Index-Linked Gilts: similar, different inflation index (RPI vs CPI)
|-- Inflation swap: fixed leg vs floating (CPI) leg
2. PULL real yield and breakeven
|-- Real yield = quoted yield on TIPS [VERIFIED]
|-- Nominal yield = same-maturity Treasury yield [VERIFIED]
|-- Breakeven inflation = Nominal yield - Real yield [COMPUTED]
3. DECOMPOSE breakeven
|-- BE = Expected Inflation + Inflation Risk Premium - TIPS Liquidity Premium
|-- Expected inflation: survey (Michigan, SPF) or inflation swap market
|-- Inflation risk premium: typically +20-50bp (compensation for inflation uncertainty)
|-- TIPS liquidity premium: typically -10 to -30bp (TIPS less liquid than nominals)
4. COMPUTE real DV01 and inflation sensitivity
|-- Real DV01: sensitivity to real yield changes (same formula as nominal)
|-- Inflation DV01: sensitivity to breakeven changes (≈ real DV01 for most TIPS)
|-- Note: TIPS principal adjusts with CPI. Price = Real Price × Index Ratio
Complete when: Breakeven computed and decomposed [COMPUTED].
Real DV01 + Inflation DV01 computed. Index ratio verified from Treasury.gov.
Phase 4: Bond Futures
1. IDENTIFY the futures contract
|-- US: ZF (5yr), ZN (10yr), ZB (30yr), UB (ultra 30yr), TN (ultra 10yr), TWE (20yr)
|-- Euro: Bund (10yr), Bobl (5yr), Schatz (2yr), Buxl (30yr)
|-- UK: Long Gilt, Gilt futures
2. IDENTIFY the CTD (Cheapest-to-Deliver)
|-- CTD = bond from deliverable basket that minimizes: Futures_Price × CF - Bond_Price
|-- Conversion Factor (CF): adjusts for coupon differences. CF = 1.0 only for 6% coupon
|-- CTD changes when yields cross the 6% threshold (or contract's notional coupon for non-US)
3. COMPUTE futures DV01
|-- Futures_DV01 = CTD_DV01 / CTD_CF
|-- Note: CTD_DV01 changes as yields move (convexity)
|-- Each contract has a different notional: ZN = $100K face, ZB = $100K face
|-- BUT actual exposure = CTD's DV01 / CF per contract
4. COMPUTE hedge ratio
|-- HR = Portfolio_DV01 / Futures_DV01
|-- Round to nearest whole contract
|-- Monitor CTD changes: if CTD switches, hedge ratio changes 5-15%
Complete when: CTD identified [VERIFIED from CME/Eurex daily].
Futures DV01 computed [COMPUTED]. Hedge ratio computed and rounded.
Phase 5: Carry & Roll-Down
1. DECOMPOSE expected return
|-- Total Expected Return = Income Return + Roll-Down Return + Price Return
|-- Income Return = Coupon / Price (or Yield)
|-- Roll-Down Return = (Price at forward date assuming unchanged curve - Price today) / Price today
|-- Price Return = residual (curve moves, spread changes)
2. COMPUTE roll-down
|-- Identify the bond's maturity point on the yield curve
|-- Read the yield at that maturity AND at next-shorter maturity (6mo or 1yr ahead)
|-- Roll-Down ≈ Duration × (yield_current_maturity - yield_forward_maturity) × horizon
|-- Positive roll-down = curve is upward sloping (bond yields less as it ages)
3. COMPUTE net carry
|-- Gross Carry = Yield (or Yield + Roll-Down for total carry)
|-- Financing = Repo Rate (specific issue, not GC if on special)
|-- Net Carry = Gross Carry - Financing
|-- For futures: implied repo rate is built into futures price. No separate financing.
|-- For swaps/forwards: cost embedded in the forward pricing
4. BREAK-EVEN ANALYSIS
|-- How much can yields rise before carry is wiped out?
|-- Breakeven_yield_move = Annual_Net_Carry / Duration
|-- Breakeven_spread_move = Annual_Net_Carry / Spread_Duration
Complete when: Roll-down computed [COMPUTED]. Net carry computed [COMPUTED].
Breakeven yield and spread moves computed. State: is net carry positive or negative?
Decision Trees
Curve Trade Selection
┌──────────────────────┐
│ Curve trade desired │
└──────────┬───────────┘
│
┌──────────▼──────────┐
│ Current 2s10s slope │
└──────┬─────────┬───────┘
<50bp │50-150bp │ >150bp
(flat) │(normal) │(steep)
▼ ▼ ▼
┌──────────┐ ┌──────┐ ┌──────────┐
│ STEEPENER │ │FLAT- │ │ FLATTENER│
│ Slope mean│ │TENER │ │ or carry │
│ reverts │ │if at │ │ negative │
│ up │ │highs │ │ costs too │
└──┬────────┘ └──┬───┘ │ much │
│ │ └──┬────────┘
▼ ▼ ▼
┌──────────┐ ┌──────────┐ ┌──────────────┐
│ EXECUTE │ │ CHECK │ │ DON'T flatten │
│ in futures│ │ carry: │ │ unless curve │
│ if liquid │ │ positive?│ │ >200bp AND │
└──────────┘ │ → trade │ │ you can fund │
│ negative │ │ the carry │
│ → wait │ └──────────────┘
└──────────┘
Duration Hedge Method Selection
┌──────────────────────┐
│ Need to hedge duration │
└──────────┬───────────┘
│
┌──────────▼──────────┐
│ Holding period? │
└──────┬─────────┬───────┘
< 1 wk │1wk-3mo │ > 3mo
│ │ │
▼ ▼ ▼
┌──────────┐ ┌──────┐ ┌──────────────┐
│ Futures │ │Futures│ │ Cash Treasury │
│ or ETFs │ │or ETFs│ │ or receive- │
│ (liquid, │ │check │ │ fixed swap │
│ cheap) │ │roll │ │ (precise mat- │
└──────────┘ │cost │ │ ch, no roll) │
│ │ └──────────────┘
▼ ▼
┌──────────────┐
│ LIQUID futures│
│ roll cost < │
│ 2bp/quarter? │
└──┬────────┬──┘
Yes No
│ │
▼ ▼
┌──────────┐ ┌──────────┐
│ USE │ │ USE swaps│
│ futures │ │ or cash │
└──────────┘ └──────────┘
Credit: Long or Pass?
┌──────────────────────┐
│ Corporate bond spread │
└──────────┬───────────┘
│
┌──────────▼──────────┐
│ Spread vs 5yr range? │
└──────┬─────────┬───────┘
>80th │20th-80th│ <20th
%ile │%ile │ %ile
(wide) │(normal) │(tight)
▼ ▼ ▼
┌──────────┐ ┌──────┐ ┌──────────┐
│ LONG │ │PASS │ │ SHORT or │
│ Spread │ │unless│ │ under- │
│ compression│ │catalyst│ │ weight │
│+ carry │ │ │ │ Tight │
└──┬────────┘ └──────┘ │ spreads │
│ │ only widen │
▼ └──────────┘
┌──────────────┐
│ VERIFY: │
│ Leverage < 4×?│
│ No downgrade │
│ catalyst <3mo?│
│ CDS basis OK? │
└──┬────────┬───┘
All pass Any fail
│ │
▼ ▼
┌──────────┐ ┌──────────┐
│ SIZE FULL│ │ SIZE ½ or│
│ position │ │ PASS │
└──────────┘ └──────────┘
Gotchas
| Gotcha | Cost | Fix |
|---|
| Hedging a corporate bond portfolio with Treasury futures — the hedge removes duration risk but leaves credit spread risk. In a risk-off event, Treasuries rally (duration hedge makes money) AND credit spreads widen (corporates lose money). The net P&L = spread widening - Treasury rally = unknown. You haven't hedged; you've swapped one risk for another | $500K-$2M in "hedged" portfolio losses during credit events. A $50M IG portfolio hedged with Treasuries: during 2008, corporates widened 200bp ($10M loss) while equivalent-duration Treasuries rallied 150bp ($7.5M gain). Net: -$2.5M. Not hedged at all | Separate duration hedge from credit hedge. Duration: Treasury futures. Credit: CDS index (CDX IG/HY) or short credit ETFs. Or: accept that a corporate bond = Treasury + credit spread and price both. Don't confuse the two hedges |
| Computing DV01 for a TIPS bond using nominal yield — TIPS real yield and nominal yield have different volatilities and correlations to rates. TIPS DV01 based on nominal yield overstates rate sensitivity by 20-40% because real yields are less volatile than nominals | $200K-$500K in hedge ratio errors for TIPS portfolios. A $25M TIPS portfolio hedged with nominal DV01: the hedge overcompensates because nominal yields move more than real yields. Net result: the "hedged" portfolio is net short duration | Compute DV01 using the bond's OWN yield — real yield for TIPS, nominal for nominals. For cross-hedging TIPS with nominal futures, use beta-adjustment: regression(tips_real_yield_change ~ nominal_yield_change) ≈ 0.6-0.8. Scale hedge ratio by beta |
| Using generic GC repo rate for carry when the specific bond is on special — on-the-run Treasuries and high-demand issues often trade 50-300bp BELOW GC in repo. If you're short that bond, your borrow cost is GC - special_spread = much more expensive than GC | $50K-$300K/year per $50M short position. Shorting the on-the-run 10yr when it's 200bp special: your borrowing cost is -200bp vs what you assumed = -$100K/year on $50M notional. The carry you thought was +$250K is actually +$150K | Check the specific bond's repo rate, not GC. Bloomberg: CT or repo screen. Ask your repo desk for the specific issue. If the bond is on special, find an off-the-run alternative with similar duration — off-the-runs rarely trade special |
| Comparing corporate bond yields without tenor adjustment — comparing a 7-year BBB bond yielding 5.2% to a 5-year BBB yielding 5.0% is meaningless. The 5.2% includes a term premium for 2 years of additional duration. The correct comparison is spread to the same-maturity Treasury: 7yr Treasury = 4.0%, spread = 120bp. 5yr Treasury = 3.8%, spread = 120bp. They're the same | $100K-$1M in mispricing on relative value trades. A trader buys the 7yr thinking it's "cheaper" based on raw yield but the spread is identical. The yield advantage is entirely term premium, not credit cheapness |
Proactive Triggers
| # | Trigger | Auto-Response |
|---|
| P1 | yield_curve.inversion_depth > -50bp AND inversion_duration > 30_days | [ALERT] Persistent curve inversion >50bp for >30 days. Historically precedes recession with 12-18 month lag. Duration: underweight credit, overweight duration |
| P2 | corporate_spread < 90 AND corporate_spread < 5yr_10th_percentile | [WARN] IG spreads at extreme tights (<90bp, <10th percentile). Asymmetric risk: downside (widen to 150bp = -60bp × duration loss) vs upside (tighten to 70bp = +20bp gain). Risk/reward ratio > 3:1 against |
| P3 | CTD_bond != previous_CTD AND futures_position_open == True | [URGENT] CTD switch detected. Hedge ratio changes 5-15%. Recompute futures DV01 with new CTD and adjust hedge |
| P4 | bond.special_spread > 50bp AND position.direction == SHORT AND position.holding_period > 7_days | [WARN] Short position borrowing cost $X/day above GC. Special repo bleeds carry. Find off-the-run alternative or close |
| P5 | tips_breakeven < 1.5% AND tips_breakeven < 5yr_1st_percentile | [INFO] TIPS breakeven at extreme lows. Market pricing near-zero inflation for next 5-10 years. Real yield likely attractive for long-term inflation hedgers |
| P6 | credit_spread_change_1d > 20bp AND position_credit_exposure > 0 | [ALERT] Credit spread spike >20bp in one day. Check for issuer-specific event or sector-wide repricing. Tighten stop-losses |
| P7 | curve_slope_change_1m > 30bp AND curve_trade_active == True | [INFO] Curve slope moved 30bp in 1 month — near 2σ event. Curve trade likely at or near profit target. Consider taking profits |
Cross-Skill Coordination
Upstream
| Upstream Skill | What You Receive | Trigger | Your Response |
|---|
macro-strategist | Rate forecasts, inflation outlook, recession probability, fiscal trajectory, global macro regime | PUSH: Rate regime change (cutting/hiking cycle shift). PUSH: Inflation regime change | Rate regime change → reposition duration: long duration for cutting cycle, short for hiking. Inflation change → adjust TIPS vs nominal allocation |
quantitative-analyst | Yield curve models (Nelson-Siegel, arbitrage-free), volatility surface, correlation matrices, VaR decomposition | PUSH: Volatility regime change. PUSH: Curve model parameter shift | Vol spike → reduce curve trade size (vol expands P&L range). Curve parameter change → reassess steepener/flattener thesis |
forex-trader | Cross-currency basis, forward points, FX volatility, central bank divergence analysis | PUSH: Cross-currency basis widening. PUSH: Central bank divergence signal | Basis widening → FX-hedged yields change. Recompute hedged yields for global FI allocation. CB divergence → reposition yield curve exposure by country |
market-data-engineer | Real-time Treasury yields, swap rates, corporate bond pricing, repo rates, futures data | PULL: requestTreasuryYields for specific tenors. PULL: requestRepoRate for specific bond | Yield update → recompute DV01 and scenario P&L. Repo update → recompute carry |
Downstream
| Downstream Skill | What You Send | Trigger | Expected Response |
|---|
portfolio-signal-manager | Duration exposure, credit beta, convexity profile, key rate durations, carry/roll-down projection | PUSH: Duration target change. PUSH: Credit overweight/underweight signal | Integrates FI positioning with equity, FX, commodity allocations. Ensures total portfolio duration is at target |
futures-trader | Treasury futures hedge requirements: contract, quantity, CTD, conversion factor | PUSH: Duration hedge needed. PUSH: CTD switch alert | Executes futures hedge per spec. Reports fill price, effective DV01, roll schedule |
treasury-manager | Cash management: excess cash deployment, duration matching, counterparty limits, collateral optimization | PUSH: Short-duration investment options. PUSH: Repo market dislocation alert | Deploys cash into recommended short-term FI instruments per liquidity requirements |
Error Recovery
| Symptom | Root Cause | Fix | Lesson |
|---|
| Bond position shows unexpected large loss despite small yield move — e.g., yield up 5bp but bond down 1.5% vs expected -0.35% | The bond is callable and trading above par. Modified duration assumes no call, but the call option gains value as yields rise (making the bond call LESS likely). Effective duration incorporates the changing call probability. At 102 with a call at 100 in 1 year, a +5bp move can drop the price 1.5% because the call probability shifts | Use effective duration, not modified duration, for callable bonds. For bonds near the call strike, duration can be 3-5× the modified duration. OAS models incorporate the call option properly. Never use YTM-based duration for bonds trading above the call price | Callable bonds near the call have massive negative convexity. As yields rise, the call goes out of the money and the bond behaves more like a bullet — but the transition creates amplified price moves. The "duration" you computed from YTM is wrong near the call |
| Curve trade P&L doesn't match expectations — flattener lost money despite 2s10s going from +60 to +40 (curve flattened by 20bp) | The flattener used the on-the-run 2yr and 10yr, but the curve BETWEEN 2yr and 10yr didn't flatten evenly. The 5yr richened (yield dropped 10bp more than the curve) → the 2s5s10s butterfly moved against you. Your 2s10s was actually a bet on the 2s5s10s curvature | Decompose curve P&L: attribution across each key rate. The 2s10s move was +20bp flatter, but 5yr rallied 30bp → the 2s5s10s butterfly contributed -X bp. Run key rate attribution before concluding the trade "should have" made money | A 2s10s trade is exposed to every maturity between 2 and 10. The curve doesn't move as a uniform shape. Key rate attribution tells you WHERE the P&L came from. If the 5yr moved unexpectedly, your 2s10s bet had hidden butterfly exposure |
| Roll-down projection was positive but actual return negative — expected +50bp roll-down over 3 months, got -10bp | The yield curve shape changed during the holding period. Roll-down assumes the curve STAYS THE SAME while the bond ages. If the curve flattened by 25bp while you held, the roll-down gain (bond aging down a steep curve) was offset by the curve shape decline (entire curve shifted lower at the long end) | Roll-down is ONE component of expected return, NOT a guaranteed return. It's an ex-ante projection, not an ex-post promise. Always scenario-analyze roll-down: "if curve stays same → +X, if curve flattens 25bp → +Y, if curve steepens 25bp → +Z" | Roll-down is horizon return assuming the curve doesn't move. The curve ALWAYS moves. Roll-down must be combined with a curve view. Positive roll-down is a tailwind, not a guarantee. Size positions with the understanding that roll-down can be wiped out by curve moves |
What Good Looks Like
A high-quality fixed income analysis:
Bond: XYZ Corp 5.250% 02/15/2032 (CUSIP: XXXXXXXX)
Rating: Baa2/BBB [VERIFIED from Moody's/S&P as of analysis date]
Price: 98.50, Accrued: 0.875 → Dirty: 99.375
YTM: 5.45%, YTW: 5.45% (not callable until 02/15/2030 at 101) [COMPUTED]
Benchmark: UST 7yr (CT2, 4.00%) [VERIFIED from broker feed]
Z-spread: +145bp to Treasury curve [COMPUTED using zero curve]
Rate Risk:
Macaulay Duration: 6.8 years [COMPUTED]
Modified Duration: 6.48 [COMPUTED]
DV01: $638 per $1M face [COMPUTED: 6.48 × 0.9850 × $1M × 0.0001]
Convexity: 0.52 [COMPUTED]
Convexity cross-over: Duration-only price error exceeds 10% at ±58bp.
At ±100bp: Duration says ±6.48%, actual ±6.80% (convexity adds 32bp).
Credit Analysis:
5yr CDS: 110bp [VERIFIED]. CDS-bond basis: +35bp (bond wide to CDS)
Basis investigation: Bond is $15M issue size (small, illiquid).
Illiquidity premium explains ~25bp. Residual ~10bp = possible value. ⚠️
Scenario P&L (per $1M face):
| Scenario | Treasury Δ | Spread Δ | Rate P&L | Spread P&L | Total |
|----------|-----------|----------|----------|------------|-------|
| Base | 0bp | 0bp | $0 | $0 | $0 |
| Rally | -50bp | -10bp | +$3,190 | +$650 | +$3,840 |
| Sell-off | +50bp | +25bp | -$3,190 | -$1,620 | -$4,810 |
| Recession| -100bp | +100bp | +$6,380 | -$6,480 | -$100 |
Every metric tagged. P&L decomposed into rate and spread components. Convexity quantified. CDS basis investigated, not just quoted.
Verification Guardrails
Deliberate Practice
Exercise 1: DV01 Computation (5 min)
A bond has Macaulay duration 8.2 years, YTM 4.50%, price 101.25. Compute modified duration, DV01 per $1M face, and dollar price change for +25bp parallel shift including convexity (convexity = 0.85).
Exercise 2: Duration-Neutral Weights (5 min)
Bond A: DV01 = $750 per $1M. Bond B: DV01 = $1,250 per $1M. Construct a $10M duration-neutral steepener (long A, short B). What are the notional amounts? Compute daily carry if A yields 4.25% and B yields 5.00%, and both finance at 4.75%.
Exercise 3: TIPS Breakeven Decomposition (5 min)
10yr nominal = 4.00%, 10yr TIPS = 1.80%. Compute breakeven. If inflation expectations = 2.20%, inflation risk premium = +30bp, what's the implied TIPS liquidity premium? Is TIPS rich or cheap relative to your decomposition?
Exercise 4: CDS Basis Analysis (5 min)
Bond Z-spread = 180bp. 5yr CDS = 150bp. Basis = +30bp. Propose 3 possible explanations. For each: is the bond a buy, sell, or pass? What would change your mind?
Exercise 5: Futures Hedge Ratio (5 min)
Portfolio DV01 = $45,000. CTD of ZN futures (10yr): DV01 = $78 per $100K, conversion factor = 0.85. Compute number of ZN contracts to hedge. If CTD switches and new CF = 0.92, how many contracts to adjust?
References
- treasury-yield-curves.md — Treasury curve construction, key rates, on-the-run vs off-the-run, STRIPS
- duration-convexity-formulas.md — All duration types: formulas, use cases, DV01, convexity, key rate duration
- credit-analysis-framework.md — Corporate credit: IG/HY, CDS, recovery rates, CDS-bond basis, rating migration
- tips-inflation-products.md — TIPS mechanics, breakeven decomposition, real yield curve, inflation derivatives
- bond-futures-reference.md — Contract specs, deliverable baskets, conversion factors, CTD analysis, hedge ratios
- repo-and-financing.md — GC repo, special repo, fails, tri-party, sponsored repo, implied repo in futures
- carry-rolldown-strategies.md — Carry decomposition, roll-down computation, break-even, horizon returns
- global-rates-linkages.md — Cross-currency basis, hedged yield computation, global FI allocation, central bank divergence
- error-recovery.md — Error recovery: duration type confusion, CTD switch, special repo, basis investigation, key rate attribution