4. 误差时间相关性分析:自相关函数、偏自相关函数、白噪声检验

好,咱们接着聊误差分析。前面几章我们把误差的分布、统计特征都摸了一遍,但有个关键问题还没解决——误差之间有没有“勾连”

说白了,就是今天的预测误差,跟昨天的、前天的误差有没有关系?

我刚开始做负荷预测那会儿,总觉得误差就是随机蹦出来的。直到有一次,我发现连续三天的误差都是正的,而且越来越大。嗯,这就不对劲了。如果误差之间存在相关性,说明我们的模型漏掉了某些规律,必须修正。

这一章,我们就来拆解误差的时间相关性。核心工具就三个:自相关函数(ACF)偏自相关函数(PACF),以及白噪声检验

4.1 为什么误差不能“有关系”?

先想一个问题:如果今天的误差和昨天的误差正相关,意味着什么?

意味着模型系统性地低估或高估了负荷。你想想看,如果昨天低估了5%,今天又低估了3%,那模型肯定有没捕捉到的趋势或周期。

我个人的习惯是:拿到一组预测误差后,第一件事不是看均值方差,而是画个时序图。肉眼扫一遍,如果发现误差在某个时间段内“扎堆”为正或为负,那基本可以断定存在时间相关性。

核心原则: 理想的预测误差应该是白噪声——均值为0,方差恒定,且任意两个不同时刻的误差相互独立。

4.2 自相关函数(ACF)

自相关函数,就是衡量误差序列自己跟自己在不同滞后阶数上的相关性。

公式我就不堆了,咱们直接说直觉:

  • 滞后1阶的自相关:今天的误差与昨天的误差的相关性
  • 滞后2阶的自相关:今天的误差与前天的误差的相关性
  • 以此类推……

我在项目中遇到过这样一个案例:某地区夏季负荷预测的误差,在滞后24阶(也就是一天前)出现了明显的自相关峰值。这说明什么?说明模型没处理好日周期规律。后来我们加入了24小时前的负荷特征,误差立马改善了。

ACF的图形怎么看?记住三点:

  1. 快速衰减:如果ACF在滞后几阶后迅速降到0附近,说明序列可能是平稳的,相关性较弱
  2. 缓慢衰减:如果ACF拖尾很长,迟迟不归零,说明序列可能存在趋势或非平稳性
  3. 周期性峰值:比如在滞后24、48、72处出现尖峰,说明存在日周期规律
我的小技巧: 画ACF图时,记得加上95%置信区间带(通常用±1.96/√n)。落在带内的自相关值,可以认为不显著。

4.3 偏自相关函数(PACF)

ACF有个问题——它会把间接相关也算进来。比如,今天的误差跟昨天的相关,昨天的又跟前天的相关,那今天跟前天可能也表现出相关,但这其实是“传递”过来的。

偏自相关函数就是用来剔除中间变量的干扰,只保留“纯”的相关性。

说白了,PACF衡量的是:在剔除了中间所有滞后项的影响后,当前误差与特定滞后误差的直接相关性

举个例子:

  • ACF(2) 可能很大,但这是因为滞后1阶在中间“搭桥”
  • PACF(2) 如果很小,说明滞后2阶对当前没有直接影响

我曾经犯过一个错:看到ACF在滞后2阶有显著峰值,就急着往模型里加滞后2项。结果模型反而变差了。后来一查PACF,滞后2阶根本不显著。嗯,白费功夫。

避坑指南: 判断模型阶数时,ACF和PACF要配合着看。ACF拖尾、PACF截尾,适合AR模型;ACF截尾、PACF拖尾,适合MA模型。两者都拖尾,考虑ARMA模型。

4.4 白噪声检验

好,ACF和PACF看完了,怎么判断误差到底是不是白噪声?

光靠肉眼看图不够,得有统计检验。最常用的是Ljung-Box检验(也叫Q检验)。

它的逻辑很简单:

  • 原假设H0:误差序列是白噪声(所有自相关系数都为0)
  • 备择假设H1:误差序列不是白噪声(至少有一个自相关系数不为0)

如果p值小于0.05,就拒绝原假设,说明误差存在显著的时间相关性。

我个人习惯是:对滞后1阶到滞后24阶(如果是日数据)做Ljung-Box检验。如果p值都大于0.05,那基本可以放心了。

下面给一段Python代码,演示如何计算ACF、PACF并做白噪声检验:

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from statsmodels.tsa.stattools import acf, pacf, acf_pacf_plot
from statsmodels.stats.diagnostic import acorr_ljungbox

# 假设 errors 是预测误差序列(一维数组)
errors = np.random.randn(100)  # 这里用随机数模拟,实际替换为你的数据

# 计算ACF和PACF
lag_num = 20
acf_values = acf(errors, nlags=lag_num)
pacf_values = pacf(errors, nlags=lag_num)

# 打印前几阶
print("ACF (前5阶):", acf_values[1:6])
print("PACF (前5阶):", pacf_values[1:6])

# Ljung-Box白噪声检验
lb_test = acorr_ljungbox(errors, lags=[5, 10, 15, 20], return_df=True)
print("\nLjung-Box检验结果:")
print(lb_test)

# 可视化
fig, axes = plt.subplots(1, 2, figsize=(12, 4))
acf_pacf_plot(errors, lags=lag_num, ax=axes)
plt.show()
注意: 代码中的 acf_pacf_plot 会自动画出置信区间带。如果柱子超出蓝色区域,说明该阶自相关显著。

4.5 实战中的常见模式

根据我多年的经验,误差时间相关性通常有以下几种模式:

模式 ACF表现 PACF表现 可能原因
白噪声 所有阶都不显著 所有阶都不显著 模型已充分捕捉规律
一阶自相关 滞后1阶显著,之后快速衰减 滞后1阶显著,之后截尾 模型遗漏了短期趋势
周期相关 在滞后24、48等处有峰值 对应阶数有峰值 日周期规律未建模
拖尾衰减 缓慢下降,多阶显著 前几阶显著后截尾 存在长期趋势或非平稳性

遇到这些情况怎么办?我的建议是:

  • 短期自相关:考虑在模型中加入误差的滞后项(AR项)
  • 周期相关:加入周期特征,比如小时、星期几、节假日等
  • 拖尾衰减:先对原始序列做差分,再检查误差

4.6 知识体系总览

为了让你更直观地理解这一章的逻辑,我画了一张流程图:

误差时间相关性分析流程 预测误差序列 步骤1:绘制时序图 步骤2:ACF分析 步骤3:PACF分析 步骤4:Ljung-Box检验 判断:是否白噪声?

这张图把整个分析流程串起来了。你拿到误差数据后,先画时序图看个大概,然后算ACF和PACF找具体规律,最后用Ljung-Box检验给个结论。三步走,清晰明了。

总结一句话: 误差的时间相关性分析,就是帮我们回答“模型漏掉了什么规律”这个问题。ACF和PACF是探针,白噪声检验是裁判。

好了,这一章的内容就到这里。记住,下次你看到预测误差,别急着调参数,先看看它们之间有没有“暧昧关系”。


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