对衍生产品定价和风险管理中,常常需要对衍生产品的波动率进行预测,这就需要使用到波动率模型。常见的波动率模型有两个,一个是自回归条件异方差模型ARCH,另一个是广义自回归条件异方差模型GARCH。这两个模型的数学公式有点多,但如果只是跑代码的话就没那么麻烦,本次仅介绍这两个模型在python中的应用。
我们希望根据2016-2018年的沪深300指数的涨跌幅构建波动率模型,步骤如下:
(1)利用Tushare获取沪深300指数的数据
因不知道沪深300指数的代码,所以先做了个查询

import tushare as ts
ts.set_token('b497571a3ddd7dde8ebe28b372879594b2f8356c918ad80dae01605b')
pro=ts.pro_api()
index=pro.index_basic()
index

garch模型代码python garch模型python步骤_tushare


由此拿到了所有指数的信息,从这些信息中,我们找到沪深300指数的相关信息:

index.loc[index.name=='沪深300']

结果显示如下:

garch模型代码python garch模型python步骤_garch模型代码python_02


知道沪深300指数的代码为000300.SH后,再次调用接口:

data=pro.index_daily(ts_code='000300.SH',start_date='20160101',end_date='20181231')
data['new']=data['pct_chg']/100
data

garch模型代码python garch模型python步骤_方差_03


这里的pct_chg就是每天的涨跌幅度,但因做了百分比处理,所以将这列数据再除以100,以恢复成原始数据。

拿到数据后,开始建立模型,首先是arch:

import arch
model=arch.arch_model(data.new,mean='Constant',lags=0,vol='ARCH',p=1,o=0,q=0,dist='normal')
result=model.fit()
result.summary()

这里需要用到arch模块中的arch_model函数,其中的mean参数表示平均方差是一个常数,lags表示滞后项阶数,vol是波动率模型的类型,p为对称随机数的滞后项阶数,o为非对称随机数的滞后项阶数,q为波动率的滞后项阶数,dist表示误差项服从的分布类型。

于是可以看到结果:

garch模型代码python garch模型python步骤_garch模型代码python_04

下面那个omega和alpha是我们关心的模型中的系数。p值也还可以。
接着再来构建Garch模型,过程与arch几乎一样,就是函数的参数小小调整了一下:

model1=arch.arch_model(data.pct_chg,mean='Constant',lags=0,vol='GARCH',p=1,o=0,q=1,dist='normal')
result1=model1.fit()
result1.summary()

garch模型代码python garch模型python步骤_python_05


这个结果是有了,看上去也能通过检验,但后面就发现不合理了。

试着求一下长期波动率:

import numpy as np
vol=np.sqrt(result1.params[1]/(1-result1.params[2]-result1.params[3]))
vol

这个结果是:
0.9240148943742655,太惊人了,感觉问题很大,但不知道是哪有问题。
最后将结果进行可视化:

result.plot()

garch模型代码python garch模型python步骤_tushare_06

result1.plot()

garch模型代码python garch模型python步骤_tushare_07


感觉这个过程少了些什么,自回归条件异方差的阶数没有做自相关图来确定最佳阶数,还有什么呢?反正结果不好看。