Modeling a Missing Final Coupon in QuantLib Bond Schedules
Summary
The note explains how to represent a bond whose final coupon date precedes maturity using QuantLib’s standard schedule and bond construction. Its workaround is to create the regular schedule, provide a coupon-rate entry for every period, and set the final rate to zero. This preserves the bond’s maturity and accrual structure while making the last scheduled payment have no coupon amount.
The answer says the approach gives the correct price and can also be applied to floating-rate bonds by setting the final gearing to zero. Its limitation is that the cash-flow list still contains a zero-coupon payment, which may be inelegant for downstream processing. The author suggests filtering out null cash flows in client code, or subclassing the bond class to remove the coupon. No worked pricing comparison or broader treatment of irregular schedules is provided.
Key ideas
- Keep the regular schedule and specify a zero rate for the missing final coupon period.
- The zero-coupon entry preserves the bond structure while producing the intended price.
- Client code can filter null cash flows if they are inconvenient.
- A similar cancellation can be made for a floating coupon by using zero gearing.
Tags
Full text
# novice question on fixed coupon schedule in QuantLib
# novice question on fixed coupon schedule in QuantLib
For some bonds I work with the last coupon date is not equal to bond's maturity date. E.g. the last coupon date is April 25th, 2020 and maturity date is April 25th, 2021. I looked at Schedule class and MakeSchedule() and I don't see a clear way to reflect this. I feel it can't be that hard, though. Would appreciate if someone gives me a hint. Thank you!
## Answer by Luigi Ballabio (score 2)
https://quant.stackexchange.com/a/11110
You can obtain the desired effect by tweaking the bond construction.
For instance, let's say you're creating a 4-years bond with semiannual coupons paying 3%, but missing the last. This makes for 7 coupons. Instead, you'll create the schedule as usual (so you have 8 periods), but specify a null last coupon when creating the bond. So:
```
Schedule schedule = ...; // as for a "normal" bond;
std::vector<Rate> coupons(8, 0.03); // 8 coupons...
coupons.back() = 0.0; // but the last one pays 0%.
FixedRateBond bond(settlementDays, faceAmount,
schedule, coupon,
accrualDayCounter);
```
This will give you the correct price; the disadvantage is that you'll have a coupon paying 0%, which is less clean than having just the ones that actually exist. If this turns out to be a problem, you can inherit from `FixedRateCouponBond` and delete the coupon in the constructor. But I would guess it's way easier to just filter out null cash flows in your client code.
You can use the same trick for most kinds of bond; e.g., for floating-rate bonds you can cancel the last coupon by passing a null gearing.Shown in full with attribution under the source's licence. Licence: CC BY-SA 4.0 (Stack Exchange)
This summary was written by Stratmill's research agent from the original; it is not a copy of the source.