4. 时间序列基础概念:平稳性、自相关、偏自相关、白噪声

各位同学,咱们今天聊点实在的。

做量化交易,尤其是择时策略,你绕不开时间序列。说白了,价格、成交量、收益率,这些都是时间序列。我刚开始做量化那会儿,上来就对着K线图一顿跑模型,结果回测漂亮得像假的一样,实盘一跑就崩。后来才明白——基础不牢,地动山摇。

今天这节,咱们就把四个最核心的概念掰扯清楚:平稳性、自相关、偏自相关、白噪声。你把这四个东西吃透了,后面学什么ARIMA、GARCH,那都是顺水推舟的事。

4.1 平稳性:时间序列的“定海神针”

什么叫平稳?我个人的理解很简单:一个时间序列,如果它的统计性质不随时间变化,那就是平稳的

你想想看,如果一只股票的收益率,今天的均值和明天的均值不一样,今天的波动率和明天的波动率也不一样,那你怎么用历史数据去预测未来?根本没法预测。所以,平稳性是时间序列建模的前提条件。

平稳性的两种类型:
  • 严平稳:序列的联合分布不随时间平移而变化。这个条件太强了,现实中几乎不存在。
  • 弱平稳(宽平稳):均值恒定、方差恒定、自协方差只与时间间隔有关。我们平时说的“平稳”,默认指这个。

我在项目中遇到过一件事。有一次做股指期货的择时策略,我用的是5分钟线数据。模型训练出来,回测年化收益30%+,我兴奋得不行。结果实盘跑了三天,亏得亲妈都不认识。后来一查,原来那段时间市场处于剧烈波动期,序列的方差根本不恒定——说白了,它不平稳。你用不平稳的数据去建模,那就是在沙子上盖楼。

避坑指南: 拿到数据第一件事,先做平稳性检验。别急着上模型。我常用的方法是ADF检验(Augmented Dickey-Fuller Test)。p值小于0.05,就认为序列是平稳的。

4.2 自相关:昨天的自己和今天的自己

自相关,英文叫Autocorrelation。说白了,就是一个时间序列和它自身滞后版本之间的相关性

举个例子。你观察上证指数的日收益率。如果今天涨了,明天也涨的概率大不大?如果存在这种“涨了还涨”的现象,那就说明收益率序列存在正自相关。反之,如果今天涨了明天容易跌,那就是负自相关。

我习惯用自相关函数(ACF)来量化这个关系。ACF的值在-1到1之间,绝对值越大,相关性越强。

# Python代码示例:计算自相关
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from statsmodels.graphics.tsaplots import plot_acf

# 模拟一个收益率序列
np.random.seed(42)
returns = np.random.randn(1000)

# 绘制ACF图
plot_acf(returns, lags=20)
plt.title('收益率序列的自相关函数')
plt.show()

你跑一下这段代码,会发现大部分自相关值都落在蓝色置信区间内。这说明什么?说明这个序列是白噪声——咱们后面会讲。

注意: 自相关不等于因果关系。两个变量相关,不代表一个能导致另一个。这在金融数据里尤其常见,别被“伪相关”骗了。

4.3 偏自相关:剔除中间人的“纯净”关系

偏自相关,英文是Partial Autocorrelation,简称PACF。

它和自相关的区别在哪?我举个例子你就明白了。

假设你研究“今天的收益率”和“三天前的收益率”之间的关系。但是,这两者之间可能隔着“昨天的收益率”和“前天的收益率”。自相关会把所有中间路径的影响都算进去,而偏自相关只关心“直接”的关系——它剔除了中间变量的干扰。

嗯,这里要注意。在模型定阶的时候,ACF和PACF是黄金搭档。比如你画ACF图,发现它在滞后1期之后突然截尾(掉到置信区间内),而PACF是拖尾(缓慢衰减),那大概率适合用MA模型。反过来,ACF拖尾、PACF截尾,那就适合用AR模型。

我曾经在开发一个商品期货的择时策略时,就是靠ACF和PACF图来定阶的。当时我画完图,发现ACF在滞后2期后截尾,PACF拖尾,果断选了MA(2)模型。效果还不错,年化收益提升了5个百分点。

# Python代码示例:绘制ACF和PACF
from statsmodels.graphics.tsaplots import plot_pacf

fig, (ax1, ax2) = plt.subplots(2, 1, figsize=(10, 8))
plot_acf(returns, lags=20, ax=ax1)
plot_pacf(returns, lags=20, ax=ax2)
plt.show()

4.4 白噪声:最“干净”的时间序列

白噪声,White Noise。这个名字很形象——就像收音机里的沙沙声,没有任何规律可循。

一个严格的白噪声序列,满足三个条件:

  • 均值为0
  • 方差恒定
  • 任意两个不同时刻的值之间不相关

说白了,白噪声就是纯随机。你无法用它预测任何东西。

我刚开始做量化的时候,犯过一个低级错误。我跑了一个模型,发现回测收益曲线特别漂亮,激动得不行。结果仔细一看,模型的残差序列根本不是白噪声——它还存在明显的自相关结构。这意味着什么?意味着模型没有把信息提取干净,还有“油水”没榨出来。

检验白噪声的方法:
  • Ljung-Box检验:最常用。原假设是“序列为白噪声”。如果p值大于0.05,就不能拒绝原假设,即序列是白噪声。
  • 可视化检查:画ACF图,如果所有滞后期的自相关值都在置信区间内,基本可以认为是白噪声。
# Python代码示例:Ljung-Box检验
from statsmodels.stats.diagnostic import acorr_ljungbox

# 对残差进行白噪声检验
result = acorr_ljungbox(returns, lags=[10], return_df=True)
print(result)

你运行一下,如果p值大于0.05,恭喜你,你的残差是白噪声——模型已经提取了所有有效信息。

4.5 知识体系总览

说了这么多,咱们用一张图把今天的内容串起来。

时间序列基础概念知识体系 时间序列基础 平稳性 自相关 (ACF) 偏自相关 (PACF) 白噪声 严平稳 弱平稳 ADF检验 正自相关 负自相关 ACF图 剔除中间变量 PACF图 模型定阶 纯随机 Ljung-Box检验 残差诊断 核心逻辑:平稳性 → 自相关/偏自相关分析 → 白噪声检验 → 模型选择

这张图把今天的内容串起来了。你从平稳性出发,判断数据是否可用。然后用ACF和PACF分析数据的内部结构,最后用白噪声检验来验证模型是否把信息提取干净。每一步都有它的意义,缺一不可。

我的个人习惯: 每次拿到新的时间序列数据,我都会按这个流程走一遍。先做ADF检验看平稳性,再画ACF和PACF图看结构,最后用Ljung-Box检验确认残差是白噪声。这套流程走下来,心里就有底了。

好了,今天的内容就到这。这四个概念是时间序列分析的基石,你花时间把它们搞透,后面的路会顺很多。

专注资料整理