4. 时间序列分析基础:平稳性检验、自相关函数(ACF)、偏自相关函数(PACF)、差分操作
各位做微电网的朋友,咱们今天聊点硬核的。时间序列分析,说白了就是跟历史数据打交道,从里面挖出规律来。你想想看,微电网的负荷预测,本质上就是靠过去的数据去猜未来的走势。我做了这么多年微电网项目,发现很多新手一上来就套模型,结果预测出来的曲线跟实际偏差巨大——问题往往出在没做好时间序列的预处理上。
这一节,我带你把这四个核心概念吃透:平稳性检验、ACF、PACF、差分操作。它们就像盖房子的地基,地基不稳,上面盖的模型再漂亮也得塌。
核心逻辑:时间序列分析的第一步,永远是判断数据是否平稳。不平稳?先差分。然后通过ACF和PACF的形态,确定模型阶数。这是经典套路,我建议你刻在脑子里。
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