Calculation catalog › Ladders and valuation

Ladder rung coupon rate pct

Annual real coupon rate of a modeled ladder rung.

Field: couponRatePct Unit: percent Basis: no dollar basis Computed by: Engine Status: Complete chain

Appears in: income-floor (coupon rate)

Calculation records

  • Synthetic TIPS rung: floored coupon and par-curve price Formula record, justified by derivation

    Purpose: What one ladder rung costs today: its annual real coupons and principal discounted on the curve, with the coupon set to the yield at maturity floored at 0.125%.

    Statement: For a rung of real face F maturing n whole years out, the coupon rate is c = max(0.125%, y(n)), where y(n) is the interpolated par real yield at n years. The price is the sum over k = 1..n of (F·c/100 + [k = n]·F)/(1 + y(k)/100)^k: each end-of-year cash flow discounted at the interpolated par yield for its own year treated as a spot rate. On a flat curve with a nonbinding floor c = y and the price equals F. Units: real (today's) dollars; percent inputs are divided by 100. Domain: F >= 0, integer n >= 1, y(k) > -100%. Rounding: none.

    Formula: c = max(0.125, y(n)); P = sum_{k=1..n} (F c/100 + [k = n] F) / (1 + y(k)/100)^k

    • F: Real face (principal) of the rung (unit: usd) (domain: F >= 0)
    • n: Maturity offset from the anchor year (unit: years) (domain: integer n >= 1)
    • y(k): Interpolated par real yield at k years (unit: percent/year) (domain: y(k) > -100)
    • c: Annual coupon rate of the synthetic rung (unit: percent/year) (domain: c >= 0.125)
    • P: Real purchase price of the rung (unit: usd) (domain: P >= 0)

    Timing: end of year, annual coupons, principal with the last coupon

    Rounding: none

    Limits:

    • Coupons pay annually; real-world semiannual TIPS timing is ignored (ladderMath.ts header)
    • Par yields are used as spot rates for discounting; no zero curve is bootstrapped (ladderMath.ts header)
    • The 0.125% floor is the regulatory minimum TIPS coupon; a curve yield below it prices the rung above par
    • No CUSIP-level lot rounding in core mode: face is continuous at $1 granularity (ladderMath.ts header)
    • tipsCouponRatePct and priceRung are module-private; the evidence reaches them through buildLadder with a one-rung ladder whose target is F(1 + c), which the back-substitution solves to face F exactly

    Provenance: derived by codex, implemented by claude-subagent.

    Independent review: cursor

    Gates (6 of 6 pass): fixture registers a test: pass; pins resolve: pass; families exist: pass; worksheet exists: pass; mutation receipt exists: pass; provenance independent: pass

    Worksheet: ladder-annual-coupon-par-pricing.md Mutation receipt: ladder-annual-coupon-par-pricing.mutation.md

    Evidence tests: ladderMath.evidence.test.ts

    Implemented in: ladderMath.ts

    Is the number of: ladder-rung-cost, ladder-rung-coupon-rate-pct

    Feeds: ladder-build-total-cost

Records that feed this number

  • Par real yield at a maturity: linear interpolation with flat endpoints Formula record, justified by derivation

    Purpose: The real yield the ladder engine reads off the TIPS curve at any maturity.

    Statement: Given a curve of (maturity m_i years, par real yield y_i percent) points sorted ascending and a finite maturity m, the yield is y_first when m <= m_first, y_last when m >= m_last, and otherwise y_i + (m - m_i)(y_{i+1} - y_i)/(m_{i+1} - m_i) on the first segment with m <= m_{i+1}. An empty curve yields 0. Units: percent per year, real. Rounding: none; the production function returns a binary float.

    Formula: y(m) = y_i + (m - m_i)(y_{i+1} - y_i)/(m_{i+1} - m_i) for m_i <= m <= m_{i+1}; y(m) = y_first for m <= m_first; y(m) = y_last for m >= m_last

    • m: Maturity, years from the anchor year (unit: years) (domain: finite m)
    • m_i: Maturity of curve point i (unit: years) (domain: strictly ascending in i)
    • y_i: Par real yield at curve point i (unit: percent/year) (domain: y_i > -100)
    • y(m): Interpolated par real yield at m (unit: percent/year) (domain: between the yields of the bracketing points)

    Timing: annual maturities; time-invariant lookup on one dated curve

    Rounding: none

    Limits:

    • Endpoints are held flat, never extrapolated: a maturity beyond the last point reads the last yield, and one before the first point reads the first
    • The curve must already be sorted ascending by maturity; the function neither sorts nor validates it
    • An empty curve returns 0% rather than refusing
    • Every caller consumes the interpolated par yield as a spot rate (the par-as-spot planning approximation documented in the ladderMath.ts header)

    Provenance: derived by codex, implemented by claude-subagent.

    Independent review: cursor

    Gates (6 of 6 pass): fixture registers a test: pass; pins resolve: pass; families exist: pass; worksheet exists: pass; mutation receipt exists: pass; provenance independent: pass

    Worksheet: ladder-real-yield-interpolation.md Mutation receipt: ladder-real-yield-interpolation.mutation.md

    Evidence tests: ladderMath.evidence.test.ts

    Implemented in: ladderMath.ts

    Feeds: income-floor-ladder-yield-pct, ladder-rung-coupon-rate-pct, funded-ratio-result-essential-spending-pv, funded-ratio-result-guaranteed-income-pv, funded-ratio-result-funded-ratio-pct, funded-ratio-result-unfunded-pv

  • Embedded Treasury par real-yield curve, 2026-06-30 Data record, justified by dataset

    Purpose: The offline TIPS real-yield snapshot every ladder quote and funded ratio discounts on.

    Statement: Five par real yields in percent per year at 5, 7, 10, 20 and 30 years, dated 2026-06-30, taken from the U.S. Treasury Daily Par Real Yield Curve and stored as {asOfIso, source, points[]} sorted ascending by maturity. Consumers interpolate linearly between points and hold the endpoints flat (ladder-real-yield-interpolation). The stored row is the official 2026-06-30 row exactly as Treasury publishes it: 1.93, 2.06, 2.20, 2.54 and 2.73. Rounding: none; the yields keep the hundredth of a percent Treasury publishes.

    Limits:

    • Stored exactly as published, with no rounding to the nearest 5 basis points (decision D-TREASURY, 2026-09-25). Until 2026-09-27 the stored row was 1.85/2.05/2.25/2.55/2.70, which the worksheet showed was neither the official row nor its nearest 5 basis points: 8 basis points below the official row at 5 years, 1 below at 7, 5 above at 10, 1 above at 20 and 3 below at 30. Every ladder quote and funded ratio priced on the curve moved with the correction
    • Maturities below 5 years read the 5-year yield and above 30 years the 30-year yield (flat endpoints)
    • Par yields are consumed as spot rates by every ladder and funded-ratio calculation
    • Refresh cadence is annual with the published parameters; the opt-in FedInvest fetch never replaces this snapshot

    Dataset: U.S. Department of the Treasury, Daily Treasury Par Real Yield Curve Rates, row dated 06/30/2026 (5, 7, 10, 20 and 30 year columns) , as of 2026-06-30 , retrieved 2026-09-27

    Provenance: derived by claude, implemented by claude-subagent.

    Independent review: codex

    Gates (6 of 6 pass): fixture registers a test: pass; pins resolve: pass; families exist: pass; worksheet exists: pass; mutation receipt exists: pass; provenance independent: pass

    Worksheet: treasury-real-yield-curve-2026.md Mutation receipt: treasury-real-yield-curve-2026.mutation.md

    Evidence tests: realYieldCurve2026.evidence.test.ts

    Implemented in: realYieldCurve2026.ts

    Feeds: income-floor-ladder-yield-pct, ladder-rung-cost, ladder-rung-coupon-rate-pct, ladder-build-total-cost, funded-ratio-result-essential-spending-pv, funded-ratio-result-guaranteed-income-pv, funded-ratio-result-funded-ratio-pct, funded-ratio-result-unfunded-pv

Engine source: engine/src/ladder/ladderMath.ts (LadderRung.couponRatePct)

The evidence links on this page (each record's worksheet, mutation receipt, evidence tests and implementation, and the source links) are pinned to engine commit 2624dbdba9fd, committed 2026-10-11. The live calculation index and output-family census links point at the repository's main branch, so you can check this snapshot against them.