跳到正文

时间序列:平稳性与自相关

资产价格并非随时间独立变化——今天的收益与昨天的收益相关。在进行任何时间序列分析之前,理解平稳性和自相关是必不可少的。

第 4 篇 · 共 5 篇 约 4 分钟

时间序列的特殊之处

大多数统计学课程处理的是每个观测值相互独立的数据,一个人的身高不会影响数据集中下一个人的身高。时间序列数据打破了这个假设。今天的股票收益不独立于昨天的收益。价格建立在先前价格之上。经济有周期。季节会重复。

时间序列 就是按时间顺序收集的数据,序列本身携带信息。

当你处理时间序列时,问题会发生变化。你不再问”平均收益率是多少?“,而是问”平均收益率随时间稳定吗?今年的收益能告诉你明年收益的任何信息吗?“这些问题直接引出平稳性和自相关的概念。

平稳性:统计量何时保持不变

当三个条件成立时,时间序列是(弱)平稳的:

  1. 序列的均值不随时间变化——不会向上或向下漂移。
  2. 序列的方差不随时间变化——波动不会系统性地增大或缩小。
  3. 两个观测值之间的自协方差只取决于它们之间的间隔(滞后),而非你在时间序列中的位置。

形式上,对于弱平稳序列 YtY_t:

Cov(Yt,Yt−k)=γk\text{Cov}(Y_t, Y_{t-k}) = \gamma_k

值 γk\gamma_k 只取决于滞后 kk,而非 tt。

如果你取该序列的任何平稳段并绘图,无论你何时采样,形状看起来都相似。水平、散布和模式大致相同。

许多统计检验和预测方法——包括经典计量经济学中的大多数工具——都假设你的数据是平稳的。如果你将它们应用于非平稳数据,会得到误导性的结果,比如发现实际上不存在的相关性,或错过了实际存在的相关性。

为什么平稳性在金融中很重要

资产价格几乎从不平稳。一只起始价格为 50 美元、在十年内攀升至 200 美元的股票价格具有变化的均值。具有单位根的序列——金融中的默认情况——不会回归到常数水平。对数价格也有类似行为。

另一方面,收益率往往更接近平稳。一个时期的收益率为 +2% 并不会系统性地预测下一个收益率是正还是负(至少在有效市场中)。这就是为什么量化分析师使用收益率而非价格。

一阶差分 是将非平稳价格序列转换为平稳序列最简单的方法。如果 PtP_t 是价格,则 Pt−Pt−1P_t - P_{t-1} 只是美元价格变动,并不是收益率。简单收益率和对数收益率定义如下:

Yt=Pt−Pt−1Pt−1(简单收益率)Yt=ln⁡(Pt)−ln⁡(Pt−1)(对数收益率)Y_t = \frac{P_t - P_{t-1}}{P_{t-1}} \quad \text{(简单收益率)} \qquad Y_t = \ln(P_t) - \ln(P_{t-1}) \quad \text{(对数收益率)}

对数收益率在时间上具有可加性,这使其在代数上很方便。大多数金融时间序列分析使用对数收益率。

自相关:衡量数据的”记忆”

如果平稳性问的是”水平稳定吗?“,自相关问的是”不同时间点的值是否相互关联?”

自相关函数(ACF) 衡量 YtY_t 与 Yt−kY_{t-k} 之间的相关性,其中 kk 是滞后:

ρk=Cov(Yt,Yt−k)Var(Yt)\rho_k = \frac{\text{Cov}(Y_t, Y_{t-k})}{\text{Var}(Y_t)}

在滞后 1 处,你将每个值与紧随其后的那个值进行比较。在滞后 5 处,你将每个值与 5 个时期之前的值进行比较。

具有正自相关的序列(如一天中温度读数)往往会持续——高值之后是高值,低值之后是低值。在金融中,动量效应在收益中产生正自相关:近期上涨的资产倾向于继续上涨,至少在一段时间内如此。

具有负自相关的序列(如均值回归价差)往往会振荡——高值之后是低值,反之亦然。

可视化自相关:相关图

相关图是一种条形图,显示每个滞后的 ACF 值。每条条形的高度代表 ρk\rho_k,超出虚线显著性水平的条形表示存在有意义的白噪声。

相关图让你一目了然地读出一个序列有多少期的”记忆”。

Ljung-Box 检验 为自相关提供了正式的统计检验。它的零假设是滞后 hh 以内所有自相关系数均为零——即该序列看起来像白噪声。小的 p 值拒绝零假设,告诉你该序列具有显著的自相关。

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from statsmodels.graphics.tsaplots import plot_acf
from statsmodels.stats.diagnostic import acorr_ljungbox


np.random.seed(42)
n = 252

# 纯白噪声收益率
white_noise = np.random.normal(0, 1, n)

# 带动量的收益率:正自相关
returns_momentum = np.zeros(n)
returns_momentum[0] = np.random.normal(0, 1)
for t in range(1, n):
    returns_momentum[t] = 0.4 * returns_momentum[t-1] + np.random.normal(0, 1)

# 绘制相关图
fig, axes = plt.subplots(2, 2, figsize=(12, 8))

axes[0, 0].plot(white_noise)
axes[0, 0].set_title("白噪声收益率")
axes[0, 0].set_xlabel("交易日")

axes[0, 1].plot(returns_momentum)
axes[0, 1].set_title("动量收益率(自相关)")
axes[0, 1].set_xlabel("交易日")

plot_acf(white_noise, lags=20, ax=axes[1, 0], title="ACF: 白噪声")
plot_acf(returns_momentum, lags=20, ax=axes[1, 1], title="ACF: 动量")

plt.tight_layout()
plt.show()

# 对两个序列进行 Ljung-Box 检验
print("白噪声 Ljung-Box p 值:")
print(acorr_ljungbox(white_noise, lags=[5, 10], return_df=True))

print("\n动量收益率 Ljung-Box p 值:")
print(acorr_ljungbox(returns_momentum, lags=[5, 10], return_df=True))

提示词

用 numpy、matplotlib 和 statsmodels 演示时间序列自相关:模拟白噪声和 AR(1) 动量序列,用 plot_acf 画 ACF 图,再用 Ljung-Box 检验。

运行此代码,你会发现白噪声序列产生平坦的相关图,没有显著的条形,而动量序列显示缓慢衰减的 ACF 值——这是持续自相关的标志。

量化金融中的应用

动量策略 有意利用收益中的正自相关。如果近期赢家往往继续获胜,买入近期上涨的股票可能是有利可图的——至少在这种模式因过度使用而自我瓦解之前。

均值回归策略 做相反的事情,利用负自相关。如果短期偏离公平价格往往会被纠正,你可以卖出涨势过高的资产,买入跌势过深的资产。

两种方法都需要严格测量自相关,而非假设它存在。本文中介绍的工具——ACF、相关图、Ljung-Box——是正确做到这一点的起点。

参考文献

Brockwell & Davis, Introduction to Time Series and Forecasting, 3rd edition, Springer, Chapters 1–2. ISBN: 978-3319298528.

Tsay, Analysis of Financial Time Series, 3rd edition, Wiley, Chapter 1. ISBN: 978-0470414354.