第三章条件异方差模型(实践)

参考:https://uqer.datayes.com/v3/community/share/57aac592228e5b9b95a88999

1.1ARCH模型建立

上证指数,2019-01-01到2020-01-01

data = jd.get_price(security='000001.XSHG', start_date='2019-01-01', 
                    end_date='2020-01-01', frequency='1d',
                    fields=None, skip_paused=False, fq='pre', count=None)
close = data['close'].pct_change().dropna().reset_index(drop=True)*100

#%%
close.plot(grid=True)

#自相关图
plot_acf(close,lags=100)

'''
相关性不高,在零附近波动
'''

#首先检验平稳性。 原假设H0:序列为非平稳的,备择假设H1:序列是平稳的
print(u'序列的ADF检验结果为:', ADF(close))

'''
序列的ADF检验结果为: (-15.286791022026991, 4.499488334247949e-28, 0, 242, {'1%': -3.457664132155201, '5%': -2.8735585105960224, '10%': -2.5731749894132916}, 713.2075484860529)
p-value几近为0,序列是平稳的
'''
#白噪声检验,返回统计量和p值
print(u'序列的白噪声检验结果为:', acorr_ljungbox(close,lags=1))
'''
序列的白噪声检验结果为: (array([0.04328089]), array([0.83519726]))
p-value远大于0.05,序列是白噪声,需要差分
'''
#白噪声检验,返回统计量和p值
print(u'1阶差分序列的白噪声检验结果为:', acorr_ljungbox(close.diff().dropna(),lags=1))
'''
1阶差分序列的白噪声检验结果为: (array([56.31087706]), array([6.18722028e-14]))
'''
#建立ARIMA(p,1,q)模型。AR模型,PACF p阶截尾。
plot_pacf(close.diff().dropna(),lags=20)
#建立ARIMA(p,1,q)模型。MA模型,ACF p阶截尾
plot_acf(close.diff().dropna(),lags=20)
'''
1阶差分后的偏自相关显示9阶截尾,自相关图显示出1阶截尾,
所以考虑MA(1)模型,AR(9)模型进行拟合1阶差分后的序列,
即对原序列建立ARIMA(9,1,1)模型
'''

#建立ARIMA(9, 1, 1)模型
order = (9,1,1)
model = ARIMA(close.reset_index(drop=True),order).fit() 
#画出残差及残差的平方
at = close.reset_index(drop=True) -  model.fittedvalues
at2 = np.square(at)
plt.figure(figsize=(10,6))
plt.subplot(211)
plt.plot(at,label = 'at')
plt.legend()
plt.subplot(212)
plt.plot(at2,label='at^2')
plt.legend(loc=0)

#白噪声检验,返回统计量和p值
print(u'序列的白噪声检验结果为:', acorr_ljungbox(at2.dropna(),lags=1))
'''
序列的白噪声检验结果为: (array([23.99753185]), array([9.64592734e-07]))
p-value小于显著性水平0.05,我们拒绝原假设,即认为序列不是白噪声。因此具有ARCH效应。
'''

 1.2ARCH模型的建立 

#ARCH模型的阶次,可以用{a2t}序列的偏自相关函数PACF来确定
plot_pacf(at2.dropna(),lags = 30)

#根据之前的分析,可以粗略选择均值模型为AR(9)模型,波动率模型选择ARCH(4)模型
import arch
train = close[:-10]
test = close[-10:]
am = arch.arch_model(train,mean='AR',lags=9,vol='ARCH',p=4) 
res = am.fit()

#%%
res.params

 

1.3ARCH模型的预测

#整体的预测拟合情况:
res.hedgehog_plot()
'''
效果很差
'''

#最后10个数据的预测情况
pre = res.forecast(horizon=10,start=232).variance.iloc[232]
plt.figure(figsize=(10,4))
plt.plot(test.values,label='realValue')
pre.plot(label='predictValue')
plt.plot(np.zeros(10),label='zero')
plt.legend(loc=0)
'''
问题很大,1:数值差距很大
'''

2.1GARCH模型建立

#GARCH(m,s)的定阶较难,一般使用低阶模型如GARCH(1,1),GARCH(2,1),GARCH(1,2)
train_02 = close[:-10]
test_02 = close[-10:]
am_02 = arch.arch_model(train_02,mean='AR',lags=9,vol='GARCH') 
res_02 = am_02.fit()
res_02.summary()

res_02.params

    波动率模型:  \large \sigma _{t}^{2}=0.000943+0.023958\alpha _{t-1}^{2}+0.969456\sigma _{t-1}^{2}

#整体的预测拟合情况:
res_02.hedgehog_plot()
'''
搞不懂
'''

2.2波动率预测

波动率模型:  \large \sigma _{t}^{2}=0.000943+0.023958\alpha _{t-1}^{2}+0.969456\sigma _{t-1}^{2}

模型:

\large r_{t}=0.0497+0.043894a_{t-1}+0.020373a_{t-2}+0.120424a_{t-3}-0.023295a_{t-4} -0.071718a_{t-5} -0.077225a_{t-6} +0.094623a_{t-7}+ 0.014020a_{t-8}+ 0.073740a_{t-9}

 

 

 

  • 0
    点赞
  • 28
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值