跳至主要内容

ARIMA 时间序列预测:完整指南

了解 ARIMA 模型的关键组成部分,如何在 Python 中构建并优化以获得准确预测,并探索其在各行业的应用。
· 12分钟 阅读

使用 AI 探索

让我们来看看 ARIMA,这是一种最受欢迎的(甚至可能是最受欢迎的)时间序列预测技术。ARIMA 之所以流行,是因为它能够同时捕捉自回归(AR)和移动平均(MA)成分,并通过差分(I)来处理非平稳性,从而有效建模时间序列数据。这种组合使 ARIMA 模型非常灵活,因此被广泛用于金融、天气预报等截然不同的行业。 

ARIMA 模型技术性很强,但我会拆解其组成部分,帮助您建立扎实的理解。在开始之前,建议先熟悉一些基础工具。DataCamp 提供了许多优质资源,例如我们的 Python 中的 ARIMA 模型 或 R 中的 ARIMA 模型 课程。您可根据偏好的语言进行选择。 

为何使用 ARIMA 预测? 

在金融、经济学与环境科学等领域,ARIMA 备受关注,因为它能够从过去观测中识别复杂模式并满足未来预测需求,使其成为前沿技术。从预测股票价格、预报天气模式到把握消费者需求,ARIMA 都是生成准确且可付诸行动的预测分析的有力方法。

借助 ARIMA,我们能够以更高级的方式分析和预测时间序列数据,兼顾模式、趋势与季节性。这有助于从全局视角把握内在动态,从而做出更明智的决策。

ARIMA 模型的关键组成部分

要真正理解 ARIMA,需要把它的构件逐一拆解。掌握了这些部分,就更容易理解这种时间序列预测方法作为整体是如何运作的。下面我将对每个组成部分做详细说明。

自回归(AR)部分

自回归(AR)成分通过历史取值在 AR 框架中构建趋势以进行预测。为便于理解,“自回归框架”的工作方式类似回归模型,但使用该时间序列自身的滞后值作为自变量。

差分(I)部分

差分(I)部分涉及对时间序列进行差分,以保证序列是平稳的,即均值与方差在一段时间内保持不变。基本做法是用相邻观测值相减,从而去除趋势和季节性。通过差分我们可以获得平稳性。这一步是必要的,因为它有助于模型拟合数据本身而非噪声。

移动平均(MA)部分 

移动平均(MA)成分关注观测值与残差误差之间的关系。通过考察当前观测与过去误差之间的关系,我们可以推断数据中可能存在的趋势信息。

我们可以将这些误差中的残差纳入考虑,移动平均模型会估计或衡量它们对最新观测的影响。这对于捕捉数据中的短期变化或随机冲击尤为有用。通过时间序列的(MA)部分,我们能获取关于其行为的有价值信息,从而实现更高准确度的预测。

如何在 Python 中构建 ARIMA 模型

若要构建用于预测(例如黄金价格)的 ARIMA 模型,您可以按以下步骤进行。我们一起来分解。

数据收集 

第一步是准备合适的数据集并搭建环境。

查找数据集

从数据平台收集或搜索数据集。您需要包含随时间变化的历史数据。这里有一个与黄金期货价格相关的 Kaggle 数据集链接。 

安装依赖包

安装所需的包,包括 statsmodels 和 sklearn。 

import pandas as pdimport matplotlib.pyplot as pltfrom statsmodels.tsa.stattools import adfullerfrom statsmodels.graphics.tsaplots import plot_acf, plot_pacffrom statsmodels.tsa.arima.model import ARIMAfrom sklearn.metrics import mean_squared_error

加载数据

然后将数据读入本地环境。我会额外确保日期能被正确识别和排序。

# Define the path to your CSV file# You may have to make this path more specific to the location of your file.csv_path = "future-gc00-daily-prices.csv"# Read the CSV, parse 'Date' column as datetime, and set it as the indexdata = pd.read_csv(    csv_path,    parse_dates=["Date"],    dayfirst=False,    index_col="Date")# Sort the DataFrame by the Date index in ascending orderdata.sort_index(inplace=True)

数据预处理 

我们的数据集相当干净,但在其他情境下,我们需要处理索引问题,这对时间序列预测很重要。比如,当我们要预测某个交易所股票的收盘价时,需要考虑股市在周末休市。

继续之前,我还会快速把 Close 变量(我们将要使用的变量)中的逗号去掉。

# Clean the "Close" columndata["Close"] = data["Close"].replace(',', '', regex=True)data["Close"] = pd.to_numeric(data["Close"], errors='coerce')data["Close"].replace([np.inf, -np.inf], np.nan, inplace=True)data.dropna(subset=["Close"], inplace=True)

处理缺失值

作为数据预处理的一部分,我们经常需要考虑使用如前向填充或均值替换等插补方法如何处理缺失值。请注意,即便只有一个 NA 值,也可能(取决于编程语言和所用库)导致 ARIMA 无法运行。

我之前提到过,周末日期可能会被识别为 NA。确实可能如此,需要额外步骤。幸运的是,statsmodels 将数据视为顺序索引,而不严格要求等间隔时间,从而允许我们的模型在存在周末空缺的情况下仍可运行。 

绘制时间图

现在是绘制时间图的好时机,以便直观看到我们要处理的序列: 

# Plotting the original Close priceplt.figure(figsize=(14, 7))plt.plot(data.index, data["Close"], label='Close Price')plt.title('Close Price Over Time')plt.xlabel('Date')plt.ylabel('Close Price')plt.legend()plt.show()

ARIMA time plot

检查平稳性并在必要时进行差分

虽然 ARIMA 模型在一定程度上能处理非平稳性,但无法有效应对随时间变化的方差。换言之,要让 ARIMA 真正奏效,数据必须是平稳的。

从上图可以看出,数据并不平稳,因为存在明显的趋势。同时,在不同时间点方差似乎也不恒定。我们可以使用增强型 Dickey-Fuller(ADF)检验来验证直观判断,看看数据的均值与方差是否恒定,并以数值量化。 

# Perform the Augmented Dickey-Fuller test on the original seriesresult_original = adfuller(data["Close"])print(f"ADF Statistic (Original): {result_original[0]:.4f}")print(f"p-value (Original): {result_original[1]:.4f}")if result_original[1] < 0.05:    print("Interpretation: The original series is Stationary.\n")else:    print("Interpretation: The original series is Non-Stationary.\n")# Apply first-order differencingdata['Close_Diff'] = data['Close'].diff()# Perform the Augmented Dickey-Fuller test on the differenced seriesresult_diff = adfuller(data["Close_Diff"].dropna())print(f"ADF Statistic (Differenced): {result_diff[0]:.4f}")print(f"p-value (Differenced): {result_diff[1]:.4f}")if result_diff[1] < 0.05:    print("Interpretation: The differenced series is Stationary.")else:    print("Interpretation: The differenced series is Non-Stationary.")
ADF Statistic (Original): -1.4367p-value (Original): 0.5646Interpretation: The original series is Non-Stationary.ADF Statistic (Differenced): -19.1308p-value (Differenced): 0.0000Interpretation: The differenced series is Stationary.

ADF 检验结果表明,原始序列确实是非平稳的,因此直接在原始数据上使用开箱即用的 ARIMA 是不合适的。

但对差分后的数据进行 ADF 检验则显示其为平稳序列。

关于差分的快速说明。我想花点时间解释一下,因为其中有不少“底层”细节。进行差分时,我们用每个观测减去其前一个观测,得到一个一阶差分的新时间序列。(该新序列比原序列少一个元素。)如果差分后的序列仍不平稳,我们可以对原始序列进行二阶差分,并可以持续进行差分,直至序列变为平稳。所需的差分阶数,就是使序列不再自相关所需的最小差分次数。

最后提醒一句——不要进行超过必要的差分,否则可能在数据中引入虚假动态。另外,如果要做季节性 ARIMA(本教程不涉及),通常应先考虑季节差分,再考虑一次差分。

# Plotting the differenced Close priceplt.figure(figsize=(14, 7))plt.plot(data.index, data['Close_Diff'], label='Differenced Close Price', color='orange')plt.title('Differenced Close Price Over Time')plt.xlabel('Date')plt.ylabel('Differenced Close Price')plt.legend()plt.show()

ARIMA time series with a first difference

模型识别

构建 ARIMA 模型时,我们需要考虑模型中的 p、d 和 q 项。 

  • 第一个参数 p 是滞后观测的数量。通过考虑 p,我们实际上是在决定为预测当前观测需要回溯多远的历史。我们通过查看时间序列的自相关(即序列在此前各滞后期的相关性)来实现这一点。 
  • 第二个参数 d 指的是差分阶数,我们已讨论过。再次强调,差分就是计算相邻时间步之间的差值。它能让数据变为平稳,即去除趋势与随时间变化的方差。 d 表示在第几阶差分后得到平稳过程。
  • 第三个参数 q 指的是模型中移动平均(MA)部分的阶数。它表示模型包含的滞后预测误差的数量。与简单移动平均(平滑数据)不同,ARIMA 中的移动平均捕捉的是一个观测与应用于滞后观测的移动平均模型所产生残差之间的关系。

确定 ARIMA 的各项

我们使用 ACF(自相关函数)与 PACF(偏自相关函数)等工具来确定 p、d 与 q 的取值。ACF 截尾的滞后数对应 q,PACF 截尾处对应 p。我们还需选择合适的 d 值,目标是在差分后让数据近似白噪声。针对我们的数据,我们为 p 与 q 都选择 1,因为在各自的一阶滞后处出现了显著峰值。

from statsmodels.graphics.tsaplots import plot_acf, plot_pacfimport matplotlib.pyplot as plt# Plot ACF and PACF for the differenced seriesfig, axes = plt.subplots(1, 2, figsize=(16, 4))# ACF plotplot_acf(data['Close_Diff'].dropna(), lags=40, ax=axes[0])axes[0].set_title('Autocorrelation Function (ACF)')# PACF plotplot_pacf(data['Close_Diff'].dropna(), lags=40, ax=axes[1])axes[1].set_title('Partial Autocorrelation Function (PACF)')plt.tight_layout()plt.show()

ARIMA ACF and PACF plots

参数估计 

需要明确的是,ARIMA 中的 p、d、q 表示模型阶数(自回归滞后、差分与移动平均项),但它们并非实际被估计的参数。一旦选定 p、d、q,模型会通过极大似然估计(MLE)来估计其他参数,如自回归项与移动平均项的系数。

预测

要使用 ARIMA 模型进行预测,首先用已拟合的模型基于数据预测未来值。完成预测后,将预测值与实际值一起可视化会很有帮助。这依赖于训练/测试工作流:将数据划分为训练集与测试集。这样即可检验模型在未见过的数据上的表现。如果对此不太清楚,可以学习我们的 Python 中的模型验证 课程,这是了解训练与测试方方面面的优质资源。

1. 使用训练/测试工作流

第一步是将数据拆分为训练集与测试集。 

# Split data into train and testtrain_size = int(len(data) * 0.8)train, test = data.iloc[:train_size], data.iloc[train_size:]# Fit ARIMA modelmodel = ARIMA(train["Close"], order=(1,1,1))model_fit = model.fit()

2. 可视化时间序列

接下来创建预测并进行可视化检查。我们可以看到预测相对测试集数据的表现。

# Forecastforecast = model_fit.forecast(steps=len(test))# Plot the results with specified colorsplt.figure(figsize=(14,7))plt.plot(train.index, train["Close"], label='Train', color='#203147')plt.plot(test.index, test["Close"], label='Test', color='#01ef63')plt.plot(test.index, forecast, label='Forecast', color='orange')plt.title('Close Price Forecast')plt.xlabel('Date')plt.ylabel('Close Price')plt.legend()plt.show()

ARIMA 预测:实际值 vs. 预测值。作者供图

3. 评估模型统计量

查看 AIC 与 BIC 等模型统计量。数值越低表示拟合越好,但也应与更简单的模型进行比较以避免过拟合。此处我直接打印了数值,但它们在与同一数据上的其他 ARIMA 模型对比时更有意义,以便找到表现最佳的 ARIMA 模型。

print(f"AIC: {model_fit.aic}")print(f"BIC: {model_fit.bic}")
AIC: 24602.97426066606BIC: 24620.97128230579

我们还可以评估均方误差,以衡量模型拟合。这是一个实用指标。更低的 RMSE 表明更好的 ARIMA 模型,意味着实际值与预测值之间的差异更小,且与数据量纲一致。也就是说,RMSE 为 118.5339 表示我们的模型预测与实际 Close 价格平均相差约 118.53 美元。

forecast = forecast[:len(test)]test_close = test["Close"][:len(forecast)]# Calculate RMSErmse = np.sqrt(mean_squared_error(test_close, forecast))print(f"RMSE: {rmse:.4f}")
RMSE: 118.5339

ARIMA 预测的常见应用 

现在,我们来讨论 ARIMA 在不同行业中的应用。从经济与金融到天气预报与医疗健康,多个领域都会借助 ARIMA 模型从数据中提取洞见并追求预测准确性。主要包括以下方面:

经济与金融 

ARIMA 的优势在于能够处理金融时间序列中常见的复杂自相关以及多种经济指标之间的相互作用。其建模滞后效应和引入差分的能力,使其非常适合预测股票价格或汇率等波动性指标。

  • 金融预测:通过预测股票价格、汇率和其他金融工具,ARIMA 可用于支持投资策略。
  • 经济建模:ARIMA 模型有助于预测一国或全球经济的走向,为经济政策决策提供信息。
  • 需求规划:ARIMA 预测消费品与服务的需求,帮助优化生产计划并控制库存。

天气预报

ARIMA 模型利用历史天气模式提供短期和长期预测,既可预测常态天气,也可应对极端天气情况,具备足够灵活性。

  • 温度与降水预测:ARIMA 模型用于短期与长期天气预报,并可纳入海气相互作用等多种因素。 
  • 气候变化建模:ARIMA 模型利用历史气象数据更好地理解气候趋势,并预测未来气候。

供应链管理

ARIMA 对滞后效应的建模能力可帮助供应链管理者基于历史模式和提前期来管理库存或预判中断。

  • 需求预测:ARIMA 能预测产品的未来需求,进而规划生产计划或库存水平。
  • 库存管理:ARIMA 有助于维持合理的库存水平,避免过多资本被库存占用,并减少过量或缺货带来的成本。
  • 供应链优化:ARIMA 可通过分析多变量之间的相互作用(如运输延误或需求波动)来预测供应链中断。

医疗健康

在医疗领域,ARIMA 模型尤为有价值,因为它能预测住院人数及其他重要趋势。

  • 疾病暴发预测:ARIMA 模型可用于预测传染病的传播,从而为公共卫生的前瞻性干预提供依据。
  • 住院率预测:ARIMA 预测住院率,帮助优化资源配置与人员排班。
  • 患者监测:ARIMA 是专业人员分析医疗数据、预警健康问题早期迹象并制定个性化治疗方案的有用工具。

提升 ARIMA 预测效果的注意事项

以下是构建 ARIMA 模型时应避免的常见错误:

过拟合与欠拟合

如果错误选择 p、d 与 q 的取值,可能导致过拟合或欠拟合。过拟合发生在模型过于复杂、贴合了数据中的噪声,导致对新观测的泛化能力较差。相反,欠拟合意味着模型过于简单,无法捕捉潜在模式。

为防止过拟合,可以减少滞后项数量,也可能需要减少差分项。欠拟合则可在合适情况下增加自回归项的数量。应在复杂度与简洁性之间取得平衡。可以借助验证/交叉验证等技术。

平稳性

平稳性是关于数据时间依赖性的统计假设。非平稳数据会导致不可靠的预测和伪相关。可以通过差分或对数变换、季节性调整等变换手段将非平稳数据转化为平稳数据。 

季节性

在时间序列分析中,季节性的存在是另一个需要重点考虑的因素。许多现实世界的数据集会在固定间隔(如日、周、年)重复出现模式。忽视这些季节性会导致不恰当的预测。遇到季节性时,除 p 与 q 值外,还需要季节差分与季节性 AR、MA 项。请注意,一个序列可能存在多种季节性。

残差分析

ARIMA 建模中最重要的步骤之一是检查生成的残差序列是否平稳。残差是观测值与模型产生值之间的差异。通过查看残差,我们可以检验模型是否能够发现并处理数据中的动态。残差应呈随机散点分布,不应显示趋势或相关性。

当残差呈现出模式或相关性时,说明模型尚未完全捕捉到某些信息。可使用统计检验与可视化诊断(包括 Ljung-Box 检验、直方图及其他诊断图)来验证模型的充分性。

ARIMA 及相关模型的下一步

在很多情况下,ARIMA 并不是终点。正如 ARIMA 是自回归或移动平均模型的演进版,同样也出现了更新的思想。首先,ARIMA 模型本身可以处理时间序列中的线性与非线性模式。如果需要季节性预测,可以考虑 SARIMA 模型,它能处理时间序列中的多周期/周期性模式。SARIMA 在数据具有重复模式或周期行为的领域(如销售预测与天气预报)尤为实用。ARIMAX 模型也是常用选项。ARIMAX 是引入外部变量(外生回归量)的 ARIMA 模型,往往能显著提升预测的表现与准确性。

进一步进入机器学习领域,我们可以使用诸如循环神经网络(RNN) 与 LSTM 等工具深入开展时间序列分析,以预测复杂的时间依赖关系。最后,还可以关注贝叶斯时间序列分析领域,了解这种方法如何在预测与决策中带来收益。

结语 / 最后思考 

正如我们所见,ARIMA 是一种常用的统计模型,通过同时考虑自回归与移动平均要素来评估时间序列并预测未来值。它能够基于历史数据生成预测,即便某个数据集的特征与另一个数据集的特征截然不同。其适应性正是其成为常用且广泛采用的预测方法的原因。

要掌握 ARIMA 的基础,动手实践非常重要。DataCamp 提供了能够满足您学习需求的完整课程,帮助您提升并掌握 ARIMA 建模。在这些优质在线教程中,您将学习 ARIMA 建模的基础知识以及实施分析方案的实用工具与技术,以更少的精力(并在更短时间内)解决棘手的现实问题。完成学习后,您应能自如地在未来的数据科学工作中应用 ARIMA 建模。查看 DataCamp 上可用的 ARIMA 建模课程,发掘您在时间序列分析中的最大潜力:R 中的预测、R 的时间序列、Python 中的 ARIMA 模型、R 中的 ARIMA 模型。 

Zaina Saadeddin

作者

Zaina Saadeddin

我是在纳杰赫国立大学计算机科学学徒项目的兼职讲师,拥有5年软件工程经验和超过5年的数据科学领域经验。当前研究聚焦于教育科技(EdTech)以及人工智能中的(FATE),并关注“数据科学向善/社会影响”。除讲师工作外,我还是一名课后编程教育者,教授 Python 编程;同时担任技术导师,与他人分享知识,提供最新趋势与技术洞见。此外,我还是面向大学生的职业发展培训师,围绕求职技能(面试、简历制作、岗位选择、作品集、职业辅导)开展培训,助力他们在科技行业发展。

常见的时间序列预测问答

什么是 ARIMA 模型?

ARIMA(自回归积分移动平均)模型是一种常用的时间序列预测统计方法,它结合过去的观测值(AR)、通过差分实现平稳性(I)以及利用过去误差来优化预测(MA),从而预测未来数值。

ARIMA 与指数平滑有何区别?

可以说 ARIMA 模型通过自相关来刻画序列。它是一种更强大、更灵活的技术,通常用于提供稳定的长期预测。指数平滑更关注趋势与季节性,通常被认为更适合短期且波动较大的序列。

ARIMA 预测与回归建模有何关系?

ARIMA 预测与回归建模有关,因为它使用过去的取值与误差来预测未来数据点,类似于回归模型使用自变量来预测因变量。ARIMA 还通过差分处理非平稳时间序列,这与在平稳数据上使用回归技术的思路一致。与传统回归模型不同,ARIMA 明确考虑了时间依赖效应,因此更适合时间序列预测。

主题