量化庫
關於債券定價中計日問題的問題
在確定實際的優惠券付款時,我無法理解如何
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
正在考慮的實際 CFfor 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)
會更好