案例-基于自动PDQ值的ARIMA时间序列预测应用
“基于Python的statsmodels库,实现ARMA/ARIMA时间序列预测的完整自动化流程。针对模型参数(p,d,q)选择难点,通过封装平稳性与白噪声检验,并结合BIC最小化原则遍历算法,实现自动寻优与模型训练。全流程涵盖数据预处理、平稳化还原、模型评估及未来预测,大幅降低时间序列算法的实际应用门槛。”
Python 时间序列分析:基于 statsmodels 的 ARMA/ARIMA 自动参数寻优与预测
Python 的科学计算和数据挖掘相关库中,pandas 和 statsmodels 都提供了时间序列相关分析功能。本示例使用的是 statsmodels 做时间序列预测应用。有关时间序列算法的选择,实际场景中最常用的是 ARIMA 或 ARMA,因此本示例将使用 ARIMA/ARMA 来做时间序列分析。
对于这两种时间序列方法而言,应用的难点在于如何根据不同的场景判断参数值(即 p、d、q)。本示例将设置判断阈值,通过自动化的程序方式来完成自动的 ARIMA/ARMA 参数选择以及模型训练,大幅降低时间序列算法的应用难度。
背景说明:示例中模拟的是针对具有时间序列特征的数据集做未来时间序列的预测。数据源文件
time_series.txt可以从《Python数据分析与数据化运营》的“附件-chapter4”中找到。
一、 核心功能模块封装
为了实现自动化的时间序列分析,我们将整个流程拆解为多个功能函数。
1. 导入依赖库
statsmodels 库里面的 plot_acf、plot_pacf 用于 ACF 和 PACF 图形检验分析,adfuller、acorr_ljungbox 用于 ADF 检验和随机性检验,ARMA 库做时间序列分析,matplotlib 和 prettytable 做图形和表格格式化输出。
python
💡 提示:ARIMA 与 ARMA 的选择 ARIMA 相对于 ARMA 多了一步差分的过程。但是由于
statsmodels中的 ARIMA 对差分的支持不太好,最多只能做 2 阶差分,其实用性会大打折扣(其实 2 阶差分已经可以满足 90% 以上的场景了)。所以在实际应用中,我们通常会手动做数据平稳性处理,然后将平稳数据传给 ARMA 模型做训练,以此完成 ARIMA 的时间序列分析。
2. 格式化表格输出:pre_table
该函数用来展示格式化表格数据,方便每次展示时调用而无需重复编写代码。
参数说明:
table_name:表格名称,字符串列表。table_rows:表格内容,嵌套列表。考虑到可能会有批量添加的模式,数据记录行需要转换为嵌套列表的形式(例如[[1,2,3,4], [2,2,3,4]];即使只有一条记录,也要写成[[1,2,3,4]])。
python
3. 数据平稳性处理:get_best_log
该函数用于数据平稳处理。先通过 rule1 和 rule2 判断输入的两个规则是否同时满足,如果满足则说明时间序列是平稳的,无需处理;否则使用对数方法(numpy.log)做平稳性处理。
参数说明:
ts:时间序列数据,Series 类型。max_log:最大 log 处理的次数,默认值为 5,int 型。rule1:rule1 规则布尔值,默认值为 True。rule2:rule2 规则布尔值,默认值为 True。
python
💡 知识点拓展:时间序列数据的平稳性 平稳性是做时间序列分析的前提条件。通俗理解就是数据没有随着时间呈现明显的趋势和规律(如剧烈波动、递增、递减等),而是相对均匀且随机地分布在均值附近。在 ARIMA 模型中的 I 就是对数据做差分以实现平稳,关键参数 p、d、q 中的 d 即时间序列成为平稳时所做的差分次数。
如何判断是否需要平稳性处理?
- 观察法:通过输出时间序列图发现数据是否平稳。
- 自相关和偏相关法:通过观察自相关和偏相关的系数分析数据是否平稳。
- ADF 检验:通过 ADF 检验得到的显著性水平分析数据是否平稳。
实现数据平稳的常用方法:
- 对数法:减小数据的波动,使其线性规律更加明显(仅限值大于 0 的数据集)。
- 差分法:非纯随机的时间序列经一阶或二阶差分后通常会变得平稳。
- 平滑法:分为移动平均法和指数平均法。
- 分解法:将时序数据分离成成长期趋势、季节趋势和随机成分等。
4. 平稳化数据还原:recover_log
在经过平稳性处理之后,原有的时间序列训练集已经被更改,通过 ARMA 得到的预测数据也是经过平稳处理后的数据,必须经过还原才能投入实际使用。
python
5. 平稳性检验:adf_val
该函数实现了时间序列图、ACF 图、PACF 图、ADF 检验数据等多种检验方法的数据和图形输出。返回的 ADF 值、P 值等将用来构成 rule1 的判断规则。
python
6. 白噪声(随机性)检验:acorr_val
该函数用于白噪声检验,返回的 P 值用来做 rule2 判断规则的参数值。
python
💡 知识点拓展:白噪声检验 白噪声(White Noise)检验也称为随机性检验,用于检验时间序列的各项数值之间是否具有任何相关关系。检测方法包括:
- 图形法:时间序列应该是围绕均值随机性上下分布的状态。
- Ljung-Box 法:对时间序列是否存在滞后相关的一种统计检验。
白噪声检验通常和平稳性检验协同进行,如果平稳性检验通过,白噪声检验一般也会通过。
7. ARMA 最优模型训练:arma_fit
该模型实现的是基于给定的时间序列数据,自动寻找 BIC 最小时的 p 和 q 的阶数,并形成训练好的 ARMA 模型。
python
⚠️ 注意与知识点:statsmodels 中的 ARMA
statsmodels中的 ARMA 通过应用fit方法后,返回的对象是一个ARMAResults类,而不再是原有的model本身(这一点跟sklearn不同)。因此无法直接通过model本身获取参数和评估指标,必须通过ARMAResults来获取。关于 p 和 q 的选择:
- 人工观察法:观察 ACF 和 PACF 图,通过截尾、拖尾等信息分析。
- 程序遍历法(本例采用):通过循环遍历所有条件,并依据 AIC、BIC 最小原则自动确定阶数。
8. 模型训练与效果评估:train_test
该函数可将训练的时间序列内预测值与实际值做比较,并输出 RMSE(均方根误差) 和时间序列对比图。
python
9. 未来数据预测:predict_data
该函数用来预测未来指定时间项的数据,并将原始时间序列(实线)和预测的时间序列(虚线)输出到一个图像中。
python
二、 实战应用:时间序列预测完整流程
在完成上述核心模块的封装后,我们将按照以下 8 个步骤执行完整的预测流程。
步骤 1:读取与预处理数据
先通过 lambda 函数定义一个日期解析器,配合 pandas.datetime.strptime 将字符串解析为日期格式。
python
步骤 2:原始数据检验
直接调用定义好的稳定性检验和白噪声检验函数,传入原始时间序列数据。
python




指标分析:如果时间序列具有稳定性,ADF 的值需要小于 critical_values 中的 1%、5% 和 10% 的三个值,且 P 值一般小于 0.01。在白噪声检验中,P 值需要小于 0.05 即说明数据是随机分布的。从结果看,示例数据恰好满足条件。
步骤 3:定义平稳性处理规则
基于步骤 2 的返回结果,定义 ADF 的 P 值和白噪声检验的 P 值的阈值规则。
python
步骤 4:执行平稳性处理
如果数据符合平稳性,则不需要处理;否则循环处理直到满足阈值要求。由于示例数据已满足条件,此处直接返回 0 和原始数据集。
python
步骤 5:复检数据平稳性
再次做检验。由于没有做任何处理,返回的结果仍然跟步骤 2 相同。
python
步骤 6:训练最佳 ARMA 模型
调用 arma_fit 自动寻找最优参数并训练模型。(交互窗口可能会有警告信息,忽略即可)。
python

步骤 7:模型内测与效果评估
通过最优模型对训练集做时间序列内的预测,并与原始数据做对比,输出 RMSE。
python

步骤 8:未来时间序列预测
设置预测起止时间(1991-07-28 至 1991-08-02),调用 predict_data 做预测分析。
python


三、 关键点与实操小结
在上述完整的预测流程中,核心需要关注以下几个业务逻辑节点:
- 数据平稳性处理:判断与执行。
- p 和 q 阶数评估:除了人工观察 ACF/PACF 图,采用 AIC/BIC 遍历是一种高效的自动化方法。
- 数据还原:在做数据平稳性处理(如 log)之后,务必注意逆向还原数据,否则预测结果将失去业务意义。
- 模型复用:ARMA 模型在做最优训练后,可直接返回模型对象给其他程序调用,无需重复训练。
代码实操技巧总结:
- 采用
def函数式编程封装独立功能模块,并编写规范的 Doc String。 - 使用
prettytable库(add_row、field_names)实现终端的优雅表格输出。 - 熟练运用
statsmodels库中的plot_acf、plot_pacf、adfuller、acorr_ljungbox等检验工具。 - 掌握基于 AIC/BIC 最小化原则 自动选择 ARMA 模型 p、q 阶数的代码逻辑。
- 灵活使用
lambda表达式与datetime.strptime配合pandas.read_table解决非标准时间格式的解析问题。
