Python 用ARIMA、GARCH模型预测分析股票市场收益率时间序列(中):https://developer.aliyun.com/article/1490525
我们绘制模型残差。
SPY最佳模型残差 ARMA(4, 4)
ACF 和 PACF 没有显示出显着的自相关。QQ 和概率图显示残差近似正态并带有重尾。然而,这个模型的残差看起来不像白噪声,可以看到模型未捕获的明显条件异方差(_条件波动性_)的突出显示区域。
自回归综合移动平均模型 - ARIMA(p, d, q)
ARIMA是ARMA模型类别的自然延伸。如前所述,我们的许多TS并不是平稳的,但是它们可以通过差分而成为平稳的。我们看到了一个例子,当我们采取Guassian随机游走的第一次差分,并证明它等于白噪声。换句话说,我们采取了非平稳的随机行走,并通过第一次差分将其转变为平稳的白噪声。
不用太深入地研究这个方程,只要知道 "d "是指我们对序列进行差分的次数。顺便提一下,在Python中,如果我们需要对一个序列进行多次差分,我们必须使用np.diff()函数。pandas函数DataFrame.diff()/Series.diff()只处理数据帧/序列的第一次差分,没有实现TSA中需要的递归差分。
在下面的例子中,我们通过(p, d, q)订单的非显著数量的组合进行迭代,以找到适合SPY收益的最佳ARIMA模型。我们使用AIC来评估每个模型。最低的AIC获胜。
# 将ARIMA(p, d, q)模型适用于SPY收益 # 根据AIC选择最佳阶数和最终模型 for i in prng: for d in rng: for j in prng: try: tp_dl = ARIMAfit(lrs, orer=(i,d,j)) if tpaic < betaic: bestic = tmp_ic bes_orer = (i, d, j) bestl = tpmdl # ARIMA模型的残差图 plot(resid, lags=30)
最好的模型的差值为 0 也就不足为奇了。回想一下,我们已经用对数价格的第一个差值来计算股票收益。下面,我绘制了模型残差。结果与我们上面拟合的 ARMA(4, 4) 模型基本相同。显然,这个 ARIMA 模型也没有解释序列中的条件波动!
拟合SPY收益的 ARIMA 模型
现在我们至少积累了足够的知识来对未来的收益进行简单的预测。这里我们使用我们模型的predict() 方法。作为参数,要预测的时间步数需要一个整数,alpha 参数需要一个小数来指定置信区间。默认设置为 95% 置信度。对于 99%,设置 alpha 等于 0.01。
# 创建一个具有95%、99%CI的21天SPY收益预测 n_steps = 21 fc9 =atFae(ncolmack(\[c99\]) inx=clus=\['wr\_ci99', upr\_ci_99') fc_ll.head(
# 绘制21天的SPY收益预测图 ilc\[-500:\].cpy() # 在样本预测中 prdct(side\[0\], t.id\[-1\]) plt(ax=x, stye=styes)
21 天SPY收益预测 - ARIMA(4,0,4)
自回归条件异方差模型 - ARCH(p)
ARCH(p) 模型可以简单地认为是应用于时间序列方差的 AR(p) 模型。另一种思考方式是,我们的时间序列 _在时间 t_的方差取决于对先前时期方差的过去观察。
ARCH(1) 模型公式
假设系列的均值为零,我们可以将模型表示为:
零均值的 ARCH(1) 模型
# 模拟ARCH(1)序列 # Var(yt) = a\_0 + a\_1\*y{t-1}\*\*2 # 如果a_1在0和1之间,那么yt就是白噪声 Y = np.epy_lik for t in rng(ln()): Y\[t\] = w\[t * sqrt((a0 + a1\*y\[t-1\*\*2) # 模拟的ARCH(1)序列,看起来像白噪声 plot(Y, lags=30)
模拟ARCH(1)过程
模拟ARCH(1)**2 过程
请注意 ACF 和 PACF 似乎在滞后 1 处显示显着性,表明方差的 AR(1) 模型可能是合适的。
广义自回归条件异方差模型 - GARCH(p,q)
简单地说,GARCH(p, q) 是一个应用于时间序列方差的 ARMA 模型,即它有一个自回归项和一个移动平均项。AR(p) 对残差的方差(平方误差)或简单地对我们的时间序列平方进行建模。MA(q) 部分对过程的方差进行建模。基本的 GARCH(1, 1) 公式是:
GARCH(1, 1) 公式
Omega (w) 是白噪声,alpha 和 beta 是模型的参数。此外 alpha\_1 + beta\_1 必须小于 1,否则模型不稳定。我们可以在下面模拟一个 GARCH(1, 1) 过程。
# 模拟一个GARCH(1, 1)过程 n = 10000 w = rnom.ral(sze=n) eps = np.er_ike(w) gsq =pzslie(w) for i in rne1, n): sis\[i\] = a+ a1*(eps\[i-1\]\*\*2) + b1\*siq\[i-1\] es\[i\] = w\[i\] * srt(sisq\[i\])
模拟 GARCH(1, 1) 过程
再次注意到,总体上这个过程与白噪声非常相似,然而当我们查看平方的eps序列时,请看一下。
模拟 GARCH(1, 1) 过程平方
显然存在着自相关,ACF和PACF的滞后期的重要性表明我们的模型需要AR和MA。让我们看看我们是否能用GARCH(1, 1)模型恢复我们的过程参数。这里我们使用ARCH包中的arch_model函数。
# 将GARCH(1, 1)模型与我们模拟的EPS序列相匹配 # 我们使用arch函数 am = arch(ps) fit(dae_freq=5) summary())
GARCH 模型拟合摘要
现在让我们运行一个使用 SPY 收益的示例。过程如下:
- 迭代 ARIMA(p, d, q) 模型的组合来拟合我们的时间序列。
- 根据 AIC 最低的 ARIMA 模型选择 GARCH 模型阶数。
- 将 GARCH(p, q) 模型拟合到我们的时间序列。
- 检查模型残差和残差平方的自相关
另请注意,我选择了一个特定的时间段来更好地突出关键点。然而,根据研究的时间段,结果会有所不同。
for i in pq_g: for d in d_ng: for j in p_ng: try: tpml = ARIMA(T,order(i,d,j).fi if tmp\_aic < best\_aic: best_ic =mpac best_oder = (i, d, j) best\_ml =tm\_ml # 注意我已经选择了一个特定的时间段来运行这个分析 bstmoel(TS)
拟合SPY收益的 ARIMA(3,0,2) 模型的残差
看起来像白噪声。
拟合SPY收益的 ARIMA(3,0,2) 模型的平方残差
平方残差显示自相关。让我们拟合一个 GARCH 模型。
# 现在我们可以使用最适合的arima模型参数来拟合arch模型 p_ = bst_dr o= st_orde q = bst_er # 使用学生T分布通常能提供更好的拟合 arcd(TS, p=p_, o=o_, q=q_, 'StdensT') fit(uat_eq=5, sp='ff') summary
GARCH(3, 2) 模型拟合SPY收益
在处理非常小的数字时,会出现收敛警告。在必要时,将数字乘以10倍的系数以扩大幅度,可以起到帮助作用,但是对于这个演示来说,没有必要这样做。下面是模型的残差。
拟合SPY收益的 GARCH(3, 2) 模型残差
上面看起来像白噪声。现在让我们查看平方残差的 ACF 和 PACF。
我们已经实现了良好的模型拟合,因为平方残差没有明显的自相关。