从本篇开始计划开启一个系列,以《InterestRateRiskModeling》为蓝本,介绍有关利率风险的计算案例,内容涉及从简单的久期、凸性到主成分久期和久期向量模型等高阶的度量指标。
固息债的久期、凸性和BPS是最常见的利率风险度量指标,下面将以200205为例,计算2020-07-28这一天的价格,以及久期、凸性和BPS。
importQuantLibasqlimportprettytableaspttoday=ql.Date(28,ql.July,2020)ql.Settings.instance().evaluationDate=todaysettlementDays=1faceAmount=100.0settlementDays=1表示T+1结算,而估值日期就是2020-07-28这一天。
effectiveDate=ql.Date(10,ql.March,2020)terminationDate=ql.Date(10,ql.March,2030)tenor=ql.Period(1,ql.Years)calendar=ql.China(ql.China.IB)convention=ql.UnadjustedterminationDateConvention=conventionrule=ql.DateGeneration.BackwardendOfMonth=Falseschedule=ql.Schedule(effectiveDate,terminationDate,tenor,calendar,convention,terminationDateConvention,rule,endOfMonth)#forsinschedule:#print(s)coupons=ql.DoubleVector(1)coupons[0]=3.07/100.0accrualDayCounter=ql.ActualActual(ql.ActualActual.Bond,schedule)paymentConvention=ql.Unadjustedbond=ql.FixedRateBond(settlementDays,faceAmount,schedule,coupons,accrualDayCounter,paymentConvention)需要注意的是,日历采用中国的银行间市场,遇到假期不调整。
由于使用的是估值,也就是“到期利率”,这隐含要求于一个“水平”(flat)的期限结构,所以使用FlatForward类。对于水平的期限结构而言,远期利率、即期利率和到期利率三者相等。
DiscountingBondEngine是最常见的债券定价引擎,主要用于现金流的贴现计算。
bondYield=3.4124/100.0compounding=ql.Compoundedfrequency=ql.AnnualtermStructure=ql.YieldTermStructureHandle(ql.FlatForward(settlementDays,calendar,bondYield,accrualDayCounter,compounding,frequency))engine=ql.DiscountingBondEngine(termStructure)bond.setPricingEngine(engine)价格信息可以通过FixedRateBond的成员函数获得,而久期等指标的计算在BondFunctions的内部函数中实现(BondFunctions的内部函数也可以依据到期利率计算价格信息)。
BondFunctions的duration函数可以计算三种久期,分别是简单久期(Simple)、麦考利久期(Macaulay)和修正久期(Modified),只需配置久期类型参数即可,默认计算的是修正久期。
程序实现上,麦考利久期的计算依赖于修正久期。
所谓简单久期,即现金流的期限关于现金流贴现值的加权平均。如果计息方式是复利,简单久期等于麦考利久期。不过,如果是连续复利,计算麦考利久期将会报错,简单久期依然可以计算出来,更有普适性。连续复利的情况下,简单久期等于修正久期。