时间序列平稳性检验是判断时间序列是否满足平稳性要求的方法,AI介绍的常见的方法有以下几种:
-
绘制时间序列图和自相关图:通过观察时间序列图和自相关图的特征,可以初步判断时间序列是否具有平稳性。
-
统计量检验:常见的统计量检验方法有ADF检验、KPSS检验、Phillips-Perron检验等。其中ADF检验用于判断时间序列是否具有弱平稳性,KPSS检验用于判断时间序列是否具有趋势稳定性,Phillips-Perron检验可用于检验具有自相关或趋势的非平稳序列。
-
平稳性转换:如果时间序列不满足平稳性要求,可以进行平稳性转换,例如差分法、对数转换等方法。
-
模型拟合:基于AR、MA、ARMA模型等,对时间序列进行拟合,通过估计残差序列的自相关和偏自相关系数,判断时间序列是否具有平稳性。
需要注意的是,通过单一的检验方法判断时间序列平稳性可能存在偏差,建议采用多种方法综合判断。所以,时间序列平稳性检验貌似并不能找到一个很准确的判定。
最近在理解ARMA的时候,构建了模拟数据,在用模拟数据进行平稳性检测时ADF检验和KPASS检验出现了不太一样的结果,这里做个记录。
时间序列构建
时间序列由周期、半周期、趋势、随机误差项组成,对各分量分别构建模拟序列,然后按比例叠加,可生成一个完整序列,生成的代码如下:
clear;
n = 132; % 模拟11年的数据,用10年的数据作为训练值
ntest = 12; %用最后1年数据作为预测比对值
x = 1:n;
% 周期信号
a1 = cos(2*pi*x/12) + 0.6 * sin(2*pi*x/24);
figure(1)
subplot(2,2,1)
plot(x,a1);
title('a1 周期信号')
% 趋势信号
subplot(2,2,2);
x2=0.14;
a2 = mapminmax(x2 * x,0,1);
plot(x,a2);
title('a2 趋势信号')
% 随机信号(0-1的随机值)
subplot(2,2,3)
a3 = rand(1,n);
plot(x,a3);
title('a3 随机信号')
% 三种信号叠加 生成模拟信号
subplot(2,2,4) %
a41 = 2 .* a1; % 1 只有周期项
%a41 = 2 .* a1 + 3.2 * a3; % 2 周期 + 随机
%a41 = 2 .* a1 + 5 * a2 + 3.2 * a3; % 3 周期 + 趋势 + 随机
%a41= 2 .* a1 + 5 * a2; % 4 周期+趋势
plot(x,a41);
title('a4 叠加序列')
平稳性检验使用ADF检验和KPASS检验
%% 平稳检验
a4 = a41(1:n-ntest);
ad1 = adftest(a4); % 1平稳 0非平稳
ad2 = kpsstest(a4); % 0 平稳 1 非平稳
if (ad1 == 1 && ad2 == 0)
% 平稳
type = 3;
else
% 非平稳
type = 4;
end
发现当序列包含不同的信号时,两种检验方法可能存在差异;
方案 | ADF检验结果 | KPASS检验结果 |
---|---|---|
周期 | 平稳 | 平稳 |
周期+随机噪声 | 平稳 | 平稳 |
周期+随机噪声+趋势 | 非平稳 | 平稳 |
周期+趋势 | 非平稳 | 平稳 |
将周期序列向y轴正方向移动5个单位,然后进行平稳性检验,发现此时ADF检验结果显示为非平稳,Kpass仍为平稳。
从上可以看出只要加了趋势项或序列非集中分布在X轴附近ADF检验结果就表现出非平稳性,所以最好结和多种检验方法,保证时间序列/差分序列绝对平稳,然后再应用到ARMA模型的预测等可能才会有较好的结果。也可以尝试更多的平稳性检验方法。