非常高频的时间序列分析(秒)和预测(Python/R)

机器算法验证 时间序列 预测 Python 有马 季节性
2022-03-11 12:20:49

我有高频数据(以秒分隔的观察结果),我想使用 ARIMA 模型分析并最终预测短期周期(提前 1/5/10/15/60 分钟)。我的整个数据集非常大(1500 万台)。我的目标是得出结论,与我已经做过的其他简单方法、NAIVE 和 SES 相比,ARIMA 模型可以预测数据有多好。由于数据如此之大,我开始查看不同日期的图以及数据的 ACF 和 PACF(以搜索模式)。

一种。数据是固定的 - ADF 测试也强烈认可这一点(因此无需差分)

湾。ACF 图显示了强烈的每小时季节性,但在前 500 个滞后(分钟季节性?)中也有。我还假设每天有季节性(滞后于 86,400)

问题问题#1:

如果我想开始,取一天的样本(从 00:00-23:59)并预测第二天的时间(00:00 - 00:59,第 2 天),这是样本外的预测,

1.1 我应该适合 ARIMA 模型的数据量应该是多少?关于选择“训练集”(尤其是短期预测)有什么规则吗?

就我而言,它变得非常复杂,因为在整个 24 小时样本 (12,0,3) 中发现非季节性 ARIMA 的顺序非常高。第二个也是更关键的问题是,如果我考虑到季节性高阶,(3,0,0)s=3600,那么计算机内存不足。我在 Python 和 R 上都试过了。

1.2 知道如何处理这种情况吗?

问题#2:

到目前为止,我尝试的是平均每 60 秒的数据,所以我得到了每天 1440 次观察的重新采样数据(代表分钟)。这样做之后,我可以更轻松地处理现在 s = 60 的季节性周期,并且幸运地使用 R 和 Python(但是,这样做我可能会丢失有价值的信息......)。因为对于每个数据长度,我都会得到不同的 ARIMA 顺序。例如 7 小时:ARIMA(2,0,0)(1,0,0)[60] 和 ...。如果我想使用更短的拟合周期,我必须区分数据,因为模式变得非静止的。例如 2 小时:ARIMA(3,1,1)(0,0,1)[60]。所以我尝试测试几种方法,看看“样本外”(1小时)的预测有多好。似乎在这些方法中,较短的时间拟合(2 小时)产生的结果比较长的方法稍好。但又一次,

2.1:所以第一个问题仍然存在,我应该在训练集上拟合 ARIMA 的数据长度是多少?2.2:在短期预测期间使用短期训练集是否有意义?

问题#3

假设另一个“更长的拟合”(比如 24 小时)导致如此短时间预测的“过度拟合”,我会使用 2 小时 ARIMA 拟合。提醒我,我对预测特定时间间隔并不特别感兴趣,但我有兴趣使用许多测试的结果来尝试得出关于根据我的数据预测 ARIMA 模型的结论。当它做得好或不好时(与其他方法相比,使用 MAPE)。问题是我必须每 2 小时一次又一次地拟合一个 ARIMA 模型,然后累积结果。

3.1 但是考虑到我有 6 个月的数据,这不是很实用,不是吗?那么有人对如何解决这个问题有任何建议吗?我应该每天取样吗?

问题#4:

在我所做的几十个拟合 ARIMA 测试中,没有一个在残差的 ACF 上产生“白噪声”!(还测试了其他订单,其他季节性时段)。相反,有 2 个滞后明显超出区间(滞后 11 和 19)。 4.1 是否有可能遇到这样的情况,即您找不到在残差的 ACF 上产生“白噪声”的正确模型?还是暗示我的分析应该有问题?

**问题问题#5:

(特别是与 Python 和一般的趋势 = 'c' 相关)** 在我迄今为止在文献中看到的示例中,对固定数据的关注很少(大多数是非固定的,可能是因为大多数是金融数据..)。

5.1 因此,当我将趋势参数设置为常量('trend'='c')时,我不明白为什么无法预测静态数据,但将其设置为非('trend'='n ')?

我在python(statsmodels)上使用了它,所以我不知道这是否是函数的问题,或者添加一个常量是不明智的。对于那些使用 statsmodels 的人:

import statsmodels.api as sm 

arima_fit =  sm.tsa.SARIMAX(data_set, order = (2,0,0), seasonal_order = (1,0,0,60), trend = 'c').fit() 
data_forecast = arima_fit.predict('period start', 'period end', dynamic = True)

我收到以下错误:“ ValueError:预测具有时变 state_intercept 矩阵的模型需要更新的时变矩阵来预测期间。

我对时间序列比较陌生,所以请原谅我的问题很简单。关于文献和例子,到目前为止,我找不到任何例子来处理我在 ARIMA 模型中的数据(非常高的频率)中的特征。因此,如果有人可以推荐一些东西,那就太棒了。

3个回答

问题一:

问题在于,在 MLE 案例中,Python(statsmodels)和 R 程序都使用状态空间模型来估计可能性。在 SARIMAX 类中,状态空间随季节数线性增长(或更差)(因为状态空间形式也包含所有中间滞后 - 所以如果你有 3600 的滞后,状态空间形式也有所有3599 个中间滞后)。

所以你现在有几个问题 - 首先,你将 3600 多个矩阵相乘,这很慢。更糟糕的是,状态空间模型需要初始化,并且通常默认使用需要求解 3600 线性系统的固定初始化来初始化它们。当我测试一个 3600 季节性订单时,它甚至没有超过这部分。

R arima 函数接受 method='CSS' ,它使用最小二乘法(条件 MLE 而不是完整 MLE)来解决问题。根据 arima 函数的工作方式,在您的情况下它可能会好得多。

在 Python 中,没有很多好的选择。SARIMAX 类接受一个conserve_memory选项,但如果你这样做,你就无法预测。求解初始化问题,可以调用initialize_approximate_diffuse方法避免3600线性系统求解。但是,即使在这些情况下,您也会将 3600 x 3600 矩阵相乘,这会非常慢。我想更新 SARIMAX 类以使用稀疏矩阵(这将解决这个问题),但这可能是未来的一种方式。我不知道任何使用稀疏矩阵实现状态空间模型的非商业程序。

问题 #5:

这是 statsmodels 代码中的一个错误。它已在存储库中修复(请参阅https://github.com/ChadFulton/statsmodels/issues/2

关于问题#1:

也许您可以在估计 ARIMA 模型之前尝试进行季节性调整。我不确定它是否会有所帮助,但您至少可以尝试一下。例如,非参数季节性调整程序,如 R 中的 STL。

关于问题#4:

如果您有一个标记了置信区间的 ACF 图,那么一个或几个自相关条突出(不适合区间内)也就不足为奇了。即使人口中没有非相关性,这也可能由于纯粹的机会而发生。原因如下:如果您有 90% 的置信区间,那么平均而言,当零假设在任何滞后都成立。那是“内置”置信区间的定义。

我认为您应该重新审视“秒”级别的分析要求。它解决什么目的?例如,如果分析是为了标记时间序列中的异常,它是否给运营团队足够的反应时间来深入分析和采取纠正措施?

如果这是出于预测目的,它是否有助于用户预测接下来 n 秒的变量?

在运营分析领域工作过,我可以说时间序列数据中超过 15-20 分钟的预测/分类粒度弊大于利,例如: 1. 更高的粒度会降低信噪比和您的技术需要对噪声具有高度鲁棒性。2. 不能解决太多目的(除非是 AML 类型的问题) 3. 会给您的硬件带来巨大的负载,尤其是在处理多变量情况时(例如跟踪应用程序的 1000 个指标并标记整个应用程序的异常情况)