-
Notifications
You must be signed in to change notification settings - Fork 34
Open
Description
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.
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
Reactions are currently unavailable
Metadata
Metadata
Assignees
Labels
No labels