4. 时间序列基础概念:平稳性、自相关、偏自相关、白噪声
各位同学,咱们今天聊点实在的。
做量化交易,尤其是择时策略,你绕不开时间序列。说白了,价格、成交量、收益率,这些都是时间序列。我刚开始做量化那会儿,上来就对着K线图一顿跑模型,结果回测漂亮得像假的一样,实盘一跑就崩。后来才明白——基础不牢,地动山摇。
今天这节,咱们就把四个最核心的概念掰扯清楚:平稳性、自相关、偏自相关、白噪声。你把这四个东西吃透了,后面学什么ARIMA、GARCH,那都是顺水推舟的事。
4.1 平稳性:时间序列的“定海神针”
什么叫平稳?我个人的理解很简单:一个时间序列,如果它的统计性质不随时间变化,那就是平稳的。
你想想看,如果一只股票的收益率,今天的均值和明天的均值不一样,今天的波动率和明天的波动率也不一样,那你怎么用历史数据去预测未来?根本没法预测。所以,平稳性是时间序列建模的前提条件。
- 严平稳:序列的联合分布不随时间平移而变化。这个条件太强了,现实中几乎不存在。
- 弱平稳(宽平稳):均值恒定、方差恒定、自协方差只与时间间隔有关。我们平时说的“平稳”,默认指这个。
我在项目中遇到过一件事。有一次做股指期货的择时策略,我用的是5分钟线数据。模型训练出来,回测年化收益30%+,我兴奋得不行。结果实盘跑了三天,亏得亲妈都不认识。后来一查,原来那段时间市场处于剧烈波动期,序列的方差根本不恒定——说白了,它不平稳。你用不平稳的数据去建模,那就是在沙子上盖楼。
4.2 自相关:昨天的自己和今天的自己
自相关,英文叫Autocorrelation。说白了,就是一个时间序列和它自身滞后版本之间的相关性。
举个例子。你观察上证指数的日收益率。如果今天涨了,明天也涨的概率大不大?如果存在这种“涨了还涨”的现象,那就说明收益率序列存在正自相关。反之,如果今天涨了明天容易跌,那就是负自相关。
我习惯用自相关函数(ACF)来量化这个关系。ACF的值在-1到1之间,绝对值越大,相关性越强。
# Python代码示例:计算自相关
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from statsmodels.graphics.tsaplots import plot_acf
# 模拟一个收益率序列
np.random.seed(42)
returns = np.random.randn(1000)
# 绘制ACF图
plot_acf(returns, lags=20)
plt.title('收益率序列的自相关函数')
plt.show()
你跑一下这段代码,会发现大部分自相关值都落在蓝色置信区间内。这说明什么?说明这个序列是白噪声——咱们后面会讲。
4.3 偏自相关:剔除中间人的“纯净”关系
偏自相关,英文是Partial Autocorrelation,简称PACF。
它和自相关的区别在哪?我举个例子你就明白了。
假设你研究“今天的收益率”和“三天前的收益率”之间的关系。但是,这两者之间可能隔着“昨天的收益率”和“前天的收益率”。自相关会把所有中间路径的影响都算进去,而偏自相关只关心“直接”的关系——它剔除了中间变量的干扰。
嗯,这里要注意。在模型定阶的时候,ACF和PACF是黄金搭档。比如你画ACF图,发现它在滞后1期之后突然截尾(掉到置信区间内),而PACF是拖尾(缓慢衰减),那大概率适合用MA模型。反过来,ACF拖尾、PACF截尾,那就适合用AR模型。
我曾经在开发一个商品期货的择时策略时,就是靠ACF和PACF图来定阶的。当时我画完图,发现ACF在滞后2期后截尾,PACF拖尾,果断选了MA(2)模型。效果还不错,年化收益提升了5个百分点。
# Python代码示例:绘制ACF和PACF
from statsmodels.graphics.tsaplots import plot_pacf
fig, (ax1, ax2) = plt.subplots(2, 1, figsize=(10, 8))
plot_acf(returns, lags=20, ax=ax1)
plot_pacf(returns, lags=20, ax=ax2)
plt.show()
4.4 白噪声:最“干净”的时间序列
白噪声,White Noise。这个名字很形象——就像收音机里的沙沙声,没有任何规律可循。
一个严格的白噪声序列,满足三个条件:
- 均值为0
- 方差恒定
- 任意两个不同时刻的值之间不相关
说白了,白噪声就是纯随机。你无法用它预测任何东西。
我刚开始做量化的时候,犯过一个低级错误。我跑了一个模型,发现回测收益曲线特别漂亮,激动得不行。结果仔细一看,模型的残差序列根本不是白噪声——它还存在明显的自相关结构。这意味着什么?意味着模型没有把信息提取干净,还有“油水”没榨出来。
- Ljung-Box检验:最常用。原假设是“序列为白噪声”。如果p值大于0.05,就不能拒绝原假设,即序列是白噪声。
- 可视化检查:画ACF图,如果所有滞后期的自相关值都在置信区间内,基本可以认为是白噪声。
# Python代码示例:Ljung-Box检验
from statsmodels.stats.diagnostic import acorr_ljungbox
# 对残差进行白噪声检验
result = acorr_ljungbox(returns, lags=[10], return_df=True)
print(result)
你运行一下,如果p值大于0.05,恭喜你,你的残差是白噪声——模型已经提取了所有有效信息。
4.5 知识体系总览
说了这么多,咱们用一张图把今天的内容串起来。
这张图把今天的内容串起来了。你从平稳性出发,判断数据是否可用。然后用ACF和PACF分析数据的内部结构,最后用白噪声检验来验证模型是否把信息提取干净。每一步都有它的意义,缺一不可。
好了,今天的内容就到这。这四个概念是时间序列分析的基石,你花时间把它们搞透,后面的路会顺很多。