第三章:描述性统计分析——摸清数据的脾气
做波动率预测,第一步不是跑模型,而是先跟数据「聊聊天」。
我个人习惯,拿到任何收益率序列,先做一套完整的描述性统计分析。这就像医生看病前的望闻问切——数据长什么样?有没有异常?能不能直接用?
这一章,我们就来聊聊怎么给收益率数据「做体检」。
3.1 收益率分布特征:数据长什么样?
先看最直观的东西:收益率到底是怎么分布的。
金融数据有个臭名昭著的特征——尖峰厚尾。什么意思?
- 尖峰:大部分收益率集中在0附近,比正态分布更「瘦高」
- 厚尾:极端值出现的概率比正态分布高得多
我在项目中遇到过好几次,新手看到偏度接近0、峰度接近3就以为数据是正态的。其实不然。你想想看,光看这两个数字远远不够。
核心指标速查表
| 指标 | 含义 | 典型值(金融数据) |
|---|---|---|
| 均值 | 平均收益率 | 接近0 |
| 标准差 | 波动程度 | 0.01~0.03(日频) |
| 偏度 | 分布对称性 | 负值(左偏) |
| 峰度 | 尾部厚度 | 大于3(尖峰) |
| Jarque-Bera | 正态性检验 | 显著(拒绝正态) |
说白了,金融收益率几乎从来不是正态的。别指望它「正常」。
3.2 正态性检验:别被「看起来像」骗了
为什么要做正态性检验?因为很多模型(比如经典的VaR计算)假设收益率服从正态分布。但这个假设在金融市场上基本不成立。
常用的方法有几种:
- Jarque-Bera检验:基于偏度和峰度,最常用
- Shapiro-Wilk检验:小样本更准确
- QQ图:直观,看点是否落在直线上
我的经验:JB检验在样本量很大时几乎总是显著的。这时候别急着下结论,结合QQ图一起看更靠谱。
# Python示例:正态性检验
import scipy.stats as stats
# 假设returns是收益率序列
jb_stat, jb_pvalue = stats.jarque_bera(returns)
print(f'JB统计量: {jb_stat:.2f}, p值: {jb_pvalue:.4f}')
if jb_pvalue < 0.05:
print('拒绝正态性假设——嗯,意料之中')
else:
print('不能拒绝正态性——这数据有点意思')
避坑指南:我曾经遇到一个案例,JB检验p值0.06,看起来「勉强正态」。但画了QQ图后发现尾部明显偏离。记住:统计检验只是参考,可视化才是王道。
3.3 自相关与偏自相关分析:收益率有没有「记忆」?
收益率序列有没有自相关?说白了就是:今天的收益率能不能预测明天的?
理论上,有效市场假说认为收益率没有自相关。但实际数据嘛……
- 自相关函数(ACF):衡量当前值与滞后值之间的相关性
- 偏自相关函数(PACF):剔除中间滞后项的影响后,直接的相关性
我习惯先看ACF图。如果大部分柱子落在蓝色置信区间内,说明没有显著自相关。如果有几个柱子冒出来,也别慌——可能是偶然。
# Python示例:ACF和PACF
from statsmodels.graphics.tsaplots import plot_acf, plot_pacf
plot_acf(returns, lags=20)
plot_pacf(returns, lags=20)
注意:收益率本身可能没有自相关,但平方收益率或绝对收益率往往有很强的自相关。这就是波动率聚集效应的体现——大波动后面跟着大波动。
3.4 平稳性检验:数据能不能「站住」?
平稳性,说白了就是数据的统计性质不随时间变化。均值稳定、方差稳定、自相关结构稳定。
为什么重要?因为大多数时间序列模型(包括GARCH)都要求数据平稳。不平稳的数据,模型会给出荒谬的结果。
两个最常用的检验:
| 检验方法 | 原假设 | 什么时候用 |
|---|---|---|
| ADF检验 | 存在单位根(不平稳) | 检测趋势性非平稳 |
| KPSS检验 | 序列平稳 | 检测确定性趋势 |
我个人习惯两个都做。为什么?因为ADF和KPSS互补——一个检验「是否不平稳」,一个检验「是否平稳」。结合起来看更放心。
# Python示例:ADF和KPSS检验
from statsmodels.tsa.stattools import adfuller, kpss
# ADF检验
adf_stat, adf_pvalue = adfuller(returns)[:2]
print(f'ADF p值: {adf_pvalue:.4f}')
# KPSS检验
kpss_stat, kpss_pvalue = kpss(returns)[:2]
print(f'KPSS p值: {kpss_pvalue:.4f}')
# 判断逻辑
if adf_pvalue < 0.05 and kpss_pvalue > 0.05:
print('数据平稳——可以放心建模')
elif adf_pvalue > 0.05 and kpss_pvalue < 0.05:
print('数据不平稳——需要差分处理')
else:
print('结果矛盾——检查数据或调整滞后阶数')
避坑指南:我曾经遇到一个案例,ADF说平稳,KPSS也说平稳,但模型跑出来一塌糊涂。后来发现是结构性断点导致的。记住:统计检验不是万能的,一定要结合业务逻辑判断。
3.5 知识体系总览
下面这张图,是我自己梳理的「描述性统计分析」流程。每次拿到新数据,我就按这个顺序走一遍。
嗯,这套流程走下来,你对数据的脾气就摸得差不多了。接下来建模的时候,心里就有底了。
我的习惯:每次分析新数据,我都会把上述步骤写成脚本一键运行。然后花10分钟仔细看每个图、每个统计量。这10分钟,往往能省下后面几小时的调试时间。
公众号:蓝海资料掘金营,微信deep3321