Ошибка с денежными потоками канадских облигаций с коротким первым купоном с использованием QuantLib - PullRequest
0 голосов
/ 14 июля 2020

Я создаю объекты канадских облигаций с фиксированной ставкой и заметил, что для облигаций с коротким первым купоном первый денежный поток неверен при использовании счетчика ActualActual(ActualActual.Bond) дней, но верен для остальных. Это связано с тем, что с короткой заглушкой канадские облигации рассчитываются с использованием счетчика Actual365Fixed(Actual365Fixed.Canadian) дней. Проблема в том, что канадские облигации используют это только для коротких купонных периодов. Следовательно, остальные денежные потоки будут неверными при использовании счетчика Actual365Fixed(Actual365Fixed.Canadian) дней.

Есть ли счетчик дней, который учитывает это, о котором я не знаю? Это полугодовая облигация с датой выпуска 3 апреля 2020 г. и погашением 1 сентября 2025 г.

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)]

1 Ответ

1 голос
/ 15 июля 2020

Не существует однодневного счетчика, который бы это делал, но вы можете построить правильную связь, немного поработав. Что вам нужно сделать, это:

  • создать облигацию bond1 со счетом act / 365 канадских дней, извлечь купоны и оставить первый, как в first = bond1.cashflows()[0];

  • создать облигацию bond2 с подсчетом дня действия / действия, извлечь купоны и отменить первый и погашение, как в rest = bond2.cashflows()[1:-1];

  • сложите купоны и создайте последнюю облигацию как экземпляр класса generi c Bond, например:

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

    (погашение будет повторно добавлено конструктором облигаций ).

Конечно, если вы обнаружите, что делаете это много раз, вы можете написать функцию для этого. (Или, если вам удобно изменять базовую библиотеку C ++, вы можете создать подкласс специфического c bond и экспортировать его в Python.)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...