使用 QuantLib 的首期票息较短的加拿大债券的现金流量错误
Error with cashflows of Canadian bonds that have a short first coupon using 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
,天数为 act/act,提取其优惠券并丢弃第一张和赎回,如 rest = bond2.cashflows()[1:-1]
;
将优惠券放在一起并构建最终债券作为通用 Bond
class 的实例,如:
bond = ql.Bond(settlement_days, calendar, issue_date, [first]+rest)
(债券构造函数将重新添加赎回)
当然,如果你发现自己经常这样做,你可以写一个函数来做那个。 (或者,如果您愿意更改底层 C++ 库,您可以创建一个特定的绑定 subclass 并将其导出到 Python。)
我正在创建加拿大固定利率债券对象,并注意到对于首付息票较短的债券,如果使用 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
,天数为 act/act,提取其优惠券并丢弃第一张和赎回,如rest = bond2.cashflows()[1:-1]
;将优惠券放在一起并构建最终债券作为通用
Bond
class 的实例,如:bond = ql.Bond(settlement_days, calendar, issue_date, [first]+rest)
(债券构造函数将重新添加赎回)
当然,如果你发现自己经常这样做,你可以写一个函数来做那个。 (或者,如果您愿意更改底层 C++ 库,您可以创建一个特定的绑定 subclass 并将其导出到 Python。)