4、正态分布假设:正态性检验与QQ图绘制

做VaR模型,绕不开一个核心假设——收益率服从正态分布。

说实话,我在刚入行那几年,对这个假设深信不疑。教科书上这么写,论文里这么用,那肯定没问题吧?直到我第一次用真实的市场数据跑回测,结果惨不忍睹。后来我才明白:金融数据天生就是厚尾的,正态分布只是一个理想化的起点。

但话说回来,我们做量化风控,不能因为假设不完美就放弃检验。恰恰相反,检验正态性,是为了知道我们的模型在什么条件下会失效。今天我就带大家过一遍最常用的三种方法:Jarque-Bera检验、Shapiro-Wilk检验,还有最直观的QQ图。

4.1 为什么要做正态性检验?

你想想看,VaR模型的核心逻辑是:给定一个置信水平,找到分布左侧的分位数。如果数据不是正态的,那这个分位数就是错的。错得有多离谱?

我举个例子。假设你用正态分布算出来95% VaR是-2%,但实际数据是厚尾的,真实5%分位数可能是-3.5%。这意味着你的模型会系统性低估风险。嗯,这就是为什么监管机构要求我们做正态性检验——不是走形式,是真的会出人命。

核心观点:正态性检验不是为了证明数据是正态的,而是为了量化偏离程度,为后续模型调整提供依据。

4.2 Jarque-Bera检验

JB检验是我个人最常用的方法。为什么?因为它简单、快速,而且只依赖两个统计量:偏度(Skewness)和峰度(Kurtosis)

偏度衡量分布的对称性。正态分布的偏度是0。如果偏度大于0,说明右尾更长;小于0,左尾更长。峰度衡量分布的"尖峭"程度。正态分布的峰度是3。峰度大于3,说明尾部更厚——这正是金融数据的典型特征。

JB统计量的公式长这样:

JB = n/6 * (S² + (K-3)²/4)

其中n是样本量,S是偏度,K是峰度。JB统计量服从卡方分布(自由度2)。如果p值小于0.05,我们就拒绝正态性假设。

我的经验:JB检验对样本量很敏感。样本量越大,越容易拒绝正态性。我一般会结合样本量来解读——如果样本量超过1000,p值小于0.01才值得警惕。

Python实现非常简单:

import numpy as np
from scipy import stats

# 模拟收益率数据
np.random.seed(42)
returns = np.random.randn(1000)  # 正态分布

# Jarque-Bera检验
jb_stat, jb_p = stats.jarque_bera(returns)
print(f"JB统计量: {jb_stat:.4f}")
print(f"p值: {jb_p:.4f}")

# 如果p值 < 0.05,拒绝正态性假设
if jb_p < 0.05:
    print("拒绝正态性假设:数据不服从正态分布")
else:
    print("无法拒绝正态性假设:数据可能服从正态分布")

4.3 Shapiro-Wilk检验

Shapiro-Wilk检验是另一个常用的方法。它的原理比较绕,但你可以简单理解为:它把样本排序后,和理论上的正态分位数做相关性分析。相关性越高,越像正态分布。

我个人觉得,SW检验比JB检验更可靠,尤其是在小样本(n < 50)的情况下。但它的缺点是计算量稍大,而且对重复值敏感。

注意:Shapiro-Wilk检验在样本量超过5000时,几乎一定会拒绝正态性假设。这时候就别用了,改用其他方法。

代码实现:

# Shapiro-Wilk检验
sw_stat, sw_p = stats.shapiro(returns[:100])  # 取前100个样本
print(f"SW统计量: {sw_stat:.4f}")
print(f"p值: {sw_p:.4f}")

if sw_p < 0.05:
    print("拒绝正态性假设")
else:
    print("无法拒绝正态性假设")

4.4 QQ图:最直观的"照妖镜"

说实话,统计检验再漂亮,也不如一张图来得直观。QQ图(Quantile-Quantile Plot)就是干这个的。

原理很简单:把样本的分位数和理论正态分布的分位数画在同一个坐标系里。如果数据是正态的,点应该落在45度对角线上。如果偏离了,就能看出是左偏、右偏,还是厚尾。

我在项目中遇到过最典型的案例:某只股票的日收益率QQ图,中间部分贴着对角线走,但两端明显翘起。这就是典型的"中间正态,两端厚尾"——用正态分布算VaR,中间部分没问题,但极端情况全错。

import matplotlib.pyplot as plt
import scipy.stats as stats

# 生成QQ图
plt.figure(figsize=(8, 6))
stats.probplot(returns, dist="norm", plot=plt)
plt.title("QQ图:正态性检验")
plt.xlabel("理论分位数")
plt.ylabel("样本分位数")
plt.grid(True, alpha=0.3)
plt.show()
读图技巧:
  • 点落在对角线上 → 正态分布
  • 两端向上翘起 → 厚尾(峰度 > 3)
  • 整体呈S形 → 偏态分布
  • 中间贴合、两端偏离 → 中间正态,极端值异常

4.5 知识体系图

下面这张图总结了正态性检验的完整流程。我建议你把它存下来,做VaR模型时对照着用。

正态性检验知识体系 收益率数据 Jarque-Bera检验 Shapiro-Wilk检验 QQ图 输出: JB统计量 + p值 偏度、峰度 输出: SW统计量 + p值 适合小样本 输出: 可视化图形 偏离方向判断 综合判断:是否服从正态分布? 决定VaR模型是否适用正态分布假设

4.6 实战建议

说了这么多,最后给几条实在的建议:

  1. 不要只看一个检验。我习惯同时跑JB检验和SW检验,再画一张QQ图。三个结果互相印证,比单一指标靠谱得多。
  2. 注意样本量。样本量小于50,优先用SW检验;样本量在50-5000之间,JB和SW都可以;样本量超过5000,QQ图比统计检验更有参考价值。
  3. 拒绝正态性不等于模型不能用。我曾经处理过一个组合,JB检验p值只有0.001,但QQ图显示偏离主要发生在尾部。这种情况下,我选择用t分布替代正态分布,效果反而更好。
  4. 动态检验。别只做一次检验就完事。市场环境会变,我建议每季度重新跑一次正态性检验,看看假设是否还成立。
避坑指南:我曾经犯过一个错误——用日收益率做正态性检验通过了,就直接套用到周收益率上。结果发现周收益率的峰度远高于日收益率。后来才意识到,不同时间频率的数据,分布特征完全不同。一定要用你实际建模用的数据来做检验。

好了,正态性检验这部分就讲到这里。记住一句话:检验不是为了证明,而是为了理解。理解了数据的真实分布,你才能做出靠谱的VaR模型。


公众号:蓝海资料掘金营,微信deep3321