4. 时间序列分析基础:平稳性检验、自相关函数(ACF)、偏自相关函数(PACF)、差分操作

各位做微电网的朋友,咱们今天聊点硬核的。时间序列分析,说白了就是跟历史数据打交道,从里面挖出规律来。你想想看,微电网的负荷预测,本质上就是靠过去的数据去猜未来的走势。我做了这么多年微电网项目,发现很多新手一上来就套模型,结果预测出来的曲线跟实际偏差巨大——问题往往出在没做好时间序列的预处理上。

这一节,我带你把这四个核心概念吃透:平稳性检验、ACF、PACF、差分操作。它们就像盖房子的地基,地基不稳,上面盖的模型再漂亮也得塌。

核心逻辑:时间序列分析的第一步,永远是判断数据是否平稳。不平稳?先差分。然后通过ACF和PACF的形态,确定模型阶数。这是经典套路,我建议你刻在脑子里。

时间序列分析基础流程 原始负荷数据 平稳性检验 (ADF / KPSS) 是否平稳? 是 → 直接分析 否 → 差分操作 ACF / PACF 分析 确定模型阶数 模型定阶 ARIMA(p,d,q) d = 差分阶数 | p = AR阶数 | q = MA阶数

4.1 平稳性检验——别让假趋势骗了你

什么叫平稳?说白了就是数据的统计性质不随时间变化。均值稳定、方差稳定、自协方差只跟时间间隔有关,跟具体时间点无关。我见过有人拿微电网的日负荷数据直接建模,结果预测值越跑越偏——后来一查,数据有明显的季节性趋势,压根不平稳。

平稳性检验最常用的方法是ADF检验(Augmented Dickey-Fuller)。它的原假设是「序列存在单位根,即不平稳」。p值小于0.05,就拒绝原假设,认为序列平稳。

我的经验:在实际项目中,我习惯同时用ADF和KPSS两种检验。ADF的H0是不平稳,KPSS的H0是平稳。两个结果交叉验证,心里更有底。曾经有一次ADF说平稳,KPSS说不平稳,最后发现是数据有结构性突变——嗯,这种情况在微电网负荷里挺常见的,比如工厂突然上了条新生产线。

# Python代码示例:ADF检验
from statsmodels.tsa.stattools import adfuller

# load_data是微电网负荷序列
result = adfuller(load_data)
print(f'ADF统计量: {result[0]:.4f}')
print(f'p值: {result[1]:.4f}')

if result[1] < 0.05:
    print('序列平稳,可以继续建模')
else:
    print('序列不平稳,需要进行差分操作')

4.2 自相关函数(ACF)——数据自己跟自己说话

ACF衡量的是当前时刻与滞后k时刻之间的相关性。你想想看,今天的负荷跟昨天的负荷有没有关系?跟一周前的呢?ACF就是回答这个问题的。

在微电网场景里,我经常用ACF图来判断季节性。比如某工业园区,ACF在滞后24小时处出现明显峰值——说明日周期性很强。这个信息对模型选择至关重要。

关键点:ACF图如果拖尾(缓慢衰减),说明序列有自回归特性;如果截尾(突然降到置信区间内),说明有移动平均特性。这个判断直接决定你选AR还是MA模型。

# Python代码示例:绘制ACF图
from statsmodels.graphics.tsaplots import plot_acf
import matplotlib.pyplot as plt

plot_acf(load_data, lags=48)  # 看48个滞后期
plt.title('微电网负荷ACF图')
plt.show()

4.3 偏自相关函数(PACF)——剔除中间变量的干扰

PACF跟ACF的区别在哪?ACF算的是「总相关」,包括间接影响。比如第1天影响第2天,第2天影响第3天,那第1天和第3天的ACF就会显示相关——但PACF会剔除第2天的中介效应,只看第1天对第3天的直接贡献。

我个人习惯是:ACF和PACF两张图放在一起看。ACF拖尾、PACF截尾 → AR模型;ACF截尾、PACF拖尾 → MA模型;两者都拖尾 → ARMA模型。

避坑指南:我曾经在一个光伏预测项目里,ACF和PACF看起来都拖尾,就随便选了个ARMA(2,2)。结果模型拟合效果很差。后来仔细看,ACF在滞后24小时处有周期性峰值——这是季节性!应该用SARIMA而不是普通ARIMA。记住:ACF/PACF的周期性峰值,往往意味着你需要季节性差分。

# Python代码示例:绘制PACF图
from statsmodels.graphics.tsaplots import plot_pacf

plot_pacf(load_data, lags=48, method='ywm')  # Yule-Walker方法
plt.title('微电网负荷PACF图')
plt.show()

4.4 差分操作——把不平稳变平稳

差分,说白了就是「今天的值减去昨天的值」。一阶差分能消除线性趋势,二阶差分能消除二次趋势。对于微电网负荷,一阶差分通常就够了——因为负荷数据虽然有趋势,但很少出现曲率很大的情况。

你可能会问:差分多少次合适?我的原则是:能少就少。每差分一次,数据就丢失一部分信息。我见过有人为了追求平稳,差分到三阶,结果模型预测出来的全是噪声——这叫「过度差分」。

差分阶数 适用场景 注意事项
0阶(原始数据) 数据本身平稳 直接建模
1阶差分 线性趋势明显 微电网负荷最常用
2阶差分 趋势有弯曲 慎用,容易过度差分
季节性差分 有周期性模式 比如24小时、7天周期
# Python代码示例:差分操作
import numpy as np

# 一阶差分
diff_1 = np.diff(load_data, n=1)

# 季节性差分(以24小时为周期)
seasonal_diff = load_data[24:] - load_data[:-24]

# 检查差分后的平稳性
result_diff = adfuller(diff_1)
print(f'差分后p值: {result_diff[1]:.4f}')

我的小技巧:在做差分之前,先画个原始数据的折线图。如果趋势是直线上升/下降,一阶差分就够了。如果趋势有弧度,试试二阶。但记住——微电网负荷通常一阶差分就能搞定。我曾经处理过一个工厂的负荷数据,趋势非常平缓,甚至不需要差分,直接建模效果更好。所以别死板,多试试。

4.5 实战要点总结

好了,咱们把这一节的核心捋一捋:

  • 第一步:画原始数据图,肉眼判断趋势和周期性
  • 第二步:ADF检验,p值大于0.05就差分
  • 第三步:差分后再次检验,直到平稳
  • 第四步:画ACF和PACF图,判断模型阶数
  • 第五步:注意季节性——如果ACF在固定间隔处有峰值,考虑季节性差分

你想想看,这套流程走下来,数据的基本特征就摸透了。后面建模型、做预测,心里才有底。我在项目里带新人时,要求他们必须先把这五步走完,才能碰模型。磨刀不误砍柴工,这话在时间序列分析里特别对。

最后提醒一句:平稳性检验不是目的,是手段。我们的目标是让数据满足建模要求,而不是追求「绝对平稳」。有时候稍微有点不平稳,但模型能处理,那就没必要过度差分。这个度,需要你在实践中慢慢找感觉。


公众号:蓝海资料掘金营,微信deep3321