第三章條件異方差模型(實踐)

參考: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}

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章