使用QuantLib的首张息票较短的加拿大债券的现金流错误



我正在创建加拿大固定利率债券对象,注意到对于第一张息票较短的债券,如果使用ActualActual(ActualActual.Bond)日计数器,第一个现金流是错误的,但对于其余的现金流是正确的。这是因为对于短存根,加拿大债券使用Actual365Fixed(Actual365Fixed.Canadian)日计数器计算应计利息。问题是,加拿大债券只在短期内使用这种方式。因此,使用Actual365Fixed(Actual365Fixed.Canadian)日计数器的剩余现金流将是不正确的。

有没有一个我不知道的日计数器可以解释这一点?这是一种半年度债券,发行日期为2020年4月3日,到期日为2025年9月1日。

CashFlows with ActualActual(ActualActual.Bond) day counter: 
[(Date(1,9,2020), 0.20516304347826253),
(Date(1,3,2021), 0.24999999999999467),
(Date(1,9,2021), 0.24999999999999467),
(Date(1,3,2022), 0.24999999999999467),
(Date(1,9,2022), 0.24999999999999467),
(Date(1,3,2023), 0.24999999999999467),
(Date(1,9,2023), 0.24999999999999467),
(Date(1,3,2024), 0.24999999999999467),
(Date(1,9,2024), 0.24999999999999467),
(Date(1,3,2025), 0.24999999999999467),
(Date(1,9,2025), 0.24999999999999467),
(Date(1,9,2025), 100.0)]
Cashflows with Actual365Fixed(Actual365Fixed.Canadian) day counter:
[(Date(1,9,2020), 0.20684931506849136),
(Date(1,3,2021), 0.24794520547946064),
(Date(1,9,2021), 0.24999999999999467),
(Date(1,3,2022), 0.24794520547946064),
(Date(1,9,2022), 0.24999999999999467),
(Date(1,3,2023), 0.24794520547946064),
(Date(1,9,2023), 0.24999999999999467),
(Date(1,3,2024), 0.24999999999999467),
(Date(1,9,2024), 0.24999999999999467),
(Date(1,3,2025), 0.24794520547946064),
(Date(1,9,2025), 0.24999999999999467),
(Date(1,9,2025), 100.0)]
Actual cashflows of a Canadian Fixed bond with a short first stub:
[(Date(1,9,2020), 0.20684931506849136),
(Date(1,3,2021), 0.24999999999999467),
(Date(1,9,2021), 0.24999999999999467),
(Date(1,3,2022), 0.24999999999999467),
(Date(1,9,2022), 0.24999999999999467),
(Date(1,3,2023), 0.24999999999999467),
(Date(1,9,2023), 0.24999999999999467),
(Date(1,3,2024), 0.24999999999999467),
(Date(1,9,2024), 0.24999999999999467),
(Date(1,3,2025), 0.24999999999999467),
(Date(1,9,2025), 0.24999999999999467),
(Date(1,9,2025), 100.0)]

没有一个单日计数器可以做到这一点,但您可以通过一些工作建立正确的联系。你要做的是:

  • 用act/365加拿大天数建立债券bond1,提取其优惠券并保留第一张,如first = bond1.cashflows()[0]

  • 建立具有行动/行动日计数的债券bond2,提取其优惠券并丢弃第一张和赎回,如rest = bond2.cashflows()[1:-1]所示;

  • 将优惠券放在一起,并构建作为通用Bond类实例的最终债券,如所示

    bond = ql.Bond(settlement_days, calendar, issue_date, [first]+rest)
    

    (赎回将由债券建设者重新添加(。

当然,如果你发现自己经常这样做,你可以写一个函数来做到这一点。(或者,如果您对更改底层C++库感到满意,可以创建一个特定的bond子类并将其导出到Python。(

我这样做的方法是定义一个新的天数约定,称之为"actacticma_stub365f";因为没有更好的名字。

该约定的行为方式与";actacticma";除非周期是stub,在这种情况下,它分支到加拿大act365f模式。

最新更新