【问题标题】:How to forecast a time series out-of-sample using an ARIMA model in Python?如何在 Python 中使用 ARIMA 模型预测样本外的时间序列?
【发布时间】:2021-04-14 22:40:38
【问题描述】:

我在 Stackoverflow 上看到过类似的问题。但是,这些问题要么足够不同,要么相似,实际上都没有得到回答。我认为这是建模人员经常遇到的问题,并且需要解决一些挑战。

在我的例子中,我使用了两个变量,一个 Y,一个 X,有 50 个时间序列连续观察。它们都是代表百分比变化的随机数(它们可以是你想要的任何东西,它们的真实值无关紧要。这只是为了设置我的编码问题的一个例子)。这是我构建这个 ARIMAX(1,0,0) 模型的基本代码。

import pandas as pd
import statsmodels.api as sm
import statsmodels.formula.api as smf

df = pd.read_excel('/Users/gaetanlion/Google Drive/Python/Arima/df.xlsx', sheet_name = 'final')

from statsmodels.tsa.arima_model import ARIMA
endo = df['y']
exo = df['x']

接下来,我使用前 41 个观测值构建 ARIMA 模型

modelho = sm.tsa.arima.ARIMA(endo.loc[0:40], exo.loc[0:40], order =(1,0,0)).fit()
print(modelho.summary())

到目前为止一切正常。

接下来,我尝试预测或预测接下来的 9 个样本外观察值。在这里,我想使用这 9 个观测值的 X 值来预测 Y。而且,我就是做不到。我只在下面显示一个代码,我认为它可以让我最接近我需要去的地方。

modelho.predict(exo.loc[41:49], start = 41, end = 49, dynamic = False)
TypeError: predict() got multiple values for argument 'start'

【问题讨论】:

    标签: python predict arima forecast


    【解决方案1】:

    这个例子应该可以工作。我正在使用你的代码,但它略有改变。

    import pandas as pd
    import statsmodels.api as sm
    import numpy as np
    from statsmodels.tsa.arima_model import ARIMA
    

    生成示例数据框

    df = pd.DataFrame(data = {'x' : np.random.normal(12, 3,size = 332),
                         'y' : np.random.normal(12, 2,size = 332)})
    
    df
    
    endo = df['y']
    exo = df['x']
    

    华宇模型的顺序和你的代码一样,只是为了演示

    让我们将最后 12 个观察值排除在模型之外

    modelho = sm.tsa.arima.ARIMA(endo[:-12], exo[:-12], order =(1,0,0)).fit()
    modelho.summary()
    
    
    
    future_x = exo[-12:]
    
    modelho.predict(exog = future_x, start = 320, end = 331)
    

    也可以使用:

     modelho.forecast(12, exog = future_x)
    

    【讨论】:

    • 我运行了你的确切代码。他们工作了。但是,我不知道为什么。当您在模型中编码时... exo[:-12]... 这意味着您将删除第 12 列并保留所有行。然而,通过这样做,您保留了所有列并删除了 12 行。我不明白该代码是如何工作的。当您预测并编写代码时... exo[-12]。您取出最后 12 个观测值的 X 值。但是,我想保留 X 信息。这是一个模型保持或样本外测试,我想使用 12 个 X 值和 Y t-1 自回归变量来预测最后 12 个 Y 值。
    • exo[:-12] 表示将最后 12 个 obs 保留在模型之外。如果你运行 endo[:-12] == endo.loc[0:319] 和 exo[-12:]==exo.loc[320:331] 你会看到这两种语法以同样的方式切片数据。当在 Arima 中使用外生变量时,需要提供它们的未来值来进行预测,这就是我遗漏 12 个 obs 的原因。如果您没有 exog 未来价值并且它们都是内生的,那么我建议使用 VAR 模型。 VAR 将允许您共同预测 x 和 y。我希望这会有所帮助。
    • 更多关于 VAR en.wikipedia.org/wiki/….
    • 我仍然不明白为什么我的原始代码不起作用。我提供了预测所需的所有论据或信息。而且,我不明白......当我只是编码时......参数'start'有多个值...... start = 41。
    • @Sympa 请尝试 modelho.forecast(9, exog = exo.loc[41:49])
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-05-01
    • 2020-12-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-11
    相关资源
    最近更新 更多