garch预测 python_EWMA,ARCH与GARCH模型 - Go语言中文社区

garch预测 python_EWMA,ARCH与GARCH模型


一、EWMA模型

指数移动平均(Exponential Moving Average, EMA或EWMA)是以指数式递减加权的移动平均。各数值的加权而随时间而指数式递减,越近期的数据加权越重,但较旧的数据也给予一定的加权。加权的程度以常数λ决定,λ数值介乎0至1。该模型认为第n天的波动率与n-1天的波动率和收益率有关系:

6ff87c52a81b83648bec00d772a9ac66.png

f1d0add33e15200ac63307d53b574035.png

【案例】我们依旧使用上证指数2015.1.1-2020.3.31日的收盘价数据;根据前一天的波动率和收益率数据来预测下一天的波动率。使用2015.1.1-2019.21.31的数据,在后续每天收益率变动的情况下,一步一步滚动预测2020.1.1-2020.3.31的波动率。

import numpy as npimport pandas as pdimport matplotlib.pyplot as pltfrom pylab import mplmpl.rcParams['font.sans-serif']=['SimHei']mpl.rcParams['axes.unicode_minus']=FalseSH=pd.read_excel('D:/欧晨的金学智库/风险管理基础/上证指数.xlsx','Sheet1',header=0,index_col=0)SH.describe()SH_log=np.log(SH/SH.shift(1))  #得到上证指数的2015~2020.3.31日收益率SH_log=SH_log.dropna()#绘制上证指数收盘价及对数收益率plt.subplot(211)plt.plot(SH, label=u'上证指数收盘价')plt.legend(loc='best')plt.subplot(212)plt.plot(SH_log, label=u'上证指数收盘价收益率')plt.legend(loc='best')plt.show()

9c68bb03a6829a81049fe0c292c16166.png

#EWMA,λ=0.94u60=SH_log[-59:]  #2019.12.31-2020.3.31对数收益率vol_ewma=np.zeros(58)vol_ewma[0]=np.array(SH_log)[:-58].std() #2019.12.31日之前的数据计算波动率作为2019.12.31日波动率for i in range(57):    vol_ewma[i+1]=np.sqrt(0.06*np.array(u60)[i]**2+0.94*vol_ewma[i]**2)  #λ=0.94print('ewma方法预测2020.1.1-2020.3.31波动率','n',vol_ewma)

b1c08b1b8221913d014ea8e9f6930f76.png

二、ARCH模型

    定义σn是在第n-1个交易日估计资产在第n个交易日的波动率,那么可以根据最近m个交易日的收益率进行无偏估计:

4c019fcfa55266f0492e8a0b3e243b0f.png

其中,μ为日对数日收益率的平均值。下面做如下变化:

①将μn-i换成百分比收益率;

②将m-1换成m;

③假设μ=0。

这些变化对结果影响不大,上式可以简化为

e26a3b3726f45043a5a923f20b31b6a5.png

也就是说每一天的波动率的平方具有等权重1/m,由于是估计当前的波动率,距离近的数据应该赋予更高权重,则模型可以更改为

72d2874af3479d6bb8d589ba0e717209.png

αi是第i天的收益率平方的系数,取正值且i越小值越大,权重之和为1。进一步推广,假定存在一个长期的方差率VL,且对应的权重为γ,上式就变为

61f764c493738be42075b867dbc8af94.png

令ω=γVL,上式可以改写为

e1b7aa110a2932b11e7c05b2b3edb725.png

以上就是ARCH(m)模型。

同样采用上述案例,我们用PYTHON进行计算:

conda install -c bashtage arch  #安装ARCH,GARCH时间序列库,如已安装跳过(注释掉)该步骤from arch import arch_model#建立ARCH(1)模型arch=arch_model(y=SH_log,mean='Constant',lags=0,vol='ARCH',p=1,o=0,q=0,dist='normal')#vol参数可选波动率模型的类型,除了ARCH、GARCH外还有EGARCH、FIARCH、HARCH等archmodel=arch.fit()archmodel.summary()

528ec495b03cf353ef177c9374ec55ca.png

可以得到以下表达式:

f6d587305b369f4832d6cebcaa15a784.png

archmodel.plot()

34719e73f393f698213556aa9b3c0f40.png

#ARCH(1)vol_arch=np.zeros(58)u60=SH_log[-59:]  #2019.12.31-2020.3.31对数收益率vol_arch[0]=np.sqrt(0.0000895+0.4*-np.array(u60)[-59]**2)  #以2019.12.31对数收益率为基数往后1天,1天预测波动率for i in range(57):    vol_arch[i+1]=np.sqrt(0.00013894+0.4*np.array(u60)[i]**2)print('ARCH方法预测2020.1.1-2020.3.31波动率','n',vol_arch)

694b98648cfd86b909a62aef142f3c72.png

三、GARCH模型

    GARCH(1,1)模型是ARCH(1)和EWMA模型的结合,其中α+β+γ=1:

2c1255970c441ff003cd585a0df3388c.png

α+β表示均值复归的速度,当γ越大或α+β越小时,均值复归的速度越快。在实际操作中,GARCH(1,1)模型的预测效果较好。

同样采用上述案例,我们用PYTHON进行计算:

#建立GARCH(1,1)模型garch=arch_model(y=SH_log,mean='Constant',lags=0,vol='GARCH',p=1,o=0,q=1,dist='normal')garchmodel=garch.fit()garchmodel.summary()

1f3d56884fd16cd68603f08850673282.png

可以得到以下表达式:

cd28e509fb076a72e61e8d3e4f1bdcc6.png

garchmodel.plot()

f74fa948de9deabc4e18ef4d6987ad5f.png

#GARCH(1,1)vol_garch=np.zeros(58)vol_garch[0]=np.array(SH_log)[:-58].std() #2019.12.31日之前的数据计算波动率作为2019.12.31日波动率for i in range(57):    vol_garch[i+1]=np.sqrt(0.0000046316+0.1*np.array(u60)[i]**2+0.88*vol_garch[i]**2)print('GARCH方法预测2020.1.1-2020.3.31波动率','n',vol_garch)

4d9492eb01da350fdc63e205052886cc.png

最后,我们绘制出三种预测模型的对比图:

#画出预测的三种模型对比的波动率预测图plt.figure(figsize=(15,5))plt.plot(SH_log[-58:].index,vol_arch,label='ARCH(1)')plt.plot(SH_log[-58:].index,vol_garch,label='GARCH(1,1)')plt.plot(SH_log[-58:].index,vol_ewma,label='EWMA')  plt.xticks(rotation=30)plt.legend()plt.grid()

f96914accce9dfdd81d415597522f7f4.png

版权声明:本文来源CSDN,感谢博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。
原文链接:https://blog.csdn.net/weixin_39637589/article/details/111624869
站方申明:本站部分内容来自社区用户分享,若涉及侵权,请联系站方删除。
  • 发表于 2021-06-13 21:24:51
  • 阅读 ( 288 )
  • 分类:

0 条评论

请先 登录 后评论

官方社群

GO教程

猜你喜欢