平稳过程与自相关:严平稳与宽平稳、自相关函数、功率谱密度
各位同学,今天我们来聊聊高频交易里最基础、也最容易被忽视的一个概念——平稳性。说实话,我刚开始做量化那会儿,觉得平稳性就是个数学定义,没啥实际用处。直到有一次,我写了一个看起来完美的统计套利策略,回测曲线漂亮得不行,结果实盘第一天就亏了3%。后来排查原因,发现是我把非平稳的时间序列当成了平稳来处理,自相关函数完全算错了方向。
嗯,从那以后,我再也不敢小看这个章节了。咱们今天就把严平稳、宽平稳、自相关函数和功率谱密度这几个东西彻底讲透。
1. 严平稳 vs 宽平稳:到底有什么区别?
先说严平稳。它的定义很严格:一个随机过程,无论你取哪一段时间的观测值,它的联合概率分布都完全一样。说白了,就是过程的统计特性不随时间变化。
举个例子,你想想看,如果某只股票的收益率序列是严平稳的,那么今天和一年后的今天,收益率的均值、方差、甚至整个分布形状都应该一模一样。这在真实市场里几乎不可能。我做过测试,A股市场里能通过严平稳检验的股票,连1%都不到。
那宽平稳呢?它放宽了条件。宽平稳只要求三个东西不变:
- 均值恒定:E[X(t)] = μ,不随时间t变化
- 方差恒定:Var[X(t)] = σ²,也是常数
- 自协方差只与时间差有关:Cov[X(t), X(t+τ)] = γ(τ),与具体时刻t无关
我个人习惯,在实际高频交易中,99%的情况都用宽平稳。为什么?因为严平稳的条件太苛刻了,你很难找到满足它的金融数据。而宽平稳已经足够支撑我们做信号捕捉和统计建模。
核心要点:严平稳是理想模型,宽平稳是实用工具。高频交易中,我们通常先检验宽平稳,如果通不过,就做差分或去趋势处理。
3. 自相关函数:信号捕捉的利器
自相关函数(ACF)是我在高频交易里用得最多的工具之一。它的本质很简单:衡量一个时间序列和它自身滞后版本之间的相关性。
公式长这样:
ρ(τ) = Cov[X(t), X(t+τ)] / Var[X(t)]
ρ(τ)的取值范围在[-1, 1]之间。如果ρ(1) = 0.8,说明当前时刻的值和下一秒的值高度正相关。这在高频交易里意味着什么?意味着价格有趋势性,你可以做动量策略。
我曾经在股指期货的Tick数据上做过一个实验。计算1秒间隔的自相关系数,发现大部分时间ρ(1)在0.3到0.6之间波动。但当ρ(1)突然降到0.1以下时,往往预示着市场即将发生反转。这个发现让我设计了一个简单的反转信号策略,效果还不错。
这里有个避坑指南:自相关函数对异常值非常敏感。我曾经因为数据里有一个跳空缺口,导致ACF计算出来的结果完全失真。所以,在计算之前,一定要做数据清洗和异常值处理。
实战技巧:在高频交易中,我建议同时计算多个滞后阶数的ACF,比如τ=1, 5, 10, 20。观察ACF的衰减模式,可以帮助你判断市场是趋势型还是均值回归型。
4. 功率谱密度:从时域到频域的视角
如果说自相关函数是在时域里看信号,那功率谱密度(PSD)就是在频域里看信号。它告诉我们:信号的能量在不同频率上是怎么分布的。
根据维纳-辛钦定理,平稳过程的功率谱密度和自相关函数是一对傅里叶变换对:
S(f) = ∫_{-∞}^{∞} ρ(τ) e^{-j2πfτ} dτ
这个公式看起来有点吓人,但实际用起来很直观。你想想看,高频交易里的价格波动,其实可以分解成不同频率的周期成分。比如:
- 低频成分:对应长期趋势,周期在几分钟到几小时
- 中频成分:对应日内波动,周期在几秒到几分钟
- 高频成分:对应微观结构噪声,周期在毫秒级别
我个人的经验是,功率谱密度可以帮助你识别出市场中的周期性模式。比如,我曾经在国债期货数据里发现,功率谱在20秒附近有一个明显的峰值。这说明市场存在一个约20秒的微周期,可能是由做市商的库存管理行为导致的。基于这个发现,我设计了一个捕捉这个周期的策略。
注意:功率谱密度分析需要足够长的数据样本。如果数据量太少,频谱泄漏和分辨率问题会让你得到错误的结果。我一般建议至少采集1000个以上的数据点。
5. 三者之间的关系:一张图说清楚
为了让你更直观地理解平稳过程、自相关函数和功率谱密度之间的关系,我画了一张结构图:
这张图的核心逻辑是:平稳过程是基础,自相关函数和功率谱密度是它的两个不同视角。一个在时域,一个在频域,两者通过傅里叶变换相互转换。
6. 实战中的代码示例
说了这么多理论,咱们来点实际的。下面这段Python代码演示了如何计算一个平稳序列的自相关函数和功率谱密度:
import numpy as np
import matplotlib.pyplot as plt
from statsmodels.tsa.stattools import acf
from scipy import signal
# 生成一个平稳的AR(1)过程
np.random.seed(42)
n = 1000
phi = 0.7
epsilon = np.random.randn(n)
x = np.zeros(n)
for t in range(1, n):
x[t] = phi * x[t-1] + epsilon[t]
# 计算自相关函数
acf_values = acf(x, nlags=40)
# 计算功率谱密度
f, psd = signal.welch(x, nperseg=256)
# 输出前10个自相关系数
print("前10个自相关系数:")
for i in range(10):
print(f"lag {i}: {acf_values[i]:.4f}")
# 输出功率谱密度的峰值频率
peak_freq = f[np.argmax(psd)]
print(f"\n功率谱密度峰值频率:{peak_freq:.4f} Hz")
这段代码里,我生成了一个AR(1)过程,它的自相关函数会呈指数衰减。你可以看到,当滞后阶数增加时,自相关系数逐渐趋近于0。这就是平稳过程的典型特征。
我的建议:在实际高频交易中,不要只看ACF的数值,还要看它的置信区间。如果ACF值落在置信区间之外,才说明存在显著的自相关。statsmodels库的acf函数默认会返回置信区间。
7. 总结一下
今天的内容,说白了就是三件事:
- 严平稳和宽平稳:严平稳是理想,宽平稳是现实。高频交易里,我们主要用宽平稳。
- 自相关函数:衡量时间序列自身的相关性,是捕捉趋势和反转信号的核心工具。
- 功率谱密度:从频域角度看信号,帮你发现隐藏的周期性模式。
我记得刚入行的时候,带我的老交易员说过一句话:「不懂平稳性,就别碰高频交易。」当时觉得他夸张,现在回头看,这句话一点不假。希望今天的课程能帮你打好这个基础。