自回归积分移动平均模型,或称ARIMA,是单变量时间序列数据预测中最常用的预测方法之一。
尽管该方法可以处理具有趋势的数据,但它不支持具有季节性成分的时间序列。
ARIMA的一种扩展,支持对序列的季节性成分进行直接建模,称为SARIMA。
在本教程中,您将发现季节性自回归积分移动平均模型,或称SARIMA,一种用于预测包含趋势和季节性的单变量时间序列数据的预测方法。
完成本教程后,您将了解:
- ARIMA在处理季节性数据方面的局限性。
- ARIMA的SARIMA扩展,它明确地为单变量数据中的季节性元素建模。
- 如何在Python中使用Statsmodels库实现SARIMA方法。
开始您的项目,阅读我的新书《Python时间序列预测入门》,其中包括分步教程和所有示例的Python源代码文件。
让我们开始吧。
更新: 有关使用和网格搜索SARIMA超参数的帮助,请参阅此帖

Python 中用于时间序列预测的 SARIMA 简明介绍
照片由Mario Micklisch拍摄,保留部分权利。
教程概述
本教程分为四个部分;它们是
- ARIMA有什么问题?
- 什么是SARIMA?
- 如何配置SARIMA
- 如何在Python中使用SARIMA
ARIMA有什么问题?
自回归积分移动平均模型,或称ARIMA,是一种用于单变量时间序列数据的预测方法。
正如其名称所示,它同时支持自回归和移动平均元素。积分元素指的是差分,这使得该方法能够支持具有趋势的时间序列数据。
ARIMA在处理季节性数据时的一个问题是它不支持季节性数据。也就是说,时间序列具有重复的周期。
ARIMA期望数据要么是非季节性的,要么是已经去除了季节性成分的,例如通过季节性差分等方法进行季节性调整。
有关ARIMA的更多信息,请参阅此帖
另一种选择是使用SARIMA。
什么是SARIMA?
季节性自回归积分移动平均模型,SARIMA或季节性ARIMA,是ARIMA的扩展,它明确支持具有季节性成分的单变量时间序列数据。
它增加了三个新的超参数来指定序列季节性成分的自回归(AR)、差分(I)和移动平均(MA),以及一个用于季节性周期的附加参数。
季节性ARIMA模型是通过在ARIMA中包含额外的季节性项来形成的 […] 模型的季节性部分由与非季节性组件非常相似的项组成,但它们涉及季节性周期的反向移动。
— 第242页,《预测:原理与实践》,2013年。
如何配置SARIMA
配置SARIMA需要为序列的趋势和季节性元素选择超参数。
趋势元素
有三个趋势元素需要配置。
它们与ARIMA模型相同;具体来说
- p:趋势自回归阶数。
- d:趋势差分阶数。
- q:趋势移动平均阶数。
季节性元素
有四个季节性元素是ARIMA所不包含的,必须进行配置;它们是
- P:季节性自回归阶数。
- D:季节性差分阶数。
- Q:季节性移动平均阶数。
- m:单个季节性周期的时间步长数。
总之,SARIMA模型的表示法指定为
1 |
SARIMA(p,d,q)(P,D,Q)m |
其中指定了特定选择的模型超参数;例如
1 |
SARIMA(3,1,0)(1,1,0)12 |
重要的是,m参数会影响P、D和Q参数。例如,月度数据m为12表示年度季节性周期。
P=1 将在模型中使用第一个季节性偏移观测值,例如 t-(m*1) 或 t-12。P=2 将使用最后两个季节性偏移观测值 t-(m * 1)、t-(m * 2)。
类似地,D=1 将计算一阶季节性差分,而Q=1 将在模型中使用一阶误差(例如,移动平均)。
季节性ARIMA模型使用与季节数(s)相同的滞后差分来消除加性季节效应。就像使用滞后1差分来消除趋势一样,滞后s差分会引入移动平均项。季节性ARIMA模型包含滞后s的自回归和移动平均项。
— 第142页,《R语言入门时间序列》,2009年。
趋势元素可以通过仔细分析ACF和PACF图来选择,观察近期时间步长(例如1、2、3)的相关性。
类似地,可以通过分析ACF和PACF图来指定季节性模型的值,观察季节性滞后时间步长的相关性。
有关解释ACF/PACF图的更多信息,请参阅此帖
季节性ARIMA模型可能具有大量的参数和项的组合。因此,在拟合数据时尝试广泛的模型范围,并使用适当的标准选择最佳拟合模型是恰当的……
— 第143-144页,《R语言入门时间序列》,2009年。
或者,可以使用网格搜索来遍历趋势和季节性超参数。
有关SARIMA参数网格搜索的更多信息,请参阅此帖
如何在Python中使用SARIMA
SARIMA时间序列预测方法在Python中通过Statsmodels库提供支持。
要使用SARIMA,有三个步骤,它们是
- 定义模型。
- 拟合模型。
- 使用拟合模型进行预测。
让我们一步一步来看。
1. 定义模型
通过提供训练数据和大量模型配置参数,可以创建SARIMAX类的一个实例。
1 2 3 4 |
# 指定训练数据 数据 = ... # 定义模型 model = SARIMAX(data, ...) |
该实现被称为SARIMAX而不是SARIMA,因为方法名称中添加的“X”意味着该实现还支持外生变量。
这些是并行的时间序列变量,它们不直接通过AR、I或MA过程建模,但可以作为加权输入提供给模型。
外生变量是可选的,可以通过“exog”参数指定。
1 2 3 4 5 6 |
# 指定训练数据 数据 = ... # 指定附加数据 other_data = ... # 定义模型 model = SARIMAX(data, exog=other_data, ...) |
趋势和季节性超参数分别作为3个和4个元素的元组传递给“order”和“seasonal_order”参数。
必须指定这些元素。
1 2 3 4 5 6 7 |
# 指定训练数据 数据 = ... # 定义模型配置 my_order = (1, 1, 1) my_seasonal_order = (1, 1, 1, 12) # 定义模型 model = SARIMAX(data, order=my_order, seasonal_order=my_seasonal_order, ...) |
这些是主要的配置元素。
还有其他一些微调参数您可能需要配置。在完整的API中了解更多
2. 拟合模型
创建模型后,就可以在训练数据上进行拟合。
通过调用fit()函数来拟合模型。
拟合模型会返回一个SARIMAXResults类的实例。此对象包含拟合的详细信息,例如数据和系数,以及可用于利用模型的函数。
1 2 3 4 5 6 |
# 指定训练数据 数据 = ... # 定义模型 model = SARIMAX(data, order=..., seasonal_order=...) # 拟合模型 model_fit = model.fit() |
拟合过程的许多元素都可以配置,一旦您熟悉了实现,就值得阅读API来查看这些选项。
3. 进行预测
拟合后,就可以使用该模型进行预测。
可以通过在调用fit返回的SARIMAXResults对象上调用forecast()或predict()函数来进行预测。
该forecast()函数接受一个参数,该参数指定要预测的样本外时间步长数,如果未提供参数,则假定为单步预测。
1 2 3 4 5 6 7 8 |
# 指定训练数据 数据 = ... # 定义模型 model = SARIMAX(data, order=..., seasonal_order=...) # 拟合模型 model_fit = model.fit() # 单步预测 yhat = model_fit.forecast() |
predict()函数需要指定开始和结束日期或索引。
此外,如果在定义模型时提供了外生变量,则在预测期间也必须将它们提供给predict()函数。
1 2 3 4 5 6 7 8 |
# 指定训练数据 数据 = ... # 定义模型 model = SARIMAX(data, order=..., seasonal_order=...) # 拟合模型 model_fit = model.fit() # 单步预测 yhat = model_fit.predict(start=len(data), end=len(data)) |
进一步阅读
如果您想深入了解,本节提供了更多关于该主题的资源。
文章
- 如何进行SARIMA模型超参数网格搜索以进行时间序列预测
- 如何使用 Python 创建用于时间序列预测的 ARIMA 模型
- 如何使用 Python 对 ARIMA 模型超参数进行网格搜索
- 自相关与偏自相关入门指南
书籍
- 第8章 ARIMA模型,《预测:原理与实践》,2013年。
- 第 7 章,非平稳模型,《R 语言时间序列入门》,2009 年。
API
- Statsmodels时间序列分析(基于状态空间方法)
- statsmodels.tsa.statespace.sarimax.SARIMAX API
- statsmodels.tsa.statespace.sarimax.SARIMAXResults API
- Statsmodels SARIMAX Notebook
文章
总结
在本教程中,您发现了季节性自回归积分移动平均模型,或称SARIMA,一种用于预测包含趋势和季节性的单变量时间序列数据的预测方法。
具体来说,你学到了:
- ARIMA在处理季节性数据方面的局限性。
- ARIMA的SARIMA扩展,它明确地为单变量数据中的季节性元素建模。
- 如何在Python中使用Statsmodels库实现SARIMA方法。
你有什么问题吗?
在下面的评论中提出你的问题,我会尽力回答。
如何在SARIMA中配置多个季节性?
好问题,您可能需要开发一个自定义模型。
是否有可用的自定义模型?
我们可以为ARIMA设置多变量时间序列分析,SARIMA也可以吗?
是的,您可以在statsmodels中使用VAR。不确定是否有VSARIMA,您可能需要自己编码一个。
谢谢:)
SARIMA模型和X-12 ARIMA模型有什么区别?
什么是X-12 ARIMA?
X-12 ARIMA曾是美国人口普查局用于季节性调整的软件。它已被X-13 ARIMA SEATS取代。它是计量经济学软件包(如Eviews或GRETL)的一部分,可以将时间序列分解为趋势、周期、季节性成分(包括日历效应)和噪声。
太棒了。感谢分享。
尊敬的Jason博士,
(1) 如何确定SARIMA的p d q m值?
(2) 我记得您在文章中简要提过ARIMA的p d q值确定方法。您在之前的文章中提到过哪些确定ARIMA的p, d, q的方法的网站?
谢谢你
悉尼的Anthony
您可以使用ACF和PACF分析,就像我们为ARIMA所做的那样。
尊敬的Jason博士,
我明白了ARIMA的ACF和PACF。一旦您在ARIMA分析中确定了显著的滞后,我看到了您关于使用PACF和ACF的帖子。
请澄清一下,因为我不确定SARIMA的季节性或S部分的后续分析步骤。您是然后对滞后和差分数据进行ACF和PACF分析来计算季节性吗?
谢谢你,
悉尼的Anthony
季节性方面也可以通过ACF/PACF分析来学习。
有真实数据的例子吗,先生?
您是指本帖中的那些:https://machinelearning.org.cn/arima-for-time-series-forecasting-with-python/
有一个完整的示例供您运行。
杰森博士,
我正在寻求您关于TS分析和日(工作日)数据(3年数据)预测的建议,我使用SARIMAX来拟合这些数据。您能分享一些基本思路吗?因为大多数参考资料都是针对月度数据,无法提供太多知识。
谢谢你,
Naval
您可以使用SARIMAX,也可以使用ETS。具体问题是什么?
如何将ARIMA转移到SARIMA建模?
有人能用Eviews或Minitab等软件,并附带数据来解释这个问题吗?
如果将季节性设置为0,SARIMA就可以使用ARIMA。
什么是Eviews和Minitab?
我认为我们可以将一个SARIMA的输出输入到另一个SARIMA中,并将第二个SARIMA的p,d,q设置为零。
我不确定您为什么想这样做?
我们如何将之前更改过的数据集转换为季节性数据集以用于SARIMA模型?
无需这样做,模型将根据您通过模型超参数指定的季节性调整进行计算。
杰森博士,
我有六年的每日数据,想预测下一年。为此,我设置了以下参数
m=365,我的问题是我的模型运行时间非常长。将m=365设置为每日数据是否正确?是否有解决此问题的方法?
非常感谢。
也许使用更少的历史数据作为输入?
先生,我有一个疑问,在时间序列中我们使用SARIMA模型(或)方法。我们是否在SARIMA模型中使用任何算法?SARIMA是否使用任何算法?
例如:时间序列与循环神经网络中的LMST算法?
提前感谢…
是的,SARIMA是一种线性算法,就像线性回归一样,它使用不同的输入(数据和残差)并执行变换(差分)。
谢谢先生。
我很难理解在使用ARIMA或SARIMA之前是否需要转换非平稳时间序列。我阅读了多篇参考资料,建议在SARIMA建模之前对具有指数趋势和季节性的序列进行对数变换。我也读到SARIMA和ARIMA会考虑趋势和季节性,因此转换不是必需的。
您能否提供您的理解/意见?
谢谢
杰夫
也许可以。
SARIMA可以处理趋势和季节性的差分。
如果您的数据在去除趋势和季节性后仍存在变化的方差,您可以通过Box-Cox变换或类似的幂变换来解决。
您可以手动去除趋势/季节性,然后运行统计检验来查看它是否平稳。
https://machinelearning.org.cn/time-series-data-stationary-python/
谢谢!这就是我想要的。我计划分解序列,然后测试残差。您同意这个方法吗?
或许可以试试看?
布朗利博士,您好,
我有一个关于季节性元素的问题。我为时间序列预测项目使用了SARIMA模型超参数网格搜索。最佳SARIMA模型的季节性元素为(7,1,9,0)。当m(单个季节性周期的步长数)=0时,但季节性P、D、Q不为0,这是什么意思?我们是否需要捕捉这种季节性?
谢谢,
Sara
这是一个好问题!
我发现我自己也遇到过这种情况,而且结果如果将这些值归零(凭记忆)会有所不同。
我不太清楚。这可能需要深入研究代码或在问答网站上提问。
Jason您好,这是一篇很棒的教程,感谢您的分享。我正在使用SARIMA,并注意到网格搜索没有为趋势和季节性元素组合(0,1,0)x(0,0,0)或(0,1,0)x(0,1,0)产生结果。您能解释一下吗?
也许底层的数学库在您的数据集上未能收敛于该配置?
您可以通过显示网格搜索期间的警告来查看。
感谢您的回复。是否需要手动运行它们来获得结果?
是的,这是一种方法。
Jason,
感谢分享这些信息。我需要为各种产品设置一个自更新模型来预测库存,其中许多产品都显示出季节性。我看到过在这种情况下,为了实现自动化和泛化,其他人应用ARIMA并通过差分去除季节性。这会降低模型的准确性吗?如果我转而基于SARIMA来处理季节性,这会破坏其对产品实现自动化和泛化的能力吗?
SARIMA可以对趋势和季节性进行建模,无需提前去除。
感谢您的本教程。
我正在尝试对一个我拥有的数据的大气参数进行建模。一个小时的时间序列数据。我一直在测试您网站上的一些示例代码和其他代码来测试我的数据。使用model = SARIMAX(aod, order=(1, 1, 1), seasonal_order=(0, 0, 0, 0)),这是一个在某些示例中提供的默认代码,比ARIMA等其他模型提供了近乎完美的拟合。ARIMA模型给出了异常低的值。我的数据是平稳的。
我的问题是,在我的数据使用上面的示例代码(其中所有SARIMAX参数都为1,季节性参数为0)获得了良好的拟合,这是我犯了错误还是我忽略了什么?我的数据是每日每小时数据,所以我还尝试了model = SARIMAX(aod, order=(1, 1, 1), seasonal_order=(0, 0, 0, 24)),这也给出了一个不错的结果。
干得好!
我期望零阶季节性成分与ARIMA相同,但statsmodel的实现可能有所不同?
实际上我意识到了我的错误。ACF和PACF图可能显示了24的季节性趋势和4的p和q值。我之前的模型之所以有效,是因为我是在训练数据本身上进行预测。我实际上没有将数据集分成两组用于训练和测试。这就是为什么当我执行分割并进行验证时,预测序列是一条直线。我对此感到沮丧。但后来我通过分析ACF图更改了SARIMA的参数,现在数据似乎通过RMSE为0.003进行了验证。
如果您不介意,我有一个关于这个模型的问题。我想预测的变量也可能取决于一到两个其他变量,至少我想展示这一点。我有没有办法实现多变量SARIMA模型?
干得好!
是的,您可以通过外生变量包含其他变量,例如SARIMAX。我认为这里有一个例子
https://machinelearning.org.cn/time-series-forecasting-methods-in-python-cheat-sheet/
非常感谢。您的SARIMA文章拯救了我。即使您写的是单步预测,我还是将predict函数扩展到了多个时间步长,如果您不介意的话?
我试图将每个变量作为外生变量(exog)独立包含,然后将它们组合起来,并再次包含它们。由于我这是为了一个项目,您对收尾工作有什么建议吗?我的意思是,为了写一篇合理的项目论文并进行展示,我需要展示哪些参数或测试?如果问题太多,我很抱歉。
好问题,也许这会有帮助
https://machinelearning.org.cn/how-to-grid-search-sarima-model-hyperparameters-for-time-series-forecasting-in-python/
在 Sarimax 模型中使用 exog 变量时,exog 变量可以是员工 ID 这样的东西吗?
在模型准备步骤中使用的 exog 数据,即在调用 sarimax() 或 auto_arima() 函数时,与调用 predict() 对拟合模型相同吗?
我认为 ID 不具有预测性,可能不应该包含在模型中。
假设我想预测一家商店在产品层面的销量。那么,我能否将产品 ID 作为外生变量,将每月销量作为内生变量?我拥有这家商店的产品月销量数据集。现在我想预测未来的销量。在这种情况下,产品 ID 能否被用作模型中的外生变量?
我不太确定我们依据什么标准来决定一个列是否可以被视为外生变量。
另外,在考虑季节性趋势时,您能否分享一些让 auto_arima() 模型和 sarimax 模型运行更快的技巧?我正在运行的模型花费了大量时间,并且大部分时候由于资源耗尽而被终止。
为了考虑季节性,我必须为 m 赋值,所以我有多行数据对应于一个单独的日期。数据在一年后重复出现,那么 m 的值应该是 12 还是观察次数(即产品 ID 的数量)* 12?
不胜感激
ID 不具有预测性,不应用于模型的输入。
是的,我在这里写了一个自定义的自动调优方法。
https://machinelearning.org.cn/how-to-grid-search-sarima-model-hyperparameters-for-time-series-forecasting-in-python/
SARIMAX 可以每周和每月应用吗?也可以用于节日季吗?
或许可以试试看?
非常感谢这篇精彩的文章。基于这篇文章和您的其他网格搜索文章,我为我的模型打下了基础。但我有一个疑问。我的预测滞后了一步。这正常吗?为了使用预测,我是否应该将其向后移动一步?
这是我在这里回答的一个常见问题
https://machinelearning.org.cn/faq/single-faq/why-is-my-forecasted-time-series-right-behind-the-actual-time-series
哦,好的,谢谢。这意味着我的模型离可用还差得很远,因为样本外预测在短短 10 步内就趋近于均值。罢了!
也许可以尝试一系列配置和模型?
在 SARIMAX 中,我们如何进行双重季节性顺序?例如,我需要根据星期几来预测每小时的销量。
不确定是否支持两个季节性顺序。
也许在建模之前,对其中一个进行季节性差分?
你好,
感谢您的文章!
我有一个问题,在很多地方我看到,在运行模型之前有一个预处理阶段,作者对输入进行了对数处理以稳定方差,并进行了对数差分以去除趋势。
您的看法将受到赞赏!
是的,请看这个
https://machinelearning.org.cn/power-transform-time-series-forecast-data-python/
您好,我处理的是每分钟的数据。我的季节是每天。所以如果我理解 SARIMA 的话,我的季节变量 (m) 应该是 60*24,对吗?但是,模型不支持这么大的数字。我该怎么办?
也许可以尝试以不同的分辨率进行建模,例如,重采样到分钟、15分钟、30分钟、每小时等,然后进行比较?
也许尝试其他模型?
也许可以尝试使用一部分特征和工程特征进行建模?
您好,感谢分享信息!
我处理的是每日数据。m 参数的最佳值是多少?是否有设置它的经验法则?例如 7 表示每周周期?
是的,每周、每月、每年等。
嗨,Jason,
非常实用的文章。感谢分享。
我需要一个澄清……
我想在包含 10 年月度数据的时间序列数据中应用 SARIMA (1,1,0)(0,1,1)12。
这个模型可以翻译成以下内容吗?
“这个月的销量预测(一月)将基于
差异(十二月和十一月)的上一个值(因为 p=1,d=1)和
上两个一月差值残差的移动平均(因为 D=1,Q=1,m=12)。”
我理解 SARIMA 是 ARIMA 和季节性分量 ARIMA 的总和。
干得不错。
是的,这似乎差不多。
您好 Jason。非常感谢您的文章,它们非常有帮助,帮助我成长。
我有一个关于您文章中这个段落的问题
“顾名思义,它支持自回归和移动平均元素。集成元素指的是差分,允许该方法支持具有趋势的时间序列数据。
ARIMA 的一个问题是它不支持季节性数据。也就是说,具有重复周期的时序数据。”
我认为,如果您为自回归部分和移动平均部分设置了好的参数,这些参数应该会根据数据进行调整,对吗?那么,您能否从数学上解释一下为什么 ARIMA 不适合季节性数据?
提前感谢您的回答
它没有季节性分量的参数。SARIMA 有。
我有分钟级数据。
2020-01-09 12:00:00 90.82098
2020-01-09 12:15:00 90.61686
2020-01-09 12:30:00 86.22828
我想应用 SARIMAX…… 哪个是 seasonal_order 参数?
我尝试了 96(因为我一个小时有 4 个数据……所以 4*24 是 96)这是正确的吗?
也许可以尝试一系列配置,看看哪种配置产生的预测误差最低。
ARIMA、ARIMAX、SARIMA 和 SARIMAX 模型之间有什么区别?
好问题,请看这个
https://machinelearning.org.cn/time-series-forecasting-methods-in-python-cheat-sheet/
嗨,Jason,
感谢您出色的文章。
我有一个与天气相关的时序数据集,其中包含 4000 多个记录,并且是基于小时的采样。其中一些样本值超出范围,即如果范围是 1-10,则值为 15。有些样本值在先前和当前样本值之间存在很大差异。这可能是传感器问题或其他问题。我想根据该样本的先前和后续值来检测它。您能否为我提供解决方案,以及在检测到样本后如何在此位置填补适当的值?
您可以设计一个统计检验,并用它来实时检测异常值,例如,与均值相差 3-4 个标准差。需要进行实验。
感谢精彩的文章!
如何将日历效应实现到 SARIMA 中?
如果您能提供一些链接,我将不胜感激。
不客气。
好问题,我希望将来能写这方面的内容。
我们可以考虑使用外生变量的交叉相关性吗?
例如,在预测提前一天和实时价格时,这些价格之间的相关性是否可以在此模型中考虑?
好问题,我认为不行。SARIMA 模型主要设计为单变量模型。
我尝试了每日顺序数据并使用了 m = 365,但没有获得绘制结果所需的所有相关参数
results.plot_diagnostics(figsize=(16, 8))
plt.show()
这是因为数据点不能被 365 整除吗?
我不知道,抱歉。也许可以尝试一下。
您是否弄清楚了为什么对于每日顺序数据 m=365 的值不起作用?
对于具有每日和每周季节性的快速移动(每天 2880 点)数据集,应用 SARIMA 模型是否合理?如果合理,那么我们是否需要为季节性设置 2880 个周期,或者我们需要将其重采样到分钟级或小时级?
也许可以为您的数据集开发一个原型,看看效果如何?
抱歉,我没明白。您说的原型是什么意思?
抱歉,我的意思是开发一些关于您数据的小示例来探索这些想法。
陈述——ARIMA 模型用于数据显示无趋势时。
这个陈述是真是假。
如果可能,请分享原因。
假,因为 ARIMA 可以通过差分处理趋势。
先生,您好,
我们在 SARIMA 上应用它时需要使数据平稳吗?我的数据没有上升或下降的趋势,但从季节性分解图上看我看到了季节性成分?我有 5 个月的数据。我如何决定季节性值 m?
是的,但 SARIMA 可以通过对模型中的趋势和季节性进行差分来为您完成。
在哪里可以找到更多关于我的网格搜索产生的模型的有效性的信息?我得到了这些结果,但我对 SARIMA 是新手。我怎么知道这个模型是否好,以及这些象形文字是什么意思?
RMSE:171310.522
SARIMAX 结果
=========================================================================================
因变量:实际收入 观测值数量:13
模型:SARIMAX(2, 0, 0)x(1, 0, 0, 3) 对数似然值 -95.470
日期:2021 年 2 月 9 日星期二 AIC 200.940
时间:11:10:54 BIC 201.338
样本:2017-12-31 HQIC 198.261
– 2020-12-31
协方差类型:opg
==============================================================================
coef std err z P>|z| [0.025 0.975]
——————————————————————————
intercept 2.718e+05 2.73e+05 0.994 0.320 -2.64e+05 8.08e+05
ar.L1 -0.2000 0.528 -0.379 0.705 -1.235 0.835
ar.L2 -0.0870 0.427 -0.204 0.838 -0.923 0.749
ar.S.L3 -0.0680 0.695 -0.098 0.922 -1.429 1.293
sigma2 1.622e+09 11.785 1.38e+08 0.000 1.62e+09 1.62e+09
===================================================================================
Ljung-Box (Q):7.39 Jarque-Bera (JB):0.88
Prob(Q):0.39 Prob(JB):0.64
异方差 (H):1.21 Skew:0.47
Prob(H) (双边):0.88 Kurtosis:1.68
===================================================================================
警告
[1] 使用梯度外积(复步)计算协方差矩阵。
[2] 协方差矩阵是奇异的或接近奇异的,条件数为 2.63e+24。标准误可能不稳定。
您可以使用滚动预测验证在数据集上对其进行评估,并将其结果与朴素模型或其他配置进行比较,以查看其是否具有预测能力。
请告知 SARIMA 模型的优点和缺点。
它可以处理趋势和季节性,并且是一个简单的线性模型。
只处理一个变量。
我的数据是每小时数据,季节性为一年。所以 m = 365 的值对于计算来说太大了。有什么最佳解决方案?
以及“m”的单位是什么(例如天、小时或分钟)?您能否多解释一下?
我相信 m 是以您的数据集的单位。
也许可以评估一系列配置、数据预处理和模型类型,找出最适合您数据集的方法。
请问,如果我们只有季节性而没有趋势,该怎么办?在我的案例中,数据具有每周季节性(1个周期=7天),当使用 df.diff(7) 进行去季节化处理时,得到的数据是平稳的,那么我应该使用什么模型?我想知道以下行的参数是什么
SARIMA(p,d,q)(P,D,Q,7)
将 d 设置为 0 以表示没有趋势。
您好,SARIMA 是否包含残差?如果包含,如何确定其用于非线性模型的残差?
我认为它在模型的 MA 部分使用了它们。
我明白了。我想我明白了,我会尝试一下。非常感谢 Jason 博士。
不客气。
你好 jason,
我有 5 年的日数据,并尝试使用季节性周期 m=365 构建 SARIMA 模型,但执行时间很长。有什么解决方案吗?
我已将数据重采样为每周数据,并使用了相同的方法,季节性周期为 m=52,执行速度快了很多。
我们如何知道我的数据是否具有每日、每周、每月或每年的季节性?
也许使用较少的数据?
或许在更快的机器上运行?
也许可以尝试使用不同的模型?
感谢您的文章。Python 的 pmdarima.auto_arima(自动查找最佳阶数)能否返回 sarimax 或 arimax 模型,因为该函数包含季节性参数 P、D、Q 和 m,以及外生变量的 X 参数?
抱歉,我不熟悉它。
您好 Jason,精彩的教程。我需要使外生变量平稳,就像内生变量一样吗?谢谢。
这可能是一个好主意。尝试有和没有它进行比较。
太棒了。谢谢 :)
不客气。
您好!我多次阅读过您的帖子,非常感谢您分享您的知识。
我有一个找不到答案的问题。如何进行静态样本外预测?
因此,当然,数据被分为测试集和训练集。模型拟合到测试数据。现在,进行动态预测很容易。但是,如果我想进行静态预测,即每次预测一个点,并且每次新预测都考虑到前一个点,那么在未用于训练的数据上我就无法做到这一点,它只会像动态预测一样。
如何指定测试数据是需要更新预测的数据?这与 exog 有关吗?还是只能通过某种 for 循环来完成?
希望我的问题很清楚。
拟合所有数据并调用 model.forecast()。参见此内容。
https://machinelearning.org.cn/make-sample-forecasts-arima-python/
再次您好!首先,我感谢您甚至回复这些问题。
但是,我对您的回答有些困惑,特别是“拟合所有数据”这部分。这不会完全破坏测试数据的意义吗,因为它不是模型应该拟合的数据部分?
我的目标是在不重新训练模型的情况下进行预测。我将查看您的其他帖子,希望您不介意我问更多问题。
抱歉,我以为您是在询问如何在没有测试数据的情况下对样本外数据进行预测。
如果您有测试集,则必须使用滚动预测验证。
https://machinelearning.org.cn/backtest-machine-learning-models-time-series-forecasting/
对于最终模型,您可以选择在新数据可用时重新拟合,也可以不重新拟合。进行测试以找出最适合您问题的方法。重新拟合可能是建议的做法。
*模型拟合到训练数据(笔误)。
是的,这是有道理的。我将查看链接的帖子。您的帖子非常有帮助。谢谢!
关于重拟(refitting),有一件事让我感到困惑。建立最终模型的过程就是寻找合适系数的过程。一旦我们找到了系数,如果我们一直重拟,我们就会一直得到新的系数。那么,如果最终模型会在每一步都被改变,寻找最终模型的意义是什么呢?
无论如何,我将考虑不同的重拟周期,而不是在每个新时间点都重拟,而是每隔n个点重拟一次。
也许它需要改变,也许不需要,这取决于你的数据和模型。
进行测试并找出最适合你特定情况的方法。
感谢您的文章,ARIMA 带有季节性参数(statsmodels.tsa.arima.model.ARIMA¶)与 SARIMA(statsmodels.tsa.statespace.sarimax.SARIMA)有什么区别?
如果你查看源代码,你会发现它们实际上是相同的。
感谢您写了如此清晰的文章。
我是数据科学新手,我在处理一个 SARIMA 问题,数据是连续 41 个月的。我已经进行了对数变换、差分、使序列平稳,应用了季节性差分(6 个月)并将其分为训练/测试集(80%/20%),并使用了带有季节性因子的 auto_arima。
然而,我没有得到样本内预测。当我绘制它时,预测部分是空白的。您认为我可能在哪个环节出错了?这是我用来创建预测的代码。
fc= model_fit.get_forecast(steps=8, return_conf_int=True) # 95% 置信区间 #8 是测试集的长度
conf = fc.conf_int()
为了绘图,我将其转换为数据框。
fc_series = pd.Series(fc.predicted_mean, index=test.index)
lower_series = pd.Series(conf.loc[:, ‘lower MonthlyTotals’], index=test.index)
upper_series = pd.Series(conf.loc[:, ‘upper MonthlyTotals’], index=test.index)
在我看来,代码是正确的。如果它是空白的,那可能是其他地方导致的问题。
如果一个人是 Python 的初学者,是否有可能完成一个时间序列预测项目?
为什么不呢?statsmodels 包很容易使用。
你好 K.Bhanu… 请提供更多关于你感兴趣的项目类型的细节。
此致,
感谢您的文章
我使用了每日数据进行 ARIMA,我需要为 SARIMA 使用相同的数据,那么 S 会等于 365 吗?
你好 Hendy…没有“S”参数。以下信息可能会有所帮助。
https://neptune.ai/blog/arima-sarima-real-world-time-series-forecasting-guide
感谢您的时间,
那么,如果我想使用 SARIMA,我必须使用月度数据并将 s 设置为 12 吗?
在绘制 ACF 和 PACF 以确定 P 和 Q 之前,我们需要进行季节性差分吗?
你好 Gloskinya… 你可能会发现以下信息很有趣。
https://machinelearning.org.cn/gentle-introduction-autocorrelation-partial-autocorrelation/
你好 Jason。在你最后一行代码中,是不是应该是
yhat = model_fit.predict(start=0, end=len(data))
而不是
yhat = model_fit.predict(start=len(data), end=len(data))
如果不是,为什么将 start 和 end 设置为相同的值?
感谢你的提问和反馈!
实际上,我在你的 ARIMA 教程中找到了答案。
如果我们使用训练数据集中的 100 个观测值来拟合模型,那么用于进行预测的下一个时间步的索引将指定为预测函数 start=101, end=101。这将返回一个包含一个预测值的一维数组。
https://machinelearning.org.cn/arima-for-time-series-forecasting-with-python/
感谢你的反馈 Timon!
尊敬的布朗利博士,
您这里的内容对于我的大学期末项目来说真是太有用了 X)。我使用了 XGBoost、LSTM 和 Prophet 来进行时间序列预测以进行比较。现在我正在尝试使用 SARIMA,我得到了一个很好的结果,这些问题听起来可能很愚蠢,但我仍然是一个完全的初学者。
1) “m”参数代表“一个季节性周期的时间步长数”,如果我的时间序列是每日频率,季节性周期是一年,那么 m 应该是 12 还是 365?由于数据是每日采样,我不太确定 m=12 是否仅适用于月度频率的时间序列数据。
2) 如果我运行测试发现我的时间序列已经是平稳的,那么“d”参数是否应该设置为零?
3) 在运行模型并将其拟合到训练数据,然后预测测试数据时,预测似乎有一个 1 天的偏移,也就是说,我将预测数组移动了 1 位到左边,然后它就完美地拟合了测试的实际数据,我不确定是我做错了什么还是其他原因。
我更加困惑,因为我将 m 设置为 12,d 设置为 1,但仍然得到了一个不错的结果,尽管时间序列是平稳的。
你好 Jaime…虽然 SARIMA 是一个强大的预测工具,但它在使用多个变量进行预测方面非常有限。我推荐以下资源,因为它包含了许多时间序列问题的完整解决方案,可以解决你的所有问题。
https://machinelearning.org.cn/deep-learning-for-time-series-forecasting/
嗨,Jason,
感谢您的解释。您是否有使用混合 SARIMA-ANN 方法进行预测的示例?