4、时间序列基础:什么是时间序列?平稳性、自相关、偏自相关、白噪声检验
各位同学,欢迎来到第四章。说实话,时间序列这块内容,是咱们做功率预测的「地基」。地基没打好,上面盖的楼再漂亮也得塌。我见过太多新手,上来就扔给模型一堆数据,结果预测出来的曲线跟心电图似的,完全没法用。
为什么会这样?说白了,就是没搞懂时间序列的基本性质。今天咱们就把这几个核心概念掰开揉碎了讲清楚。
4.1 什么是时间序列?
时间序列,听着挺唬人,其实很简单——就是按时间顺序排列的一组数据点。比如你家智能电表每15分钟记录一次的功率值,这就是一个典型的时间序列。
我个人的习惯是,拿到任何时间序列数据,第一件事不是建模,而是先画图。把数据按时间轴画出来,看看趋势、周期、异常值。这一步花不了几分钟,但能帮你避开很多坑。
核心要点:时间序列有四个基本成分——趋势、季节性、周期性和随机波动。功率预测里,最常打交道的是趋势和季节性。
举个例子,光伏功率数据:白天高、晚上低,这是日周期性;夏天高、冬天低,这是年季节性。如果你不把这些成分拆解出来,模型就会学得稀里糊涂。
4.2 平稳性——时间序列的「定海神针」
平稳性,是时间序列分析里绕不开的概念。什么叫平稳?简单说就是:数据的统计性质不随时间变化。
具体来说,平稳时间序列的均值、方差是常数,自协方差只跟时间间隔有关,跟具体时间点无关。
你想想看,如果数据一会儿均值是100,一会儿均值是1000,模型怎么学?它根本找不到规律。所以,大多数时间序列模型都要求数据是平稳的。
我的经验:实际项目中的数据,90%以上都是非平稳的。别慌,我们有办法处理——差分、对数变换、季节分解,都是常用的「平稳化」手段。
怎么判断数据是否平稳?最常用的方法是ADF检验(Augmented Dickey-Fuller test)。它的原假设是「序列存在单位根,即非平稳」。如果p值小于0.05,就拒绝原假设,认为序列是平稳的。
# Python代码示例:ADF检验
from statsmodels.tsa.stattools import adfuller
# 假设data是你的时间序列
result = adfuller(data)
print(f'ADF统计量: {result[0]:.4f}')
print(f'p值: {result[1]:.4f}')
if result[1] < 0.05:
print('序列平稳,可以继续建模')
else:
print('序列非平稳,需要进行差分处理')
我曾经接手过一个风电功率预测项目,数据看起来挺规整,但模型就是收敛不了。折腾了两天,最后发现是数据有趋势项,没做差分。嗯,从那以后,我每次建模前都会先跑一遍ADF检验。
4.3 自相关与偏自相关——找到数据自己的「记忆」
时间序列有个特点:当前时刻的值,往往跟过去的值有关。比如今天的功率,跟昨天的功率肯定有相关性。这种相关性,就是自相关。
自相关函数(ACF)衡量的是当前值与其滞后值之间的相关性。滞后1阶,就是看t时刻和t-1时刻的相关性;滞后2阶,就是看t时刻和t-2时刻的相关性,以此类推。
偏自相关函数(PACF)则更「纯粹」一些——它衡量的是剔除了中间滞后项影响之后,当前值与特定滞后值之间的相关性。
这两个函数有什么用?说白了,它们是帮我们确定ARIMA模型阶数的「指南针」。
实战口诀:
- ACF拖尾、PACF截尾 → 用AR模型(看PACF截尾的阶数)
- ACF截尾、PACF拖尾 → 用MA模型(看ACF截尾的阶数)
- 两者都拖尾 → 用ARMA或ARIMA模型
# Python代码示例:绘制ACF和PACF图
from statsmodels.graphics.tsaplots import plot_acf, plot_pacf
import matplotlib.pyplot as plt
fig, (ax1, ax2) = plt.subplots(2, 1, figsize=(10, 6))
plot_acf(data, lags=20, ax=ax1)
plot_pacf(data, lags=20, ax=ax2)
plt.show()
我记得有次做短期负荷预测,ACF图显示在滞后24阶处有个明显的峰值——这对应着日周期性。如果不考虑这个,模型就会漏掉最重要的特征。
4.4 白噪声检验——你的数据是「随机噪音」吗?
白噪声,听起来很专业,其实就是纯随机序列。它的特点是:均值接近0,方差恒定,且不同时刻的值之间没有相关性。
为什么要检验白噪声?因为如果数据本身就是白噪声,那任何模型都预测不了——就像你无法预测下一枚硬币是正面还是反面。
常用的检验方法是Ljung-Box检验。原假设是「序列是白噪声」。如果p值小于0.05,就拒绝原假设,认为序列存在自相关结构,值得建模。
# Python代码示例:Ljung-Box检验
from statsmodels.stats.diagnostic import acorr_ljungbox
result = acorr_ljungbox(data, lags=[10, 20, 30], return_df=True)
print(result)
注意:白噪声检验通常用在模型残差上。如果模型拟合得好,残差应该是白噪声。如果残差还有明显的自相关结构,说明模型没学到位,需要调整。
我曾经犯过一个错误:模型训练完,看预测效果还行,就没检查残差。结果上线后,遇到极端天气,预测值直接崩了。后来一查,残差里还有明显的周期性成分没被捕捉到。从那以后,我养成了检查残差的习惯。
4.5 知识体系总览
下面这张图,把本章的核心逻辑串起来了。你可以把它当作一个「检查清单」——拿到时间序列数据后,按这个流程走一遍,基本不会出大问题。
4.6 本章小结
好了,咱们来捋一捋今天的内容:
- 时间序列就是按时间排序的数据,核心成分是趋势、季节性和随机波动
- 平稳性是建模的前提,用ADF检验来判断,非平稳就做差分
- ACF和PACF帮我们找到数据内部的「记忆结构」,指导模型选阶
- 白噪声检验用来验证模型是否充分捕捉了数据中的信息
这些概念,你可能会觉得有点抽象。但相信我,等你真正动手做几个项目,就会发现它们就像吃饭喝水一样自然。下一章,咱们会把这些知识串起来,开始搭建第一个预测模型。
小建议:找一份公开的电力负荷数据,自己动手跑一遍ADF检验、画ACF/PACF图、做白噪声检验。光看不练,永远学不会。
公众号:蓝海资料掘金营,微信deep3321