程式
使用 QuantLib Python 進行固定利率債券定價
我嘗試使用 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))