量化庫

關於債券定價中計日問題的問題

  • August 19, 2020

在確定實際的優惠券付款時,我無法理解如何QuantLib管理計日問題。以下是我的固定利率債券 -

import QuantLib as ql
import pandas as pd

todaysDate = ql.Date(1, 9, 2019)
ql.Settings.instance().evaluationDate = todaysDate

spotDates = [todaysDate, todaysDate + ql.Period("1y"), todaysDate + ql.Period("2y"), todaysDate + ql.Period("3y")]
spotRates = [0, 0.066682, 0.067199, 0.067502]

dayCount = ql.ActualActual()
calendar = ql.Canada()
interpolation = ql.Linear()
compounding = ql.Compounded
compoundingFrequency = ql.Continuous

spotCurve = ql.ZeroCurve(spotDates, spotRates, dayCount, calendar, interpolation, compounding, compoundingFrequency)
spotCurveHandle = ql.YieldTermStructureHandle(spotCurve)

issueDate = todaysDate
maturityDate = todaysDate + ql.Period("2y")
tenor = ql.Period(ql.Annual)
bussinessConvention = ql.Following
dateGeneration = ql.DateGeneration.Backward
monthEnd = False

schedule = ql.Schedule(issueDate, maturityDate, tenor, calendar, bussinessConvention, bussinessConvention, dateGeneration, monthEnd)

couponRate = 0.09
coupons = [couponRate]

settlementDays = 3
faceValue = 100
fixedRateBond = ql.FixedRateBond(settlementDays, faceValue, schedule, coupons, dayCount)

bondEngine = ql.DiscountingBondEngine(spotCurveHandle)
fixedRateBond.setPricingEngine(bondEngine)

fixedRateBond.NPV()

現在,我想看看QuantLib正在考慮的實際 CF

for cf in fixedRateBond.cashflows():
   print(cf.date().ISO(), cf.amount())

這給出了 -

2020-09-01 8.958904109589039
2021-09-01 8.991780821917805
2021-09-01 100.0

但我的問題是如何計算第 2 個數字。按照Actual-Actual慣例,第一個數字不應該是:

>>> 9 * dayCount.yearFraction(issueDate + ql.Period("1d"),issueDate + ql.Period("1y"))
8.983561643835616

對於第二次利息支付

>>> 9 * dayCount.yearFraction(issueDate + ql.Period("1y") + ql.Period("1d"),issueDate + ql.Period("2y"))
8.967190657983382

你能幫我理解計算嗎 - 我在這裡遺漏了什麼?

您用作 issueDate (01-09-2019) 的日期是星期日,因為您使用的是加拿大日曆,所以 9 月 2 日是假期(勞動節),所以第一個日期實際上是 03-09-2019 .

檢查時間表的日期:

for dt in schedule:
   print(dt)

2019 年

9 月 3 日 2020 年

9 月 1 日 2021年 9 月 1 日

請注意,在建構時間表時,某些日期可能會根據日曆和慣例進行調整,因此如果您想檢查第一個優惠券是如何確定的,您應該實際使用:

dayCount.yearFraction(schedule[0], schedule[1]) * couponRate * 100

這給了你:

8.95890410958904

另外,請注意這Date + Period不是一個好主意,因為它會“盲目地”為日期添加句點,結果可能不是工作日。使用calendar.advance(Date, Period)會更好

引用自:https://quant.stackexchange.com/questions/57343