2. 时间序列基础:定义、成分与平稳性

各位好,我是老张。今天咱们聊聊时间序列的基础。说实话,我刚入行那会儿,觉得时间序列不就是按时间排个数据嘛,有啥好学的?后来在风电场做功率预测,被实际数据狠狠教育了一顿,才明白这里面门道深着呢。

2.1 时间序列的定义

时间序列,说白了就是按时间顺序排列的一组观测值。比如你每小时记录一次光伏电站的出力,连续记了720个小时,这720个数据点就构成一个时间序列。

我习惯用数学语言再描述一遍:

设 {y₁, y₂, ..., yₜ} 为时间序列,其中 t 表示时间索引。
每个 yₜ 是在时刻 t 的观测值。

这里有个关键点——时间间隔必须相等。你想想看,如果第一个数据是1小时,第二个是2小时,第三个是半小时,那这就不叫时间序列了,这叫乱序数据。我在项目中遇到过有人把不等间隔的数据硬塞进模型,结果预测结果一塌糊涂。

核心要点:时间序列的三大特征——顺序性、等间隔性、依赖性。其中依赖性最重要:今天的功率值往往和昨天的有关,这就是所谓的"自相关"。

2.2 时间序列的四大成分

任何一个时间序列,都可以拆成四个部分。我习惯用"拆积木"来理解这件事。

2.4.1 趋势成分

趋势就是数据长期的变化方向。比如光伏电站的出力,随着季节变化,夏天整体高、冬天整体低,这就是趋势。

趋势可以是线性的,也可以是非线性的。我记得有一次做风电功率预测,发现数据有很明显的二次曲线趋势,后来一查,是因为那几年风机在逐步扩容。嗯,这里要注意:趋势不一定都是自然规律,也可能是人为因素造成的

2.4.2 季节成分

季节成分是固定周期内的重复模式。比如光伏电站每天中午出力最高、早晚低,周期是24小时。再比如用电负荷,工作日和周末的模式不同,周期是7天。

我刚开始做预测时,经常把"季节"和"周期"搞混。后来一个老前辈告诉我:季节成分的周期是固定的、已知的,比如一天、一周、一年。而周期成分的周期是不固定的。

2.4.3 周期成分

周期成分和季节成分很像,但周期不固定。比如经济周期,繁荣-衰退-萧条-复苏,这个周期可能是5年,也可能是10年。在电力系统中,设备的老化周期、市场价格的波动周期,都属于周期成分。

我的经验:做中长期功率预测时,季节成分用傅里叶变换提取,周期成分用自相关函数分析。这两个工具我几乎天天用。

2.4.4 残差成分

残差就是去掉趋势、季节、周期之后剩下的部分。说白了就是"说不清楚的那部分"。比如突然的云层遮挡导致光伏出力骤降,或者风机因故障停机,这些都属于残差。

我曾经犯过一个错误:把残差当成噪声直接忽略。后来发现残差里其实藏着很多信息,比如设备异常的前兆。所以我现在做分析时,一定会仔细看残差的分布和自相关图。

2.3 时间序列的分解模型

把四个成分组合起来,有两种常见模型:

模型类型 公式 适用场景
加法模型 yₜ = Tₜ + Sₜ + Cₜ + Rₜ 各成分相互独立,波动幅度不随时间变化
乘法模型 yₜ = Tₜ × Sₜ × Cₜ × Rₜ 各成分相互影响,波动幅度随时间变化

我个人习惯先用加法模型试试,如果残差有明显的异方差性(就是波动幅度忽大忽小),再换成乘法模型。在风电功率预测中,乘法模型更常见,因为出力越大时波动也越大。

2.4 平稳性概念

平稳性,这是时间序列分析里最绕的一个概念。我尽量用大白话讲清楚。

平稳时间序列,就是统计性质不随时间变化的时间序列。具体来说:

  • 均值恒定:不管取哪一段,平均值都差不多
  • 方差恒定:波动幅度不随时间变化
  • 自相关结构稳定:今天和昨天的关系,和明天与今天的关系,是一样的

你想想看,如果数据一会儿高一会儿低,均值忽上忽下,那你怎么预测?所以大多数时间序列模型都要求数据是平稳的。

避坑指南:我曾经直接用非平稳数据训练ARIMA模型,结果预测值直接发散到无穷大。后来才明白,非平稳数据必须先做差分处理。记住:平稳性是建模的前提,不是建模的结果

2.4.1 如何判断平稳性

我常用的方法有两个:

  1. 看图法:画时间序列图,看均值是否围绕一条水平线波动,波动幅度是否大致均匀
  2. 单位根检验:最常用的是ADF检验(Augmented Dickey-Fuller test)

ADF检验的代码很简单:

from statsmodels.tsa.stattools import adfuller

# 假设 data 是你的时间序列
result = adfuller(data)
p_value = result[1]

if p_value < 0.05:
    print("数据平稳,可以建模")
else:
    print("数据非平稳,需要差分处理")

p值小于0.05,就说明数据是平稳的。这个阈值是我个人的习惯,严格来说可以根据业务场景调整。

2.4.2 非平稳怎么办

如果数据非平稳,最常见的处理方法是差分。一阶差分就是计算相邻两个值的差:

diff_data = data.diff().dropna()

做完一阶差分后,再检验一次。如果还不平稳,就做二阶差分。但说实话,我做了这么多年,二阶差分基本就到头了,再差下去数据的信息就丢光了。

重要提醒:差分虽然能解决非平稳问题,但会丢失长期趋势信息。做中长期功率预测时,我建议保留趋势成分,用专门的模型去处理,而不是简单差分。

2.5 本章知识体系

下面这张图是我自己画的,把本章的核心逻辑串起来了:

时间序列基础 - 知识体系 时间序列 定义:等间隔有序观测 四大成分 平稳性 趋势 (T) 季节 (S) 周期 (C) 残差 (R) 加法模型: y=T+S+C+R 乘法模型: y=T×S×C×R 均值恒定 方差恒定 自相关稳定 ADF检验 差分处理 平稳是建模前提,非平稳需差分

这张图把时间序列的核心脉络理清楚了。从定义出发,分三条线:成分分析、平稳性判断、分解模型。我个人建议你把这个图打印出来贴在工位上,做预测时对照着看,思路会清晰很多。

最后说一句:时间序列基础看着简单,但真到实际项目中,数据往往不干净。我见过太多人上来就套模型,结果被非平稳数据坑了。记住:先分解,再检验,后建模。这个顺序别搞反了。


公众号:蓝海数据掘金营,微信deep3321