时间序列基础:平稳性、自相关、白噪声,金融时间序列的特殊性
各位同学,咱们今天聊时间序列。说实话,这玩意儿是金融因果分析的根基。你想想看,金融数据本质上就是一堆按时间排列的观测值——股价、收益率、成交量,全是时间序列。如果连这个基础都搞不清楚,后面谈因果推断就是空中楼阁。
我个人习惯,讲时间序列一定从三个核心概念入手:平稳性、自相关、白噪声。这三个概念就像三根柱子,撑起了整个时间序列分析的大厦。咱们一个一个来。
1. 平稳性:时间序列的"定海神针"
什么叫平稳?说白了,就是一个时间序列的统计性质不随时间变化。均值不变、方差不变、自协方差只跟时间间隔有关,跟具体时间点无关。
我举个例子。你去看一只股票的收益率序列,如果它平稳,那过去10年的平均收益率跟最近1年的平均收益率应该差不多。但如果你看股价本身,那肯定不平稳——茅台股价从200块涨到2000块,均值一直在变。
- 严平稳:整个概率分布不随时间变化。要求太强,实践中几乎用不到。
- 弱平稳:均值、方差为常数,自协方差只与时间间隔有关。这是咱们实际用的。
我在项目中遇到过一件事。有次做配对交易策略,两个股票的历史相关性一直很稳定。结果某天突然崩了,亏了不少钱。后来一查,是因为其中一个股票发生了重大资产重组,均值结构变了,平稳性被打破了。嗯,从那以后,我每次建模前必做平稳性检验。
- ADF检验(Augmented Dickey-Fuller)——最常用
- KPSS检验——跟ADF互补,原假设是平稳
- PP检验——对异方差更鲁棒
代码实现其实很简单。我习惯用Python的statsmodels库:
from statsmodels.tsa.stattools import adfuller
# 假设price是股价序列
result = adfuller(price)
print(f'ADF统计量: {result[0]:.4f}')
print(f'p值: {result[1]:.4f}')
# p值小于0.05,拒绝非平稳原假设,序列平稳
if result[1] < 0.05:
print('序列平稳')
else:
print('序列非平稳,建议差分')
你想想看,如果序列不平稳怎么办?最常见的处理方式是差分。一阶差分后,很多金融时间序列就变平稳了。这就是为什么我们分析收益率而不是价格——收益率本身就是价格的一阶差分。
2. 自相关:时间序列的"记忆"
自相关,说白了就是今天的我跟昨天的我有没有关系。金融时间序列最迷人的地方就在这里——它是有记忆的。
我记得刚入行时,有个老交易员跟我说:"市场是有惯性的。" 这句话用统计语言翻译过来,就是自相关。如果今天的收益率跟昨天的收益率正相关,那趋势就存在;如果负相关,那就是均值回归。
自相关函数(ACF)和偏自相关函数(PACF)是咱们的常用工具。ACF衡量的是相隔k期的观测值之间的相关性,PACF则是在剔除中间变量影响后的"净"相关性。
- 正自相关 → 趋势效应,涨了还会涨
- 负自相关 → 均值回归,涨了会跌
- 无自相关 → 随机游走,无法预测
画ACF和PACF图的代码:
from statsmodels.graphics.tsaplots import plot_acf, plot_pacf
import matplotlib.pyplot as plt
# 假设returns是收益率序列
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()
我曾经犯过一个错误。有次做高频交易策略,看到ACF在滞后1期有显著的正相关,就以为发现了"稳赚"的模式。结果实盘一跑,亏得我怀疑人生。后来才发现,那是微观结构噪声造成的伪相关——买卖价差、订单流不平衡这些因素会人为制造自相关。避坑指南:金融数据的自相关,一定要先搞清楚是"真记忆"还是"假噪声"。
3. 白噪声:随机性的"纯净版"
白噪声,就是完全随机的序列。均值0,方差恒定,不同时间点之间完全不相关。说白了,就是"纯随机"。
为什么白噪声重要?因为它是我们判断模型好坏的基准。如果你的模型把数据拟合得很好,但残差不是白噪声,那说明模型没把信息提取干净——还有模式没抓到。
- Ljung-Box检验:检验残差是否存在自相关
- Durbin-Watson检验:专门检验一阶自相关
代码实现:
from statsmodels.stats.diagnostic import acorr_ljungbox
# 假设residuals是模型残差
result = acorr_ljungbox(residuals, lags=[10], return_df=True)
print(result)
# p值大于0.05,说明残差是白噪声
if result['lb_pvalue'].values[0] > 0.05:
print('残差为白噪声,模型拟合良好')
else:
print('残差存在自相关,模型需要改进')
你想想看,如果金融时间序列真的是白噪声,那所有技术分析都是扯淡。但现实是,市场确实存在一些可预测的模式,只是这些模式很微弱,而且会随着被利用而消失。这就是金融市场的"自适应"特性。
4. 金融时间序列的特殊性
好了,前面讲的是通用知识。现在咱们聊聊金融时间序列跟其他领域的时间序列有什么不同。这一点,我建议你认真听,因为很多做量化的人就是栽在这里。
- 尖峰厚尾:极端值出现的概率比正态分布高得多。2008年金融危机、2020年疫情暴跌,都是"厚尾"事件。
- 波动率聚集:大波动后面跟着大波动,小波动后面跟着小波动。这就是GARCH模型要捕捉的东西。
- 杠杆效应:下跌时波动率上升的幅度比上涨时更大。因为下跌会增加公司的财务杠杆。
- 非同步交易:不同股票的交易频率不同,导致观测到的价格序列存在"伪滞后相关"。
我记得有次做多因子模型,用普通最小二乘法去拟合,结果残差方差一直在变。一开始我以为模型错了,后来才意识到——这不是模型的问题,是金融数据天生就有异方差性。波动率本身就是时变的。
还有一个坑,我必须要说。金融时间序列的信噪比极低。什么意思?就是信号很弱,噪声很大。你辛辛苦苦找到一个统计显著的模式,可能只是数据挖掘的假象。我曾经花了三个月优化一个策略,回测曲线漂亮得不得了,结果实盘一个月就亏了15%。后来复盘发现,那个"模式"纯粹是过拟合出来的。
- 永远不要只看回测结果,要做样本外测试
- 警惕"数据窥探偏差"——你试了100个策略,总有一个看起来不错
- 金融数据的"伪相关"比比皆是,因果推断才是王道
最后,我用一张图来总结本章的核心知识体系:
这张图把咱们今天讲的内容串起来了。平稳性、自相关、白噪声是三条主线,金融时间序列的特殊性则是贯穿始终的暗线。后面的课程,我们会基于这些基础,一步步构建因果分析的方法论。
好了,今天就到这儿。记住一句话:不懂时间序列,就别碰金融因果分析。这是基本功,绕不过去的。
公众号:蓝海资料掘金营,微信deep3321