【问题标题】:Error with cashflows of Canadian bonds that have a short first coupon using QuantLib使用 QuantLib 的加拿大债券的现金流出现错误
【发布时间】:2020-07-14 17:12:01
【问题描述】:

我正在创建加拿大固定利率债券对象,并注意到对于具有短期首息的债券,如果使用 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)]

【问题讨论】:

  • 请从intro tour 重复[关于主题](stackoverflow.com/help/on-topic) 和[如何提问](stackoverflow.com/help/how-to-ask)。如果我了解这个的一般流程,您希望我们阅读您的代码的非现场(不可接受)图像(不可接受),了解您需要的计日概念,并推荐一个非现场包(离题)这将解决您的问题。相反,请解释您遇到的功能问题;确保您的请求符合主题。 “是否有包/功能可以做到这一点?”这里是题外话。
  • 图片链接出现在问题中的唯一原因是,这是作为新用户上传的唯一方式,它们已被删除。至于其余的,我不是在寻找场外包裹,而是在考虑加拿大债券短存根公约的天数对象。图片显示了使用两种不同的天数计算时现金流量的差异。

标签: python quantlib quantlib-swig


【解决方案1】:

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

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

  • 用行动/行动天数建立债券bond2,提取其优惠券并丢弃第一个和赎回,如rest = bond2.cashflows()[1:-1]

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

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

    (赎回将由 Bond 构造函数重新添加)。

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

【讨论】:

  • 谢谢Luigi,我非常感谢您快速而清晰的回复!我想创建一个日间计数器约定来解决加拿大债券约定,因为使用 Bond 类会丢失 FixedRateBond 类附带的许多功能(即周期性)。但是,我不想让它成为本地 C++ 分支。您愿意接受新的加拿大债券 ActualActual 公约吗?
  • 我是开放的,但我不确定这样的日间计数器是否能够区分短存根和普通优惠券。向 FixedRateBond 添加一个可选参数可能更容易,为第一张优惠券采用不同的日期计数器。
  • 谢谢!我同意,这是一个更优雅的解决方案。完成后将创建一个拉取请求。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-07-06
相关资源
最近更新 更多