第一章:什么是时间序列?你的生活里藏着预测密码 / Chapter 1: What is Time Series? Prediction Secrets Hidden in Your Daily Life
上周五放学铃响的时候,你攥着刚发下来的数学测验卷子站在教室门口,82分的红色分数旁边,老师用红笔写了个“进步明显”的评语。你低头翻出手机里存着的过去四次数学成绩:68、75、79、82,指尖无意识地在屏幕上划着:如果下次考试还是这个涨分速度,期末考到90分有没有可能?同班玩《王者荣耀》的阿凯凑过来,给你看他最近五个赛季的段位图:青铜Ⅲ→青铜Ⅱ→青铜Ⅰ→白银Ⅳ→白银Ⅲ,他挠着头问:“照这个速度,我暑假结束前能不能上王者?”校门口奶茶店的老板娘你认识,上周去买杨枝甘露的时候她随口说“最近天热,销量比上个月涨了快三成”,你想起上周每天去买奶茶的时候,她记账本上的数字:周一到周五每天平均卖700杯,周末能到1200杯,昨天刚算的这周前四天卖了3200杯,你忍不住想:“她下周能卖多少杯?会不会进更多芒果?”
你随手划出的成绩、阿凯的段位变化、奶茶店老板的销量记录,本质上都是时间序列(Time Series)——按时间顺序记录的一系列数据点,每一个点都对应一个特定时间点的观测值。和静态的“身高体重记录”“图书编号”不同,时间序列的核心特征是“时间”是数据不可分割的一部分:你的数学成绩是“第x次考试”的分数,奶茶销量是“第x天/周”的卖出的杯数,段位是“第x个赛季”的最高段位,时间顺序一旦打乱,这些数据就失去了所有的预测意义。
> 纸书排版注:本章引言采用缩进格式,适配印刷阅读需求,重点术语首次出现时标注中英对照,方便双语学习。
---
<!-- 标签:时间序列,定义,入门 -->
1.1 时间序列的核心定义:为什么“时间”是关键?/ 1.1 Core Definition of Time Series: Why Is "Time" the Key?
如果把普通数据比作一本没有页码的图书,时间序列就是每一页都标着出版日期的图书——你不仅要知道某一页写了什么,还要知道它出现在什么时间,才能理解前后的逻辑。从数学层面定义,时间序列是一组随机变量$\{X_t, t \in T\}$的集合,其中$t$代表时间点,$T$是时间索引集合(可以是等间隔的,比如每天、每周,也可以是不等间隔的,比如每次考试的间隔)。
举个最直观的例子:你过去10天的睡眠时长数据,如果只列数字:7.2、6.8、7.5、8.0、6.5、7.0、7.8、8.2、7.0、6.5,这就是一组普通数据;但如果给每个数字加上时间标签:“10月1日7.2小时、10月2日6.8小时……10月10日6.5小时”,它就变成了时间序列。你很容易就能发现:最近3天的睡眠时长比月初少了1小时左右,如果你继续熬夜,下周的睡眠时长可能还会更低——这就是时间序列的价值:用过去的时间规律,推测未来的可能走向。
时间序列和我们平时接触的“分类数据”“回归数据”最大的区别,就是数据点之间存在时间依赖关系:你今天的睡眠时长,大概率会和昨天的接近,不会突然跳到10小时(除非你昨天通宵了);你这次数学考试的成绩,大概率会和上次的接近,不会突然从80分跳到130分(除非你抄了答案)。这种时间上的依赖性,是时间序列预测的核心基础,也是它和普通机器学习任务最大的不同。
【💡 电子版侧边栏】 你可以现在就掏出手机,打开备忘录,记录你接下来7天每天的睡眠时长,7天后你就拥有了一组属于自己的时间序列数据,可以试着用本章教的方法做第一次预测。
---
<!-- 标签:时间序列,基本特征,趋势 -->
1.2 时间序列的四大核心特征:藏在数据里的规律密码 / 1.2 Four Core Characteristics of Time Series:规律密码 Hidden in Data
几乎所有的时间序列,都可以拆解成四个核心特征的叠加:趋势性(Trend)、季节性(Seasonality)、周期性(Cyclicity)、随机噪声(Irregular Noise)。搞清楚这四个特征,你就搞懂了时间序列预测90%的核心逻辑。
1.2.1 趋势性(Trend):长期的涨跌方向
趋势性是时间序列最明显的特征,指数据在长时间内呈现的持续上升、持续下降或平稳的走向。比如你从初一到现在初三的数学成绩,如果每次考试都比上次高2-3分,整体呈现明显的上升趋势(Uptrend);如果你最近沉迷游戏,每次考试的排名都比上次低10名,就是下降趋势(Downtrend);如果你每次考试的成绩都在70-80分之间波动,没有明显的涨跌,就是平稳趋势(Flat Trend)。
我们可以用你过去8次数学考试的成绩举个直观的例子: | 考试次数 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | |----------|---|---|---|---|---|---|---|---| | 数学成绩 | 72 | 75 | 78 | 76 | 81 | 83 | 80 | 85 |
把这组数据画成折线图,你会非常直观地看到整体向上的趋势,中间第4次、第7次的成绩下降,是短期波动,不影响整体的上升方向。从数学层面描述趋势,我们可以用简单的线性回归拟合:假设成绩和时间的关系是$Y_t = a \cdot t + b$,其中$Y_t$是第$t$次考试的成绩,$a$是涨分速率,$b$是初始成绩。通过拟合这组数据,我们可以得到$a \approx 1.75$,$b \approx 70.5$,也就是平均每次考试涨1.75分,初始成绩大概是70.5分,完全符合你每次涨2-3分的直观感受。
```mermaid graph TD A[数学成绩时间序列] --> B[整体上升趋势] A --> C[短期波动(噪声)] B --> D[平均每次涨1.75分] C --> E[第4次、第7次成绩下降] ```
1.2.2 季节性(Seasonality):固定周期的规律波动
季节性是指时间序列在固定时间间隔内呈现的重复性波动,这里的“季节”不一定指春夏秋冬,也可以是“每周的周一到周日”“每天的早中晚”“学期的期中期末”。比如奶茶店的销量:夏天比冬天高30%以上,周末比工作日高70%,这就是典型的周度、年度季节性;你每周的零花钱:周五会比周一到周四多20-50块,因为周末要出去玩,这就是周度季节性;你每次考试的排名:期中期末的排名会比平时月考低5-10名,因为题目更难,竞争对手更多,这就是学期季节性。
还是用奶茶店的例子,我们把它过去4周的日销量拆解成周度季节性: | 星期 | 一 | 二 | 三 | 四 | 五 | 六 | 日 | |------|----|----|----|----|----|----|----| | 平均日销量(杯) | 680 | 710 | 690 | 720 | 750 | 1250 | 1180 |
你会发现,周一到周五的销量都在700左右波动,周末直接涨到1200以上,波动幅度超过70%,而且每周都重复这个规律,这就是非常典型的周度季节性。季节性波动的大小可以用季节性指数来衡量:如果某段时间的平均销量是整体平均销量的1.2倍,那它的季节性指数就是1.2,说明这段时间的销量比平均高20%。
1.2.3 周期性(Cyclicity):无固定周期的长波波动
周期性和季节性非常容易混淆,核心区别是:季节性有固定的波动周期,周期性没有。季节性的周期是已知的,比如一年、一周、一天,而周期性的周期长度不固定,可能3年一次,可能8年一次,比如经济周期:经济繁荣、衰退、萧条、复苏的周期长度通常在3-10年之间,没有固定的规律;再比如你打游戏的状态:可能这周手感好,胜率80%,下周状态差,胜率40%,再下周又回到60%,这种波动没有固定的周期,就是周期性波动。
周期性和趋势性的区别也很明显:趋势性是长期的单向涨跌,而周期性是在趋势之上的上下波动。比如你从青铜上到王者的整体趋势是上升的,但过程中可能这周连胜10把,下周连跪8把,这种上下波动就是周期性,不影响整体的上升趋势。
1.2.4 随机噪声(Irregular Noise):无法预测的突发波动
不管你怎么拆解趋势、季节性、周期性,时间序列里总会有一些无法解释的随机波动,这就是随机噪声,也叫不规则波动。噪声的来源非常随机:比如你本来能考90分的数学考试,结果当天发烧了,只考了70分;比如奶茶店旁边突然开了个新的便利店,抢了部分生意,这周销量比预期少了200杯;比如你打游戏的时候突然网卡了,输了一把本来能赢的排位赛。
噪声是时间序列里最麻烦的部分,因为它没有规律,无法预测。我们的所有预测工作,本质上都是在尽量提取趋势、季节性、周期性的规律,同时尽可能过滤掉噪声的影响。比如你某次考试发烧考砸了,这个70分的成绩就是噪声,我们在分析你的成绩趋势的时候,会把它当成异常值处理,不会把它算进正常的涨分规律里。
```mermaid graph TD A[时间序列原始数据] --> B[趋势性 Trend] A --> C[季节性 Seasonality] A --> D[周期性 Cyclicity] A --> E[随机噪声 Irregular Noise] B --> F[长期上升/下降/平稳的单向走向<br/>例:成绩持续上涨、销量持续增长] C --> G[固定周期的重复波动<br/>例:周末销量高、寒暑假段位涨得快] D --> H[无固定周期的长波波动<br/>例:游戏状态起伏、经济周期]
E 是随机噪声项,代表无法解释的随机波动,通常符合均值为0的正态分布$\epsilon_t \sim N(0, \sigma^2)$,也就是大部分时候噪声会在0附近小幅度波动,很少出现极端异常值。比如你平时数学成绩稳定在75-85分,某次因为发烧只考了62分,这个62分就是典型的噪声,它不符合你平时的成绩规律,是突发因素导致的。
我们可以用你过去一个月的睡眠时长数据,直观拆解四个特征的叠加效应:
- 趋势项$T_t$:你最近因为准备期中考试,整体睡眠时长从月初的7.2小时降到月末的6.5小时,呈现稳定的下降趋势;
- 季节项$S_t$:每周五、周六你会多睡1小时补觉,周度重复的规律就是季节性;
- 周期项$C_t$:期中考试前一周你熬夜复习,睡眠时长比平时少1.5小时,这种没有固定周期的临时波动属于周期性;
- 噪声项$\epsilon_t$:某天你喝了奶茶失眠,多睡了2小时,属于无法预测的随机噪声。
这四个部分相加,就是你实际记录的睡眠时长数据,这也解释了为什么我们平时看到的时间序列看起来杂乱无章,拆解成四个特征后,规律就会一目了然。为了更清晰地展示四个特征的分解逻辑,我们可以用下面的流程图表示:
```mermaid graph TD A[原始时间序列数据<br/>(如:过去30天睡眠时长)] --> B[趋势性提取:移动平均/线性拟合] A --> C[季节性提取:季节指数分解] A --> D[周期性提取:谱分析/滤波] A --> E[噪声提取:残差计算] B --> F[趋势项 T_t<br/>(整体睡眠时长下降趋势)] C --> G[季节项 S_t<br/>(周末多睡1小时的周度规律)] D --> H[周期项 C_t<br/>(期中前少睡1.5小时的临时波动)] E --> I[噪声项 ε_t<br/>(喝奶茶失眠多睡2小时的突发波动)] F --> J[四个特征叠加得到预测值] G --> J H --> J I --> J ```
> 纸书排版注:上述流程图在印刷版中以双色印刷呈现,不同特征的模块用不同颜色标注,方便读者理解分解逻辑;电子版中点击流程图节点可以跳转到对应章节的详细讲解。
理解了四大特征的叠加逻辑后,我们就可以根据时间序列的统计特性,对其进行核心分类,这也是我们选择预测方法的最重要依据。
---
<!-- 标签:时间序列,平稳性,分类 -->
1.3 时间序列的两大核心分类:你遇到的预测题属于哪一类?/ 1.3 Two Core Classifications of Time Series: Which Category Does Your Prediction Problem Belong To?
根据统计特性的不同,时间序列可以分为平稳时间序列(Stationary Time Series)和非平稳时间序列(Non-stationary Time Series);根据参考数据的数量,又可以分为单变量时间序列(Univariate Time Series)和多变量时间序列(Multivariate Time Series)。搞清楚自己手里的序列属于哪一类,是选择预测方法的第一步。
1.3.1 平稳 vs 非平稳:规律会不会随时间变?/ 1.3.1 Stationary vs. Non-stationary: Does the Law Change With Time?
从通俗角度理解,平稳时间序列就是“规律很稳定,不会随时间变化”的序列:它的均值(平均值)、方差(波动幅度)、自相关性(当前数值和过去数值的关联程度)在任意时间段内都基本一致。比如你每天早上固定买一杯3块钱的豆浆,过去半年的消费记录都是3元,均值是3,方差是0,没有任何波动,这就是最典型的严平稳(Strictly Stationary)序列,它的统计特性完全不随时间变化。
现实中更常见的是弱平稳(Weakly Stationary)序列:只要均值和方差不随时间变化,就可以认为是弱平稳。比如你过去一个月的睡眠时长,均值是7小时,方差是0.5小时,折线图在7小时上下随机波动,没有明显的上升或下降趋势,也没有周末多睡的固定规律,这就是弱平稳序列。平稳序列的最大优势是规律稳定,预测难度低,哪怕用很简单的方法也能得到不错的效果。
和平稳序列相反,非平稳序列的统计特性会随时间明显变化:均值上升/下降、波动幅度变大/变小、或者有固定的季节性规律。你过去8次的数学成绩就是典型的非平稳序列:均值从第一次的72分上升到第八次的85分,整体呈现明显的上升趋势,均值随时间持续变化,所以是非平稳的。奶茶店的销量也是非平稳的:夏天比冬天高30%,周末比工作日高70%,均值和方差都会随季节、周度变化,属于有季节性的非平稳序列。
判断一个序列是不是平稳,不需要一开始就学复杂的统计检验(比如ADF检验),初学者可以用最直观的折线图法:把序列画成折线图,如果能看到明显的上升/下降趋势,或者固定周期的波动,或者波动幅度越来越大/小,就可以判断是非平稳序列。如果折线图在某个固定值上下随机波动,没有明显的趋势和季节性,就是平稳序列。
非平稳序列不能直接用于预测,需要先做平稳化处理,最常用的方法是差分(Differencing):把当前时间点的数值减去前一个时间点的数值,得到增量序列,就可以去掉趋势的影响。比如你过去8次的数学成绩是[72,75,78,76,81,83,80,85],做一阶差分后得到[3,3,-2,5,2,-3,5],这组增量序列的均值是2左右,没有明显的趋势,就变成了平稳序列。如果序列有季节性,还可以做季节差分:比如周度季节性的序列,用当前数值减去上周同一天的数值,就能去掉季节性的影响。
对于波动幅度随时间变大的序列(比如奶茶店销量每个月涨10%,波动也越来越大),还可以用对数变换:对原始数据取对数,就能把指数增长的趋势变成线性增长,同时稳定波动幅度,让序列变成平稳的。我们可以用下面的代码示例,直观展示差分的过程,你可以直接复制到Python环境里运行:
```python import pandas as pd import matplotlib.pyplot as plt
1. 构造过去8次数学成绩的时间序列
scores = [72, 75, 78, 76, 81, 83, 80, 85] ts = pd.Series(scores, index=range(1, 9), name="数学成绩")
2. 一阶差分:当前成绩 - 上一次成绩
diff_ts = ts.diff().dropna() diff_ts.name = "成绩一阶差分(涨分数值)"
3. 画图对比
fig, (ax1, ax2) = plt.subplots(1, 2, figsize=(12, 4)) ts.plot(ax=ax1, title="原始成绩序列(非平稳)", marker="o", grid=True) diff_ts.plot(ax=ax2, title="一阶差分后序列(平稳)", marker="o", grid=True, color="orange") plt.tight_layout() plt.show()
4. 输出结果
print("原始成绩序列:") print(ts) print("\n一阶差分后的涨分数值:") print(diff_ts) ```
运行代码后你会看到:原始成绩序列的折线图明显向上倾斜,有明显的上升趋势;而差分后的序列在0上下波动,没有明显的趋势,已经变成了平稳序列。这就是差分处理的核心作用:把非平稳的原始序列,转换成平稳的增量序列,方便后续预测。
1.3.2 单变量 vs 多变量:预测需要多少参考数据?/ 1.3.2 Univariate vs. Multivariate: How Much Reference Data Do You Need for Prediction?
根据参与预测的变量数量,时间序列可以分为单变量和多变量两类,两者的核心区别是“预测用到的参考数据有多少”。
单变量时间序列是最简单的预测场景:预测时只用这一个序列自身的历史数据,不需要其他参考数据。比如你预测下次数学考试的分数,只用过去8次的数学成绩,就是单变量预测;奶茶店预测下周的销量,只用过去12周的销量数据,也是单变量预测。单变量方法的优势是简单、容易实现,不需要收集额外的数据,适合数据量少、没有明确影响因子的场景,缺点是准确率相对较低,因为它没有考虑其他可能影响结果的因素。
多变量时间序列则是用多个和预测目标相关的序列作为参考。比如你预测下次数学考试的分数,同时参考过去一周的睡眠时长、每天玩游戏的时间、作业完成率这几个和成绩相关的序列,就是多变量预测;奶茶店预测下周的销量,同时参考未来一周的温度、是否节假日、周边是否有活动、原材料库存,也是多变量预测。多变量方法的优势是准确率更高,因为它考虑了更多影响目标的因素,缺点是复杂度更高,需要处理多个变量之间的相关性,适合数据充足、能明确找到影响因子的场景。
我们可以用下面的对比表格,清晰展示两类序列的区别:
| 对比维度 | 单变量时间序列 | 多变量时间序列 | |----------|-----