社区微信群开通啦,扫一扫抢先加入社区官方微信群
社区微信群
一、EWMA模型
指数移动平均(Exponential Moving Average, EMA或EWMA)是以指数式递减加权的移动平均。各数值的加权而随时间而指数式递减,越近期的数据加权越重,但较旧的数据也给予一定的加权。加权的程度以常数λ决定,λ数值介乎0至1。该模型认为第n天的波动率与n-1天的波动率和收益率有关系:
【案例】我们依旧使用上证指数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()
#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)
二、ARCH模型
定义σn是在第n-1个交易日估计资产在第n个交易日的波动率,那么可以根据最近m个交易日的收益率进行无偏估计:
其中,μ为日对数日收益率的平均值。下面做如下变化:
①将μn-i换成百分比收益率;
②将m-1换成m;
③假设μ=0。
这些变化对结果影响不大,上式可以简化为
也就是说每一天的波动率的平方具有等权重1/m,由于是估计当前的波动率,距离近的数据应该赋予更高权重,则模型可以更改为
αi是第i天的收益率平方的系数,取正值且i越小值越大,权重之和为1。进一步推广,假定存在一个长期的方差率VL,且对应的权重为γ,上式就变为
令ω=γVL,上式可以改写为
以上就是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()
可以得到以下表达式:
archmodel.plot()
#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)
三、GARCH模型
GARCH(1,1)模型是ARCH(1)和EWMA模型的结合,其中α+β+γ=1:
α+β表示均值复归的速度,当γ越大或α+β越小时,均值复归的速度越快。在实际操作中,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()
可以得到以下表达式:
garchmodel.plot()
#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)
最后,我们绘制出三种预测模型的对比图:
#画出预测的三种模型对比的波动率预测图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()
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!