stasmodels SARIMAX预测

时间:2019-08-23 09:24:54

标签: statsmodels

我正在尝试了解如何使用statsmodels提前1步以上验证ARIMAX模型。

我的理解是results.get_prediction(start=, dynamic=) api可以做到这一点,但是我很难理解它是如何工作的。我的训练数据通过15T频率的本地化DateTimeIndex(tz ='Sydney \ Australia')进行索引。我想使用直至之前预测的内生值的'2019-02-04 06:00:00 + 1100'的单步预测来预测'2019-02-04 00:00:00 + 1100'的整天在一天的剩余时间内。

下面的代码正确吗?看来statsmodel会将开始转换为TimeStamp,并将动态视为频率的倍数,因此这应该从1步开始进行仿真,直到06:00,然后再使用先前的预测内生值。结果看起来不太好,所以我想确认这是一个模型问题,而不是我有错误的诊断。

dt = '2019-02-04'

predict = res.get_prediction(start='2019-02-04 00:00:00+11:00')     
predict_dy = res.get_prediction(start='2019-02-04 00:00:00+11:00', dynamic=4*6)

fig = plt.figure(figsize=(10,10)) ax = fig.gca()

y_train[dt].plot(ax=ax, style='o', label='Observed')     
predict.predicted_mean[dt].plot(ax=ax, style='r--', label='One-step-ahead forecast')
predict_dy.predicted_mean[dt].plot(ax=ax, style='g', label='Dynamic forecast')

enter image description here

1 个答案:

答案 0 :(得分:1)

  

似乎statsmodel将开始转换为TimeStamp

是的,如果给它一个字符串值,那么它将尝试将其映射到数据集中的索引(如时间戳记)。

  

并将动态视为频率的倍数

但这是不正确的。 dynamicstart的整数偏移量。因此,如果使用dynamic=0,则表示动态预测始于start;如果使用dynamic=1,则意味着动态预测始于start+1

我不清楚您的示例中发生了什么(或者您对所生成的预测不满意),因此这里描述了dynamic的工作方式可能会有所帮助:


这是一个示例,可以帮助解释事情的工作方式。此练习的几个关键点将是:

  • 我将endog的所有元素都设置为等于1
  • 这是参数为0.5的AR(1)模型。这意味着,如果我们知道y_t,则y_t + 1的预测等于0.5 * y_t。

现在,示例代码为:

ix = pd.date_range(start='2018-12-01', end='2019-01-31', freq='D')
endog = pd.Series(np.ones(len(ix)), index=ix)
mod = sm.tsa.SARIMAX(endog, order=(1, 0, 0), concentrate_scale=True)
res = mod.smooth([0.5])

p1 = res.predict(start='January 1, 2019', end='January 5, 2019').rename('d=False')
p2 = res.predict(start='January 1, 2019', end='January 5, 2019', dynamic=0).rename('d=0')
p3 = res.predict(start='January 1, 2019', end='January 5, 2019', dynamic=1).rename('d=2')

print(pd.concat([p1, p2, p3], axis=1))

这给出了:

            d=False      d=0     d=2
2019-01-01      0.5  0.50000  0.5000
2019-01-02      0.5  0.25000  0.5000
2019-01-03      0.5  0.12500  0.2500
2019-01-04      0.5  0.06250  0.1250
2019-01-05      0.5  0.03125  0.0625

第一列(d = False)是默认情况,其中dynamic=False。在此,所有预测都是一步一步的预测。因为我将endog的每个元素都设置为1,并且我们有一个参数为0.5的AR(1)模型,所以所有的单步预测将等于0.5 * 1 = 0.5。

在第二列(d = 0)中,我们指定dynamic=0,以便动态预测从第一个预测开始。这意味着我们在形成预测时不会使用endog之后的任何start - 1数据,在这种情况下,我们不会在进行预测时使用2018年12月31日之后的任何数据。首次预测将等于2018年12月31日观测值的0.5倍,即0.5 * 1 = 0.5。每个后续预测将等于0.5 *先前的预测,因此第二个预测为0.5 * 0.5 = 0.25,依此类推。

第三列(d = 1)与第二列类似,只是此处dynamic=1使得动态预测从第二预测开始。这意味着我们不会使用endog之后(即2019年1月1日之后)的任何start数据。