Python实战:用ACF和PACF图快速诊断ARIMA模型参数(附完整代码)
每次面对一堆时间序列数据,想用ARIMA模型做预测,最头疼的往往不是写代码,而是怎么确定那三个神秘的参数:p、d、q。网上教程要么讲得云里雾里,要么直接甩给你一个自动定阶函数,结果模型效果时好时坏,自己心里完全没底。其实,ACF(自相关函数)和PACF(偏自相关函数)图,就是解开这个谜题最直观的“钥匙”。它们不是什么黑魔法,而是时间序列自身记忆模式的“心电图”。今天,我们就抛开那些复杂的公式推导,直接上手Python,通过看图说话,一步步掌握ARIMA模型定阶的核心心法。
1. 理解ARIMA的“三驾马车”:p, d, q到底是什么?
在开始看图之前,我们必须先搞清楚ARIMA(p, d, q)这三个参数究竟在模型里扮演什么角色。很多人一上来就急着画图,结果对图上的信息一知半解,自然无法做出准确判断。
ARIMA模型可以看作三个部分的组合:
- AR(p) - 自回归部分:当前值可以表示为过去p个时期值的线性组合,再加上一个随机误差。它捕捉的是序列自身的“记忆”或“惯性”。比如,今天的股价很大程度上受到昨天、前天股价的影响。
- I(d) - 差分部分:为了让非平稳序列变得平稳而进行的差分次数。平稳性是时间序列分析的一个核心假设,简单说就是序列的统计特性(如均值、方差)不随时间变化。差分是消除趋势和季节性的常用手段。
- MA(q) - 移动平均部分:当前值可以表示为过去q个时期预测误差的线性组合。它捕捉的是序列受到的“冲击”或“噪声”的持续影响。例如,一个突发事件(如政策发布)对市场的影响可能会持续一段时间。
那么,ACF和PACF图,就是分别用来初步判断q和p这两个关键参数的视觉化工具。理解这一点,是正确解读图形的第一步。
注意:ACF/PACF图定阶法更适用于纯粹的AR或MA模型,或者ARMA模型中某一项特征非常明显的情况。对于复杂的混合模型,它提供的是重要的参考线索,而非唯一标准。
2. 实战准备:环境搭建与数据平稳性检验
理论说再多,不如一行代码。我们首先搭建一个可复现的分析环境,并理解所有操作的起点:确保时间序列是平稳的。非平稳序列的ACF/PACF图会呈现缓慢衰减的特征,这会严重干扰我们对p和q的判断。
2.1 核心库安装与导入
确保你的Python环境已安装以下核心库。如果使用Anaconda,大部分库已预装。
# 如果使用pip,可执行以下命令安装必要库
pip install pandas numpy matplotlib statsmodels
接下来,在Jupyter Notebook或Python脚本中导入它们。
# 基础数据处理与可视化
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
plt.style.use('seaborn-v0_8-darkgrid') # 使用更美观的绘图样式
%matplotlib inline
# 时间序列分析核心库
from statsmodels.tsa.stattools import adfuller # ADF单位根检验
from statsmodels.graphics.tsaplots import plot_acf, plot_pacf # ACF/PACF绘图
from statsmodels.tsa.arima.model import ARIMA # ARIMA模型
import warnings
warnings.filterwarnings('ignore') # 忽略部分不影响结果的警告
2.2 加载数据与初步观察
我们使用一个经典的示例数据集:1949年至1960年的国际航空乘客数据。这个数据有明显的趋势和季节性,非常适合演示完整的处理流程。
# 加载数据
url = "https://raw.githubusercontent.com/jbrownlee/Datasets/master/airline-passengers.csv"
df = pd.read_csv(url, parse_dates=['Month'], index_col='Month')
series = df['Passengers']
# 绘制原始时序图
fig, ax = plt.subplots(figsize=(12, 6))
series.plot(ax=ax, title='International Airline Passengers (1949-1960)')
ax.set_ylabel('Passengers (Thousands)')
ax.set_xlabel('Date')
plt.show()
运行这段代码,你会看到一个明显向上增长且带有周期性波动的曲线。这种序列就是典型的非平稳序列。
2.3 平稳性检验:ADF测试
我们不能直接对这样的数据画ACF/PACF图。必须先通过差分使其平稳。但差分多少次(d值)合适呢?我们需要一个客观的统计检验——Augmented Dickey-Fuller (ADF) 检验。
def adf_test(timeseries):
"""执行ADF检验并打印清晰结果"""
print('='*50)
print('Augmented Dickey-Fuller Test')
print('='*50)
result = adfuller(timeseries, autolag='AIC')
# 整理输出
output = pd.Series(result[0:4], index=['Test Statistic', 'p-value', '#Lags Used', 'Number of Observations Used'])
for key, value in result[4].items():
output[f'Critical Value ({key})'] = value
print(output.to_string())
print('\n')
# 判断结论
if result[1] <= 0.05:
print("-> 结论:p值 = {:.4f}。拒绝原假设,数据是平稳的。".format(result[1]))
else:
print("-> 结论:p值 = {:.4f

&spm=1001.2101.3001.5002&articleId=153712189&d=1&t=3&u=06b35b6a240c4777af7424b02651c394)
13万+

被折叠的 条评论
为什么被折叠?



