import QuantLib as ql
faceAmount = 100.0
redemption = 100.0
issueDate = ql.Date(20, 2, 2017)
maturity = ql.Date(20, 2, 2047)
couponRate = 0.0377
coupons = [couponRate]
ytm = 0.04245
calendar = ql.China(ql.China.IB)
frequency = ql.Semiannual
compounce = ql.Compounded
dayCounter = ql.ActualActual(ql.ActualActual.ISMA)
accuracy=1.0e-8
maxNum = 500
today = calendar.adjust(ql.Date(14, 9, 2018))
ql.Settings.evaluationDate = today
settlementDays = 0
settlementDate = calendar.advance(
today,
ql.Period(settlementDays, ql.Days))
discountingTermStructure = ql.RelinkableYieldTermStructureHandle()
flatTermStructure = ql.FlatForward(settlementDate,
ytm,
dayCounter,
compounce,
frequency)
discountingTermStructure.linkTo(flatTermStructure)
bondEngin = ql.DiscountingBondEngine(discountingTermStructure)
schedule = ql.Schedule(issueDate,
maturity,
ql.Period(frequency),
ql.China(ql.China.IB),
ql.Following,
ql.Following,
ql.DateGeneration.Backward,
False)
fixedRateBond = ql.FixedRateBond(settlementDays,
faceAmount,
schedule,
coupons,
dayCounter,
ql.Following,
redemption,
issueDate)
fixedRateBond.setPricingEngine(bondEngin)
print(fixedRateBond.cleanPrice())
print(fixedRateBond.cleanPrice(0.04245,dayCounter,compounce,frequency,ql.Date(14,9,2018)))
print(fixedRateBond.dirtyPrice(0.04245,dayCounter,compounce,frequency))
print(fixedRateBond.bondYield(95,dayCounter,compounce,frequency,ql.Date(14,9,2018),accuracy,maxNum))
print(flatTermStructure.zeroRate(ql.Date(14,9,2018),dayCounter,compounce, frequency).rate())
输出结果为:
92.25734945596061
92.19752850225078
92.45364263268556
0.04068211793899536
0.0424500000008563
1、两种pricevalue的计算结果不一样的原因是?
2、NPV和cleanprice的区别是什么?计算结果也不相同。
你好,我也是第一次注意到这个细节。
请查看链接:https://www.quantlib.org/reference/class_quant_lib_1_1_bond.html#a04c101af83206923fd686044725444a7
注意这一段话:the theoretical price calculated from a flat term structure might differ slightly from the price calculated from the corresponding yield by means of the other overload of this function. If the price from a constant yield is desired, it is advisable to use such other overload.
如果用到期收益率的话,建议使用另一个重载,也就是有参数的那个。
查看源代码可以看出,cleanPrice()
和 NPV()
将计算委托给定价引擎,而 cleanPrice(...)
将计算委托给 BondFunctions::cleanPrice(...)
,背后是两种不同的计算体系,cleanPrice()
和 NPV()
将计算委托给定价引擎的具体实现也有不同,这造成了三种不同的价格。计算应该以 cleanPrice(...)
的结果为准。