我们可以通过以下几种方式进行预测:
- 通过直接使用
predict()
功能和
- 通过使用定义AR(p)过程和学习到的参数
AutoReg()
:正如我们将看到的,这将有助于短期预测。
让我们从一个示例数据集开始statsmodels
,数据如下所示:
import statsmodels.api as sm
data = sm.datasets.sunspots.load_pandas().data['SUNACTIVITY']
plt.plot(range(len(data)), data)
让我们拟合一个AR(p)对时间序列进行建模并使用偏自相关图来查找顺序的过程p, 如下所示
从上面可以看出,前几PACF值仍然很重要,让我们使用p=10为了AR(p).
让我们将数据分为训练数据集和验证(测试)数据集,并使用训练数据拟合 10 阶自回归模型:
from statsmodels.tsa.ar_model import AutoReg
n = len(data)
ntrain = int(n*0.9)
ntest = n - ntrain
lag = 10
res = AutoReg(data[:ntrain], lags = lag).fit()
现在,使用predict()
用于预测与保留数据集对应的所有值的函数:
preds = res.model.predict(res.params, start=n-ntest, end=n)
请注意,我们可以使用训练模型中的参数获得完全相同的预测,如下所示:
x = data[ntrain-lag:ntrain].values
preds1 = []
for t in range(ntrain, n):
pred = res.params[0] + np.sum(res.params[1:]*x[::-1])
x[:lag-1], x[lag-1] = x[-(lag-1):], pred
preds1.append(pred)
请注意,以这种方式生成的预测值与使用以下方法获得的预测值相同predict()
上面的函数。
np.allclose(preds.values, np.array(preds1))
# True
现在,让我们绘制测试数据的预测值:
可以看出,对于长期预测,预测质量并不好(因为预测值用于长期预测)。
让我们现在进行短期预测并使用最后的预测lag数据集中的点来预测下一个值,如下一个代码片段所示。
preds = []
for t in range(ntrain, n):
pred = res.params[0] + np.sum(res.params[1:]*data[t-lag:t].values[::-1])
preds.append(pred)
从下图中可以看出,短期预测效果更好: