Summary
QLNet supports callable fixed-rate bonds and amortizing fixed-rate bonds, but not a bond that is both callable and amortizing/sinkable.
This becomes a problem for municipal bonds with a sinking fund schedule, because a bullet callable model does not correctly represent:
- outstanding notional at each call date
- price/yield to call
- duration to call / duration to maturity
- effective duration / OAS duration
Problem
CallableFixedRateBond assumes a single notional / bullet redemption structure.
For sinkable callable bonds, principal declines over time according to a sinking fund schedule, so callable analytics should be based on the outstanding principal at each exercise date.
Today this requires downstream custom code.
Proposed enhancement
Add first-class support for callable amortizing fixed-rate bonds in QLNet.
Possible shape:
- a new CallableAmortizingFixedRateBond
- or an extension of the existing callable bond path to accept a notional schedule
The implementation should support:
- deterministic coupon cash flows on an amortizing notional schedule
- principal/redemption cash flows from the sink schedule
- call exercise amounts based on outstanding notional at each call date
- correct behavior for yieldToCalls, priceToCalls, yieldAt, priceAt, and durationAt
- compatibility with callable tree pricing (TreeCallableFixedRateBondEngine)
Acceptance criteria
- callable amortizing/sinkable fixed-rate bonds can be modeled directly in QLNet
- call analytics respect the sinking principal schedule
- tree pricing works with the amortizing callable structure
- regression tests cover both bullet callable and sinkable callable cases
Summary
QLNet supports callable fixed-rate bonds and amortizing fixed-rate bonds, but not a bond that is both callable and amortizing/sinkable.
This becomes a problem for municipal bonds with a sinking fund schedule, because a bullet callable model does not correctly represent:
Problem
CallableFixedRateBond assumes a single notional / bullet redemption structure.
For sinkable callable bonds, principal declines over time according to a sinking fund schedule, so callable analytics should be based on the outstanding principal at each exercise date.
Today this requires downstream custom code.
Proposed enhancement
Add first-class support for callable amortizing fixed-rate bonds in QLNet.
Possible shape:
The implementation should support:
Acceptance criteria