4. 时间序列基础:平稳性、自相关函数(ACF)、偏自相关函数(PACF)、白噪声、随机游走

做量化策略,时间序列是绕不开的坎。我刚开始接触金融数据时,以为把价格序列扔进模型就能预测,结果被市场狠狠教育了一顿。后来才明白——不懂时间序列的底层性质,策略就是空中楼阁

这一节,我们聊聊时间序列的五个核心概念。它们就像地基,打不牢,上面的因果推断、策略归因全得塌。

4.1 平稳性:策略的“定海神针”

什么叫平稳?说白了,就是序列的统计性质不随时间变化。均值稳定、方差稳定、自相关结构也稳定。

我见过太多人拿非平稳数据直接建模,回测曲线漂亮得像假的一样,一上实盘就崩。为什么?因为非平稳序列的统计规律是“时变”的,你用过去的关系去预测未来,等于刻舟求剑。

严平稳 vs 弱平稳
  • 严平稳:整个联合分布不随时间平移而变化。要求太强,实践中几乎用不到。
  • 弱平稳(我们常用的):均值恒定、方差有限且恒定、自协方差只与时间间隔有关。够用了。

怎么判断?我习惯用ADF检验。原假设是“序列存在单位根”(即非平稳)。p值小于0.05,就拒绝原假设,认为序列平稳。

# Python示例:ADF检验
from statsmodels.tsa.stattools import adfuller

result = adfuller(price_series)
print(f'ADF统计量: {result[0]:.4f}')
print(f'p值: {result[1]:.4f}')
if result[1] < 0.05:
    print('序列平稳')
else:
    print('序列非平稳,需要差分')
避坑指南:我曾经在回测中用了日频收益率序列,ADF检验显示平稳,但换到5分钟高频数据就不行了。金融高频数据常有“波动率聚集”现象,方差非恒定,这时候要用更稳健的检验方法。

4.2 自相关函数(ACF):序列的“记忆”有多长?

ACF衡量的是序列与其滞后值之间的相关性。你想想看,今天的收益率和昨天的收益率有没有关系?和三天前的呢?ACF就是回答这个问题的。

公式不复杂:

ρ(k) = Cov(X_t, X_{t-k}) / Var(X_t)

但光看公式没用。我一般直接画图——ACF图。横轴是滞后阶数,纵轴是相关系数,虚线是置信区间。落在虚线外的点,说明该滞后阶存在显著自相关。

实战解读技巧
  • ACF快速衰减到0 → 可能是平稳序列
  • ACF缓慢衰减 → 非平稳,有趋势
  • ACF在某个滞后阶突然截尾 → 可能是AR(p)模型
  • ACF拖尾(逐渐衰减) → 可能是MA(q)模型

我记得有一次分析某只股票的分钟线收益率,ACF在滞后1阶和5阶显著,但其他阶不显著。这说明什么?市场微观结构噪声和分钟级别的均值回复效应同时存在。后来我用这个特征做了个高频反转策略,效果还不错。

4.3 偏自相关函数(PACF):剔除“中间人”后的真实关系

ACF有个问题:它会把间接相关也算进去。比如X_t和X_{t-2}的相关性,可能完全是通过X_{t-1}传递的。PACF就是剔除中间变量后,直接看X_t和X_{t-k}的“净”相关性。

嗯,这里要注意:PACF在AR模型定阶时特别有用。如果PACF在p阶后突然截尾,那AR(p)的阶数就是p。

# Python示例:绘制ACF和PACF
from statsmodels.graphics.tsaplots import plot_acf, plot_pacf
import matplotlib.pyplot as plt

fig, (ax1, ax2) = plt.subplots(2, 1, figsize=(10, 6))
plot_acf(returns, lags=20, ax=ax1)
plot_pacf(returns, lags=20, ax=ax2)
plt.show()
个人习惯:我一般先看PACF定AR阶数,再看ACF定MA阶数。但别死板,很多时候ACF和PACF都是拖尾的,那就得用AIC/BIC来辅助判断了。

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

白噪声,就是纯随机。均值0,方差恒定,不同时刻之间完全不相关。ACF在任意滞后阶都接近0。

为什么讲白噪声?因为它是我们建模的“终极目标”。你想想看,一个好的模型,应该把数据中的结构信息全部提取出来,剩下的残差就应该是白噪声。如果残差还有自相关,说明模型没学干净。

重要提醒:Ljung-Box检验可以用来判断残差是否为白噪声。p值大于0.05,说明残差是白噪声,模型OK。我见过有人模型残差LB检验p值0.001还硬说模型好使,那纯粹是自欺欺人。
# Ljung-Box检验
from statsmodels.stats.diagnostic import acorr_ljungbox

result = acorr_ljungbox(residuals, lags=[10], return_df=True)
print(result)

4.5 随机游走:金融数据的“默认状态”

随机游走,就是下一时刻的值 = 当前值 + 随机扰动。说白了,价格序列在弱有效市场下近似服从随机游走

随机游走是非平稳的(方差随时间发散),而且它的差分是白噪声。这就是为什么我们通常用收益率(价格的一阶差分)而不是价格本身来建模。

随机游走的特征
  • 均值不恒定,方差随时间线性增长
  • ACF缓慢衰减,不截尾
  • 差分后变成白噪声
  • 不可预测——这是最扎心的

我曾经花三个月时间,试图用各种非线性模型预测某只股票的日频价格,回测曲线漂亮得不行。结果实盘一跑,直接亏成狗。后来用方差比检验一测,好家伙,这序列就是随机游走。那三个月,就当交学费了。

知识体系总览

下面这张图,是我自己梳理的时间序列基础框架。每次做策略归因前,我都会对照着过一遍:

时间序列基础 平稳性 均值/方差恒定 自相关函数(ACF) 序列记忆长度 偏自相关(PACF) 剔除间接相关 白噪声 纯随机,模型终极目标 随机游走 金融数据默认状态 策略归因应用 模型定阶 → 残差检验 → 因果推断

小结

这五个概念,是时间序列分析的基石。我个人的经验是:拿到任何金融时间序列,先做三件事——检验平稳性、画ACF/PACF图、检查是否为随机游走。这三步走完,数据的基本性格你就摸透了。

至于白噪声,那是我们建模的“圣杯”。模型好不好,就看残差能不能变成白噪声。不能?回去调参,或者换模型。

下一节我们会把这些工具用到因果推断中,看看怎么用时间序列的视角去拆解策略的收益来源。嗯,到时候你会回来感谢这些基础概念的。


公众号:蓝海资料掘金营,微信deep3321