时间序列基础:平稳性、自相关、白噪声、随机游走
做量化交易的朋友,几乎天天跟时间序列打交道。说白了,时间序列就是按时间顺序排列的一串数据——股票收盘价、成交量、VIX指数,都是典型的时间序列。
但我发现很多新手一上来就急着建模型、找套利机会,结果模型跑出来全是假信号。为什么?因为没搞懂时间序列的几个核心概念。今天我就把这四个基础概念掰开揉碎了讲清楚。
一、平稳性——时间序列分析的基石
平稳性是什么?我打个比方你就懂了。你站在海边看浪,如果海面整体高度不变、波浪幅度差不多,这就是平稳的。如果海啸来了,水位突然暴涨,那就是非平稳。
严格来说,平稳性分两种:
- 严平稳:整个序列的统计性质(均值、方差、协方差)完全不随时间变化。这个条件太苛刻,现实中几乎不存在。
- 弱平稳:均值恒定、方差恒定、自协方差只与时间间隔有关。我们平时说的平稳,默认指弱平稳。
为什么平稳性这么重要?
因为大多数时间序列模型(ARIMA、GARCH等)都假设数据是平稳的。非平稳数据直接建模,会出现「伪回归」——两个毫无关系的序列,相关系数却很高。我见过有人拿中国GDP和美国某小镇的降雨量做回归,R²居然0.8以上,这就是典型的伪回归。
检验平稳性,最常用的是ADF检验(Augmented Dickey-Fuller test)。
import pandas as pd
import numpy as np
from statsmodels.tsa.stattools import adfuller
# 生成一个随机游走(非平稳)
np.random.seed(42)
n = 1000
random_walk = np.cumsum(np.random.randn(n))
# ADF检验
result = adfuller(random_walk)
print(f'ADF统计量: {result[0]:.4f}')
print(f'p值: {result[1]:.4f}')
print(f'临界值(1%): {result[4]["1%"]:.4f}')
# 判断:p值大于0.05,不能拒绝原假设,序列非平稳
if result[1] > 0.05:
print('结论:序列非平稳')
else:
print('结论:序列平稳')
个人经验:我习惯在做任何协整分析之前,先对所有序列做ADF检验。如果p值大于0.05,先差分一次再试。记住,协整关系要求的是「同阶单整」——也就是差分相同次数后都变成平稳。
二、自相关——序列自身的记忆效应
自相关,说白了就是「今天的价格跟昨天的价格有没有关系」。如果今天涨了明天也容易涨,那就是正自相关;今天涨了明天容易跌,那就是负自相关。
我刚开始做量化的时候,犯过一个低级错误:用日收益率做自相关分析,发现滞后1阶的相关系数有0.3,以为找到了预测规律。后来才发现,那是因为我用的数据有非同步交易效应——小盘股反应慢,大盘股先涨它后涨,造成了虚假的自相关。
自相关函数(ACF)和偏自相关函数(PACF)是分析自相关的两个工具:
- ACF:衡量当前值与滞后k期值的相关性,包含中间各期的影响
- PACF:剔除中间各期影响后,当前值与滞后k期值的「净」相关性
from statsmodels.graphics.tsaplots import plot_acf, plot_pacf
import matplotlib.pyplot as plt
# 生成一个AR(1)过程:y_t = 0.7*y_{t-1} + epsilon
ar1 = np.zeros(n)
ar1[0] = np.random.randn()
for i in range(1, n):
ar1[i] = 0.7 * ar1[i-1] + np.random.randn()
# 绘制ACF和PACF
fig, (ax1, ax2) = plt.subplots(2, 1, figsize=(10, 6))
plot_acf(ar1, lags=20, ax=ax1)
plot_pacf(ar1, lags=20, ax=ax2)
plt.show()
避坑指南:我曾经在分析某只股票的分钟线时,ACF图显示滞后5阶有显著自相关。我以为是市场微观结构导致的,后来发现是数据本身有缺失值,用前向填充法补全后引入了虚假的自相关。所以,做自相关分析前,一定要先检查数据质量。
三、白噪声——纯随机序列
白噪声,就是完全随机的序列。每个值独立同分布,均值为0,方差恒定。你想想看,如果某个序列是白噪声,那它就没有任何可预测性——过去的信息对未来毫无帮助。
白噪声的三个条件:
- 均值为0
- 方差恒定
- 任意两个不同时刻的值不相关(即自相关为0)
检验一个序列是不是白噪声,常用Ljung-Box检验:
from statsmodels.stats.diagnostic import acorr_ljungbox
# 生成白噪声
white_noise = np.random.randn(1000)
# Ljung-Box检验
lb_result = acorr_ljungbox(white_noise, lags=[10], return_df=True)
print(lb_result)
# 如果p值大于0.05,不能拒绝原假设,序列是白噪声
为什么白噪声重要?
因为它是所有时间序列模型的「基准」。一个好的模型,它的残差应该近似白噪声。如果残差还有自相关,说明模型没把信息提取干净。我每次建完模型,第一件事就是检查残差是不是白噪声——这是模型诊断的黄金标准。
四、随机游走——金融市场的经典模型
随机游走,就是「醉汉走路」。每一步的方向随机,当前位置等于上一步位置加上一个随机步长。
数学表达式很简单:
yt = yt-1 + εt
其中εt是白噪声。
随机游走有几个重要性质:
- 非平稳:方差随时间线性增长,均值虽然恒定但不可靠
- 不可预测:最优预测就是当前值,未来变化完全随机
- 冲击永久性:一次冲击会永久改变序列的水平
我记得刚入行时,有个前辈跟我说:「股票价格在短期内近似随机游走,但长期来看会有均值回归的倾向。」这句话我琢磨了很久。后来做协整分析时才真正理解——单只股票可能是随机游走,但两只股票的价差可能不是。这就是协整交易的核心逻辑。
实战技巧:判断一个序列是不是随机游走,除了ADF检验,还可以看它的方差比检验(Variance Ratio Test)。如果方差比显著偏离1,说明序列不是随机游走。我在做统计套利时,经常用这个指标来筛选潜在的配对。
五、四个概念的关系
这四个概念不是孤立的,它们之间有清晰的逻辑链条:
| 概念 | 平稳性 | 自相关 | 可预测性 |
|---|---|---|---|
| 白噪声 | 平稳 | 无 | 不可预测 |
| 随机游走 | 非平稳 | 有(一阶差分后无) | 不可预测 |
| AR(1)平稳过程 | 平稳 | 有 | 可预测 |
| 趋势+噪声 | 非平稳 | 可能有 | 部分可预测 |
你看,白噪声是最「干净」的序列,随机游走是最常见的非平稳序列。而协整分析,本质上就是在多个随机游走之间寻找一种「隐藏的平稳关系」。
曾经踩过的坑:我刚开始做配对交易时,用两只股票的收盘价直接做回归,发现残差很平稳,以为找到了协整对。后来才发现,那是因为两只股票都含有相同的趋势成分(比如大盘指数的影响),残差的平稳是虚假的。正确的做法是:先检验每只股票的单整阶数,再检验残差的平稳性,最后还要做Johansen检验确认协整关系。
嗯,时间序列基础就讲到这里。这些概念看似简单,但它们是整个协整分析的根基。下一章我们会把这些工具用起来,真正开始做价差交易策略的设计。
公众号:蓝海数据掘金营,微信deep3321