为什么ARIMA可以正确拟合但生成平坦的预测? - python

模型适合但预测失败

在下图中显示的以下数据上使用(4,0,13)ARIMA模型可得出平坦的预测(在下图第二图中也显示)。我不确定为什么该模型可以拟合训练集中的数据,但之后却没有任何预测。我发现了另一个问题here,该问题说我需要添加季节性成分。我将在下面详细介绍我的经验。

The Time Series (zoomed in)

The Predictions*

*预测图在橙色垂直线之后显示了所有训练数据以及验证数据。训练拟合四舍五入为整数(此数据集中不可能有实数)。请注意,预测只是平坦,然后消失。

问题定义

我有15分钟的间隔数据,希望将SARIMA模型应用于该数据。它具有每天的季节性,定义为上午7点至晚上9点(因此,每4 * 15 = 60个周期(一小时内4、15分钟,一个小时* 15小时))。我首先使用增强Dickey-Fuller测试来测试平稳性。这通过了,所以我开始分析ACF和PACF以确定SARIMA参数。

参数确定

(p,d,q)

ACF & PACF on Original Data

由此可见,没有单位根(ACF和PACF之和不等于1),并且由于ACF没有大的界限,因此我们需要对序列进行差分。

ACF & PACF on Differenced Data

由此,我看到它略有差异,因此我可能想尝试不使用积分项,并在15(原始绘图中ACF进入频带的点)处添加一个AR项。我还在这里添加一个MA术语。

(P,D,Q)s

我现在寻找季节性成分。我进行了周期60的季节性差异,因为那是图中的峰值。

Seasonal difference

看到这一点,我应该在季节性成分中添加2个MA术语(here中的规则13和7),但该网站还表示通常不使用超过1个季节性MA,因此我将其保留为1。

模型

这给我留下了SARIMA(0,1,1)(0,1,1,60)模型。但是,我用尽了内存以尝试适应此模型(Python,使用statsmodels SARIMA函数)。

我是否正确选择了参数? ARIMA / SARIMA是否可以拟合这些数据?最后,六十年代的SARIMA是否可以正常工作,我只需要找到一种在其他计算机上运行它的方法?

我想tl; dr问题是:我做错了什么?

随时详细介绍。我想及时了解时间序列,因此更多信息会更好!

参考方案

要选择最合适的模型,您可以使用AIC / BIC测试来找到获得最佳结果的模型。您测试Q和P的不同组合。

此外,通常模型遵循以下规则:q + d + p + Q + D + P <6

BR
一种。

Python sqlite3数据库已锁定 - python

我在Windows上使用Python 3和sqlite3。我正在开发一个使用数据库存储联系人的小型应用程序。我注意到,如果应用程序被强制关闭(通过错误或通过任务管理器结束),则会收到sqlite3错误(sqlite3.OperationalError:数据库已锁定)。我想这是因为在应用程序关闭之前,我没有正确关闭数据库连接。我已经试过了: connectio…

python-docx应该在空单元格已满时返回空单元格 - python

我试图遍历文档中的所有表并从中提取文本。作为中间步骤,我只是尝试将文本打印到控制台。我在类似的帖子中已经看过scanny提供的其他代码,但是由于某种原因,它并没有提供我正在解析的文档的预期输出可以在https://www.ontario.ca/laws/regulation/140300中找到该文档from docx import Document from…

Python:集群作业管理 - python

我在具有两个阶段的计算群集(Slurm)上运行python脚本,它们是顺序的。我编写了两个python脚本,一个用于阶段1,另一个用于阶段2。每天早上,我检查所有第1阶段的工作是否都以视觉方式完成。只有这样,我才开始第二阶段。通过在单个python脚本中组合所有阶段和作业管理,是否有一种更优雅/自动化的方法?我如何知道工作是否完成?工作流程类似于以下内容:w…

Python-Excel导出 - python

我有以下代码:import pandas as pd import requests from bs4 import BeautifulSoup res = requests.get("https://www.bankier.pl/gielda/notowania/akcje") soup = BeautifulSoup(res.cont…

Python:传递记录器是个好主意吗? - python

我的Web服务器的API日志如下:started started succeeded failed 那是同时收到的两个请求。很难说哪一个成功或失败。为了彼此分离请求,我为每个请求创建了一个随机数,并将其用作记录器的名称logger = logging.getLogger(random_number) 日志变成[111] started [222] start…