3. 探索性数据分析

在构建金融时序机器学习择时信号之前,探索性数据分析(EDA)是决定模型上限的关键一步。很多初学者拿到价格序列后直接套用LSTM或XGBoost,结果回测曲线漂亮、实盘却迅速失效,根源往往在于跳过了对收益率统计特性的诊断。本节围绕四个核心对象展开:收益率分布形态、波动率聚集、自相关结构,以及偏度与峰度,并给出可落地的可视化方法。

一、核心原理:价格不是分析对象,收益率才是

金融价格序列通常是非平稳的,均值与方差随时间漂移,直接建模容易产生伪回归。因此第一步永远是做对数差分,得到对数收益率:

r_t = ln(P_t / P_{t-1}) = ln(P_t) - ln(P_{t-1})

对数收益率具备可加性,且近似等于简单收益率,是后续所有统计检验的基础。EDA要回答的问题包括:收益率是否服从正态分布?波动率是否成簇出现?过去收益能否预测未来收益?极端值出现的频率是否被正态假设低估?这些问题的答案直接决定特征工程方向与模型选择。

择时信号的本质是寻找条件期望的非零性:E[r_t | F_{t-1}] ≠ 0。EDA就是检验这个条件期望是否存在、以何种形式存在。

二、收益率分布:偏度、峰度与正态性检验

正态分布假设在金融数据中几乎总被拒绝。我们需要重点观察两个高阶矩:

  • 偏度(Skewness):衡量分布不对称性。负偏度意味着左尾更长,暴跌概率高于暴涨,A股与指数普遍呈现负偏。
  • 峰度(Kurtosis):衡量尾部厚度。正态分布峰度为3,超额峰度大于0即为尖峰厚尾,极端收益出现频率远高于正态预期。

实操中可用Jarque-Bera检验或Shapiro-Wilk检验做正态性判断。若峰度显著大于3,则基于正态假设的风险模型(如VaR)会系统性低估尾部风险,择时信号也应更关注尾部状态而非均值状态。

统计量正态基准典型金融资产表现对择时建模的启示
均值接近0日频接近0,年化正不宜直接预测绝对收益
标准差稳定时变、成簇需引入波动率特征
偏度0常为负区分上涨与下跌状态
超额峰度0显著为正使用稳健损失函数
自相关无收益弱、平方收益强从波动率中提取信号

三、波动率聚集与自相关结构

波动率聚集是金融时序最稳健的典型事实之一:大幅波动后面往往跟着大幅波动,平静期后面跟着平静期。这意味着收益率本身自相关很弱,但其平方或绝对值序列存在显著自相关。这正是GARCH族模型和波动率特征有效的根本原因。

自相关分析应分两层进行:

  1. 对收益率序列做ACF/PACF,检验均值可预测性,通常快速衰减至不显著。
  2. 对收益率平方做ACF,检验方差可预测性,通常缓慢衰减且显著,说明存在长记忆。

若平方收益ACF显著,则可在特征集中加入滚动波动率、已实现波动率、GARCH条件方差等,作为择时模型的状态输入。

Ljung-Box检验可同时检验多阶自相关是否联合显著。对收益率做检验常不显著,对平方收益做检验则高度显著,这一对比本身就是重要结论。

四、可视化方法与实战流程

EDA的可视化应服务于判断,而非堆砌图表。推荐一套最小可视化组合:

  • 收益率时序图:观察波动率聚集与结构性断点。
  • 直方图叠加正态曲线:直观展示尖峰厚尾与偏度。
  • QQ图:尾部偏离正态的程度一目了然。
  • ACF/PACF图:分别对收益率与平方收益率绘制。
  • 滚动波动率曲线:观察波动率状态切换。

下面给出一个可复用的Python分析片段:

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

ret = np.log(price).diff().dropna()

print("偏度:", stats.skew(ret))
print("峰度:", stats.kurtosis(ret, fisher=False))
print("JB检验 p值:", stats.jarque_bera(ret).pvalue)

fig, ax = plt.subplots(2, 2, figsize=(12, 8))
ax[0,0].plot(ret); ax[0,0].set_title("收益率时序")
ax[0,1].hist(ret, bins=80, density=True)
ax[1,0].plot(np.sort(ret), stats.norm.ppf(np.linspace(0.01,0.99,len(ret))))
plot_acf(ret**2, ax=ax[1,1], lags=40)
plt.tight_layout()

运行后若发现峰度远大于3、平方收益ACF显著、QQ图两端明显偏离,即可确认数据具备典型的厚尾与波动率聚集特征,后续建模应优先引入波动率类特征,并采用对异常值稳健的损失函数。

常见误区:一是用价格而非收益率做EDA,导致自相关虚高;二是只看收益率ACF不显著就断言“不可预测”,忽略了平方收益的强自相关;三是用全样本统计量做标准化,造成未来信息泄露。正确做法是滚动窗口计算统计量,并严格按时间切分训练集与验证集。
金融收益率EDA四象限诊断图 ① 收益率分布:尖峰厚尾 实线:实际分布 虚线:正态基准 ② 波动率聚集 大幅波动成簇出现 ③ 自相关结构 收益率ACF弱,平方收益ACF强 ④ 偏度与峰度 偏度 < 0:左尾风险大 峰度 > 3:极端值频发 JB检验 p < 0.05:拒绝正态 → 引入波动率特征与稳健损失

完成上述诊断后,你会得到一份关于数据“性格”的清晰画像:厚尾意味着不能依赖高斯假设,波动率聚集意味着方差本身携带信号,弱均值自相关意味着单纯用历史收益预测方向收益有限,而平方收益的强自相关则提示应从波动率状态切入构建择时逻辑。这份画像将直接指导后续特征工程与模型选择,是整门课程从数据走向信号的第一道分水岭。