三亩地 三亩地SAN MU DI · CODE DIARY
ARTICLE DETAIL

日记详情

真实记录编程学习的某一天,欢迎挑你感兴趣的翻一翻。

时间序列建模第一步:用Matlab的adftest为你的ARIMA模型挑选平稳数据(附差分处理全流程)

时间序列建模第一步:用Matlab的adftest为你的ARIMA模型挑选平稳数据(附差分处理全流程)

时间序列建模实战:从ADF检验到ARIMA模型定参的完整指南

当你面对一组销售数据、股价走势或其他时间序列时,是否曾困惑于如何判断这些数据是否适合直接建模?现实世界中的时间序列数据往往带有趋势或季节性,直接套用ARIMA等经典模型可能导致预测失效。本文将带你用Matlab的adftest函数,系统性地解决这一核心问题。

1. 为什么平稳性检验是时间序列建模的基石

想象你正在分析某电商平台的月度销售额数据。原始数据曲线呈现明显的上升趋势——这意味着每个数据点的统计特性(如均值、方差)随时间变化。这种非平稳性会破坏ARIMA等线性模型的基本假设,导致虚假回归或预测偏差。

ADF检验(Augmented Dickey-Fuller test)正是为解决这一问题而生。它通过检验时间序列是否存在单位根(unit root)这一数学特征,来判断序列是否具有平稳性。与简单的目视检查不同,ADF检验提供了统计量化的判断依据:

  • 原假设(H₀):序列存在单位根(非平稳)
  • 备择假设(H₁):序列不存在单位根(平稳)

在Matlab中,adftest函数封装了完整的ADF检验流程。但仅仅知道如何调用函数远远不够——关键在于理解检验结果如何指导后续建模决策。例如,当检验显示原始数据非平稳时,我们需要通过差分运算将其转化为平稳序列,而这个差分次数正是ARIMA模型中关键的d参数

实际案例:某零售企业分析2015-2023年销售额数据时,原始序列ADF检验p值=0.89(显著非平稳),一阶差分后p值=0.12,二阶差分后p值=0.003。最终确定ARIMA(p,d,q)中的d=2。

2. Matlab中adftest的深度应用技巧

2.1 函数调用与参数解析

adftest函数提供多种调用方式,适应不同分析需求:

% 基础调用(默认显著性水平0.05) h = adftest(salesData); % 完整输出模式(推荐) [h, pValue, testStat, critValue] = adftest(gdpData, 'alpha', 0.01);

关键参数说明

参数类型作用典型值
y数值向量待检验时间序列任何单变量序列
alpha标量显著性水平0.01, 0.05, 0.1
model字符串检验模型类型'ARD', 'TS', 'AD'

输出结果的多角度解读

  1. 假设检验视角

    • h=1:拒绝原假设(平稳)
    • h=0:不拒绝原假设(非平稳)
  2. 概率视角

    • pValue < alpha:序列平稳
    • pValue >= alpha:序列非平稳
  3. 统计量视角

    • testStat < critValue:平稳
    • testStat >= critValue:非平稳

2.2 检验结果的可视化验证

永远不要完全依赖单一检验结果。结合图形分析能大幅降低误判风险:

figure subplot(2,1,1) plot(originalData) title('原始序列') subplot(2,1,2) plot(diff(originalData)) title('一阶差分序列') % 执行ADF检验 [h, p] = adftest(diff(originalData));

常见数据模式与处理建议:

  • 上升趋势:通常需要一阶差分
  • 季节性波动:可能需要季节差分
  • 方差变化:考虑对数变换后再差分

3. 从ADF检验到ARIMA建模的完整工作流

3.1 差分阶数的系统确定方法

通过迭代ADF检验确定最优差分次数:

data = xlsread('sales_data.xlsx'); d = 0; while true [h, p] = adftest(data); if h == 1 break; end data = diff(data); d = d + 1; if d > 2 % 防止过度差分 break; end end fprintf('建议差分次数d=%d\n', d);

差分决策矩阵

序列类型ADF结果处理建议
原始序列平稳d=0
一阶差分平稳d=1
二阶差分平稳谨慎评估是否需要d=2
所有差分非平稳考虑其他变换或模型

3.2 与ARIMA模型参数的协同确定

ADF检验确定的d参数需要与ACF/PACF分析结合:

  1. 对差分后平稳序列绘制自相关图:

    autocorr(diffData) partialcorr(diffData)
  2. 根据截尾特征确定ARIMA的p和q参数

  3. 完整模型构建示例:

    Mdl = arima('ARLags',1,'D',1,'MALags',1); EstMdl = estimate(Mdl, salesData);

经验提示:当ADF检验显示需要d=2时,建议同时检查序列是否真的需要二阶差分,或是否存在结构突变需要分段建模。

4. 实战中的陷阱与进阶技巧

4.1 避免常见分析误区

  • 过度差分问题:虽然差分可以使序列平稳,但过度差分会导致信息损失和模型复杂度增加
  • 结构性变化误判:如COVID疫情期间的销售数据突变可能被误判为非平稳
  • 季节性忽视:纯ADF检验可能遗漏季节性非平稳,需结合季节差分

4.2 增强鲁棒性的组合策略

  1. 多检验方法验证

    • 结合KPSS检验(与ADF假设相反)
    • 使用PP检验作为补充
  2. 滚动窗口检验法

    windowSize = 24; % 两年月度数据 for i = 1:length(data)-windowSize [h(i), p(i)] = adftest(data(i:i+windowSize)); end
  3. 自动化建模工具

    Mdl = autoarima(data, 'D', 0:2, 'Criterion', 'aic');

4.3 非平稳数据的替代处理方案

当差分效果不佳时,可考虑:

  • 趋势移除:先拟合线性/多项式趋势,再对残差建模
  • 转换方法:对数变换、Box-Cox变换
  • 现代模型:状态空间模型、机器学习方法
% Box-Cox变换示例 [transData, lambda] = boxcox(originalData); [h, p] = adftest(transData);

在金融数据分析项目中,我们发现原始股价数据ADF检验p值=0.78,经过对数变换后p值降至0.04,成功实现平稳化而无需差分。这种变换同时稳定了方差,一举两得。

← 返回列表