book_irds3 icon indicating copy to clipboard operation
book_irds3 copied to clipboard

Erratum: Example 23.9: Calculating roll-down on par IRS

Open attack68 opened this issue 1 month ago • 0 comments

The error here regards the roll-down calculation of the 3M. When 0.70 O/N rate is held constant the compounded up 3M rate is not 0.75% but is closer to 0.7005%. This results in 10bps roll-down, not 5bps.

Image

And for what its worth you can replicate this numerically using rateslib

from rateslib import *

curve = Curve(
    nodes={
        dt(2025, 11, 4): 1.0,
        dt(2025, 11, 5): 1.0,
        dt(2026, 2, 6): 1.0,
        dt(2027, 8, 4): 1.0,
        dt(2027, 11, 9): 1.0,
    },
    calendar="nyc",
    convention="act360",
    id="v",
)

solver = Solver(
    curves=[curve],
    instruments=[
        IRS(dt(2025, 11, 4), "1b", spec="usd_irs", curves=curve),
        IRS(dt(2025, 11, 4), "3m", spec="usd_irs", curves=curve),
        IRS(dt(2025, 11, 4), "21m", spec="usd_irs", curves=curve),
        IRS(dt(2026, 2, 4), "21m", spec="usd_irs", curves=curve),
    ],
    s=[0.70, 0.80, 2.28, 2.45]
)

print(IRS(dt(2025, 11, 4), "2Y",spec="usd_irs", curves=curve).rate())
print(IRS(dt(2025, 11, 4), "2Y",spec="usd_irs", curves=curve.roll("3m")).rate())

##
<Dual: 2.241506, (v0, v1, v2, ...), [51.0, 0.0, -0.6, ...]>
<Dual: 2.079712, (v0, v1, v2, ...), [4670.7, -4670.8, -0.7, ...]>
##

The roll down is 16.2bps

attack68 avatar Nov 05 '25 05:11 attack68