时间序列基础:平稳性、自相关、白噪声、随机游走

做量化交易的朋友,几乎天天跟时间序列打交道。说白了,时间序列就是按时间顺序排列的一串数据——股票收盘价、成交量、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,方差恒定。你想想看,如果某个序列是白噪声,那它就没有任何可预测性——过去的信息对未来毫无帮助。

白噪声的三个条件:

  1. 均值为0
  2. 方差恒定
  3. 任意两个不同时刻的值不相关(即自相关为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