程式

使用 QuantLib Python 進行固定利率債券定價

  • August 13, 2021

我嘗試使用 Python QuantLib 為固定利率債券定價,並使用 DCF 模型驗證了我的答案。

以下是我使用 Python QuantLib 對固定利率債券進行定價的程式碼:

import QuantLib as ql

valuationDate = ql.Date(30, 6, 2020)
ql.Settings.instance().evaluationDate = valuationDate
compounding = ql.Compounded
calendar = ql.UnitedStates()
coupon = 0.05
couponFrequency = ql.Annual
issueDate = ql.Date(1, 1, 2016)
maturityDate = ql.Date(1, 1, 2024)
settlementDays = 2
settlementDate = calendar.advance(issueDate, ql.Period(settlementDays, ql.Days))
dayCount = ql.ActualActual(ql.ActualActual.ISMA)
schedule = ql.Schedule(issueDate, maturityDate, ql.Period(couponFrequency), calendar, ql.Unadjusted, ql.Unadjusted, ql.DateGeneration.Forward, True)
fixedRateBond = ql.FixedRateBond(settlementDays, 100, schedule, [coupon], ql.ActualActual(ql.ActualActual.ISMA))
curve = ql.ZeroCurve([ql.Date(1, 1, 2020), ql.Date(1, 1, 2027)], [0.01, 0.02], dayCount, calendar, ql.Linear(), compounding, couponFrequency)
handle = ql.YieldTermStructureHandle(curve)
bondEngine = ql.DiscountingBondEngine(handle)
fixedRateBond.setPricingEngine(bondEngine)
print('QuantLib NPV:', fixedRateBond.NPV())

使用 QuantLib 得到的 NPV 為:

QuantLib NPV:118.26526771080188

以下是我使用 DCF 模型對固定利率債券進行定價的程式碼:

DCFs = []

for i, cf in enumerate(fixedRateBond.cashflows()):
   if cf.date() >= valuationDate:
       discount_factor = curve.zeroRate(cf.date(), dayCount, compounding, couponFrequency).discountFactor(valuationDate, cf.date())
       DCFs.append(discount_factor * cf.amount())
       
print('DCF Model NPV:', sum(DCFs))

使用 DCF 模型得到的 NPV 為:

DCF 模型 NPV:114.13038560873856

有人可以解釋這種差異是如何產生的嗎?非常感謝。

從相對於估值日期 6 個月前的日期開始的零曲線會拋出債券。如果你從曲線開始valuationDate,你會得到相同的結果。

您還可以更簡潔地編寫 DCF 循環,如下所示:

DCFs = []

for i, cf in enumerate(fixedRateBond.cashflows()):
   if cf.date() >= valuationDate:
       discount_factor = curve.discount(cf.date())
       DCFs.append(discount_factor * cf.amount())
   
print('DCF Model NPV:', sum(DCFs))

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