I am trying to match the accrued interest, clean price, dirty price, and duration from the iBoxx underlying data. I've come close to perfectly matching their measurements but have run into an edge case where I'm not sure how best to approach it.
I have a bond issued on 2017-11-09 with an interest accrual start date on 2017-11-14 and maturity date of 2024-11-15. When I create the Schedule object as below:
# Create schedule
Schedule = ql.Schedule(StartDate,
MaturityDate,
ql.Period(CouponFrequency),
Calendar,
ql.Unadjusted,
ql.ModifiedFollowing,
ql.DateGeneration.Backward,
False)
I get the following output when I call
list(Schedule)
I get
[Date(14,11,2017), Date(15,11,2017), Date(15,5,2018), Date(15,11,2018), Date(15,5,2019), Date(15,11,2019), Date(15,5,2020), Date(15,11,2020), Date(15,5,2021), Date(15,11,2021), Date(15,5,2022), Date(15,11,2022), Date(15,5,2023), Date(15,11,2023), Date(15,5,2024), Date(15,11,2024)]
As you can see from the first two entries, we have the start date of interest accrual and then a coupon date the day after (on the semi-annual date associated with the maturity date).
My question is: should the interest accrual reset on 2017-11-15? For reference the cusip is 911312BL9. I found the following information through FactSet that the initial coupon date is in fact 2018-05-15. Therefore, it seems like the way I've constructed my Schedule is incorrect. However, I'm not sure how to adjust my Python code. The difference between my output and iBoxx disappears after 2018-05-15 indicating that they are properly accounting for the fact that interest accrual does not reset on 2017-11-15.