您的位置:主页 > 新闻中心 > 行业资讯 >

「手把手教你」使用QuantLib举行债券估值和期权订价分析

行业资讯 / 2021-06-09 07:30

本文摘要:01 引言QuantLib是牢固收益和金融衍生品分析的一大利器,为量化金融建模提供了完整的分析框架,可是由于自己使用C++编写,通过SWING技术封装后在Python挪用,种种类(class)之间的挪用很是庞杂和繁琐,又很难检察其源代码,所以学习起来相对难题。民众号通过参考官方学习文档,分享QuantLib系列学习条记。

亚博APP安全有保障

01 引言QuantLib是牢固收益和金融衍生品分析的一大利器,为量化金融建模提供了完整的分析框架,可是由于自己使用C++编写,通过SWING技术封装后在Python挪用,种种类(class)之间的挪用很是庞杂和繁琐,又很难检察其源代码,所以学习起来相对难题。民众号通过参考官方学习文档,分享QuantLib系列学习条记。

《【手把手教你】牢固收益和衍生品分析利器QuantLib入门》主要先容了QuantLib入门的基础模块Dates日期和InterestRate利率类的基本观点和应用,本文在此基础上,简要先容QuantLib的金融工具和订价引擎(黑盒子的挪用方法),以牢固利率债券和普通期权为例,演示了如何使用QuantLib对金融工具举行订价分析。02 金融工具与订价引擎概览QuantLib是基于西欧成熟金融市场开发的大型金融产物订价分析框架,其涵盖的金融工具(Instruments)主要分为四类:牢固收益(Fixed Income)、期权(Option)、信贷(Credit)和通胀(Inflation)。每一个大类又包罗了多个金融工具或衍生品,好比牢固收益产物包罗远期(Forward)、债券(Bonds)和交换(Swaps)等。

QuantLib使用金融工具的英文全称来构建该金融工具的类(函数),好比远期利率交换,在QuantLib框架中使用ql.ForwardRateAgreement(参数)来挪用,详细参数设置可以参考:QuantLib金融工具链接地址(https://quantlib-python-docs.readthedocs.io/en/latest/instruments.html)。构建完金融合约(即Instruments)后,进入下一步的订价引擎(Pricing Engine),可以明白为使用哪个订价模型对该金融工具举行建模。

凭据金融工具的种别,订价引擎主要分为六大类,包罗:Bond Pricing Engines(债券订价)、Cap Pricing Engines(价钱上限订价法)、Swap Pricing Engines(交换订价法)、Swaption Pricing Engines(掉期期权订价法)、Credit Pricing Engines(信贷订价法)和Option Pricing Engines(期权订价法)。其挪用方法也是以金融工具的英文全称加参数,好比债券里最常用的贴现订价模型:ql.DiscountingBondEngine(discountCurve)。关于各个订价引擎的详细参数和挪用方式可以参照:订价引擎链接地址 (https://quantlib-python-docs.readthedocs.io/en/latest/pricing_engines.html)。03 金融工具订价应用实例实例1:牢固利率债券订价直接借用《QuantLib Python Cookbook》上的例子:假设有一种债券,票面价值为100,年息6%,于2015年1月15日刊行,2016年1月15日到期。

亚博APP安全有保障

该债券将于2015年7月15日和2016年1月15日支付息票。100的票面金额也会在2016年1月15日支付。为了简化问题,假设已经知道2015年1月15日美国国债的即期汇率,年化即期汇率为6个月0.5%,1年0.7%,盘算该债券的公允价值。凭据贴现公式直接使用Python举行盘算:importQuantLibasql#界说当前日期(本例子是2015年1月15日)todaysDate=ql.Date(15,1,2015)#将评估日设定为当前日期ql.Settings.instance().evaluationDate=todaysDate#即期利率对应日期spotDates=[ql.Date(15,1,2015),ql.Date(15,7,2015),ql.Date(15,1,2016)]#即期利率,初始设定为0spotRates=[0.0,0.005,0.007]#天数计数规则dayCount=ql.Thirty360()#例子是美国国债,因此设定为美国日历calendar=ql.UnitedStates()#插值方法为线性interpolation=ql.Linear()#计息方式为复利compounding=ql.Compounded#计息频率为年compoundingFrequency=ql.Annual#即期利率假设满足零息债券收益率曲线spotCurve=ql.ZeroCurve(spotDates,spotRates,dayCount,calendar,interpolation,compounding,compoundingFrequency)#利率的期限结构spotCurveHandle=ql.YieldTermStructureHandle(spotCurve)#输出效果:债券订价为:105.2765使用QuantLib的债券订价引擎盘算importQuantLibasql#界说当前日期(本例子是2015年1月15日)todaysDate=ql.Date(15,1,2015)#将评估日设定为当前日期ql.Settings.instance().evaluationDate=todaysDate#即期利率对应日期spotDates=[ql.Date(15,1,2015),ql.Date(15,7,2015),ql.Date(15,1,2016)]#即期利率,初始设定为0spotRates=[0.0,0.005,0.007]#天数计数规则dayCount=ql.Thirty360()#例子是美国国债,因此设定为美国日历calendar=ql.UnitedStates()#插值方法为线性interpolation=ql.Linear()#计息方式为复利compounding=ql.Compounded#计息频率为年compoundingFrequency=ql.Annual#即期利率假设满足零息债券收益率曲线spotCurve=ql.ZeroCurve(spotDates,spotRates,dayCount,calendar,interpolation,compounding,compoundingFrequency)#利率的期限结构spotCurveHandle=ql.YieldTermStructureHandle(spotCurve)上述操作建立了期限结构,接下来构建牢固利率债券。

#刊行日期issueDate=ql.Date(15,1,2015)#到期日期maturityDate=ql.Date(15,1,2016)#付息期限tenor=ql.Period(ql.Semiannual)#日历calendar=ql.UnitedStates()#遇到假期的调整情况bussinessConvention=ql.Unadjusted#日期的生陋习则(向后推)dateGeneration=ql.DateGeneration.Backward#是否月最后一日monthEnd=False#生成时间表schedule=ql.Schedule(issueDate,maturityDate,tenor,calendar,bussinessConvention,bussinessConvention,dateGeneration,monthEnd)print(list(schedule))[Date(15,1,2015),Date(15,7,2015),Date(15,1,2016)]#息票率dayCount=ql.Thirty360()couponRate=.06coupons=[couponRate]#构建牢固利率债券settlementDays=0faceValue=100fixedRateBond=ql.FixedRateBond(settlementDays,faceValue,schedule,coupons,dayCount)#以期限结构作为输入值,建立债券订价引擎#使用贴现模型举行估值bondEngine=ql.DiscountingBondEngine(spotCurveHandle)fixedRateBond.setPricingEngine(bondEngine)#债券估值print(f'牢固利率债券估值为:{fixedRateBond.NPV():.4f}')#输出效果:牢固利率债券估值为:105.2765得出的效果与使用Python直接套用公式盘算是一致的,但历程显着庞大许多,挪用了QuantLib的种种类(class),该历程可以作为其他牢固收益工具订价的参考模板。实例2:普通期权订价以一个欧式看涨期权为例,标的资产价钱为100,执行价钱假定为100,无风险利率为5%,颠簸率为0.20,估值日为2020年11月18日,到期日为2021年11月18日。使用Black-Scholes模型直接盘算模型公式为:其中,St、K、T、r、σ划分为标的资产价钱、执行价钱、期限、无风险利率和颠簸率。凭据上述公式和已知参数可以很容易盘算普通欧式期权的价钱。

#基于Black-Scholes公式的期权订价公式frommathimportlog,sqrt,expfromscipy.statsimportnormdefBSM(S0,E,T,r,sigma):d1=(log(S0/E)+(r+0.5*sigma**2)*T)/sigma/sqrt(T)d2=d1-sigma*sqrt(T)Callprice=S0*norm.cdf(d1)-E*exp(-r*T)*norm.cdf(d2)#Putprice=-S0*norm.cdf(-d1)+E*exp(-r*T)*norm.cdf(-d2)print("看涨期权价钱:%.4f"%Callprice)#print("看跌期权价钱:%.4f"%Putprice)#参数S0=100.0E=100.0T=1.0r=0.05sigma=0.20BSM(S0,E,T,r,sigma)看涨期权价钱:10.4506使用QuantLib举行盘算使用QuantLib举行盘算#设定全局估值日today=ql.Date(18,11,2020)ql.Settings.instance().evaluationDate=today#构建期权#普通看涨期权payoff=ql.PlainVanillaPayoff(ql.Option.Call,100.0)#到期日期europeanExercise=ql.EuropeanExercise(ql.Date(18,11,2021))option=ql.EuropeanOption(payoff,europeanExercise)#输入参数——标的资产价钱,无风险利率,标的资产颠簸率u=ql.SimpleQuote(100.0)#标的资产价值r=ql.SimpleQuote(0.05)#无风险利率sigma=ql.SimpleQuote(0.20)#颠簸率#假定无风险利率和颠簸率曲线是平的riskFreeCurve=ql.FlatForward(0,ql.TARGET(),ql.QuoteHandle(r),ql.Actual360())volatility=ql.BlackConstantVol(0,ql.TARGET(),ql.QuoteHandle(sigma),ql.Actual360())#初始化BS历程,并结构engineprocess=ql.BlackScholesProcess(ql.QuoteHandle(u),ql.YieldTermStructureHandle(riskFreeCurve),ql.BlackVolTermStructureHandle(volatility))engine=ql.AnalyticEuropeanEngine(process)#对期权设定该engineoption.setPricingEngine(engine)print(f'看涨期权的当前价值为:{option.NPV():.4f}')看涨期权的当前价值为:10.5395。获得的效果与上面直接使用BS公式盘算效果基本上一致,固然QuantLib的历程也是越发庞大和繁琐,而且无法看到背后盘算的逻辑(公式)。QuantLib构建完Instruments(这里是期权option)和设置订价引擎(Prcing Engines)后,除了可以获取价钱(NPV),另有许多扩展功效,包罗盘算期权的希腊字母(即期权价钱关于标的价钱、时间、颠簸率等的变化率权衡指标)。

#盘算期权的希腊字母print("%-12s:%4.4f"%("Delta",option.delta()))print("%-12s:%4.4f"%("Gamma",option.gamma()))print("%-12s:%4.4f"%("Theta",option.vega()))Delta:0.6377Gamma:0.0186Theta:37.7516如果对上面一些参数(如标的资产价值,无风险利率等)做出修改,engine会自动重新盘算期权的价值。#如果当前标的资产的价值为105#以看涨期权为例payoff=ql.PlainVanillaPayoff(ql.Option.Call,100.0)option=ql.EuropeanOption(payoff,europeanExercise)option.setPricingEngine(engine)u.setValue(105.0)print(f'看涨期权的当前价值为:{option.NPV():.4f}')看涨期权的当前价值为:13.9496#也可以同时改变多个参数u.setValue(98.0)r.setValue(0.04)sigma.setValue(0.25)print(f'看涨期权的当前价值为:{option.NPV():.4f}')看涨期权的当前价值为:10.7357importnumpyasnpimportmatplotlib.pyplotasplt%matplotlibinlineplt.style.use('ggplot')#正常显示绘图时泛起的中文和负号frompylabimportmplmpl.rcParams['font.sans-serif']=['SimHei']mpl.rcParams['axes.unicode_minus']=False#不停改变当前标的资产的价值,可以检察其对期权价值的影响f,ax=plt.subplots(figsize=(10,6))X=np.linspace(80.0,120.0,400)cv=[]foriinX:u.setValue(i)cv.append(option.NPV())ax.set_title('期权价值——标的资产价值')_=ax.plot(X,cv,linewidth=2)plt.show()#修改估值日期ql.Settings.instance().evaluationDate=ql.Date(18,6,2021)print(f'看涨期权的当前价值为:{option.NPV():.4f}')看涨期权的当前价值为:22.6307#差别估值日期对比y=[]foriinX:u.setValue(i)y.append(option.NPV())plt.figure(figsize=(10,6))plt.plot(X,y,'--',linewidth=2,color='b',label='估值日:2021.6.18')plt.plot(X,cv,linewidth=2,color='r',label='估值日:2020.11.18')plt.legend()plt.title('差别估值日下期权价值-标的资产价值',size=15)plt.show()图中显示,对于同一个到期日的欧式期权(2021年11月18日到期),站在202年6月18日举行估值,相比于2020年11月18日,期权价值是整体下降的。从上述分析可知,在盘算期权价钱时,直接使用BS公式可以简练的得出效果,而QuantLib的订价引擎就像个黑箱子,可是其扩展功效较多,可以通过改变订价方法、相关参数等快速对期权举行重新订价。

04 结语本文主要先容了QuantLib的金融工具和订价引擎的基本组成,同时以牢固利率债券和普通期权订价为例,为大家展示了如何使用QuantLib对金融工具举行订价,其他差别种类的金融工具的订价历程与此相似。QuantLib的整个订价历程看起来是很是繁琐和庞杂的,就像一个黑夹子,但仔细分析又是有迹可循的,其遵循的订价框架围绕金融工程的思想,通过构建金融工具或合约,选择某个订价引擎举行分析建模。QuantLib框架涵盖的内容实在太多,而可供参考的文档又很是有限,因此要深入的学习还是有一定难题的。这里再推荐一个由QuantLib作者Luigi Ballabio写的一本书 《Implementing QuantLib》。

参考资料:1. Luigi Ballabio and Goutham Balaraman,2017,《QuantLib Python Cookbook》.2. QuantLib官方网上英文教程:https://quantlib-python-docs.readthedocs.io/en/latest/index.html。


本文关键词:亚博APP安全有保障,「,手把手,教你,」,使用,QuantLib,举行,债券

本文来源:亚博APP安全有保障-www.cromocort.com