4. 描述性统计:均值、方差、偏度、峰度,正态性检验(Jarque-Bera)
各位同学,今天我们聊聊描述性统计。说白了,就是给数据「做体检」。你拿到一堆收益率数据,不能直接往上怼模型吧?得先看看它长什么样——胖的瘦的、歪的正的、有没有异常值。
我个人习惯,拿到数据第一件事就是算这四个指标:均值、方差、偏度、峰度。它们就像四个维度,帮你快速勾勒出数据的轮廓。
4.1 均值与方差:数据的「位置」和「离散度」
均值,就是平均收益。你投了100只股票,平均每天赚多少?这个数告诉你。
但均值有个坑——它怕极端值。我记得有一次做回测,某天某只股票因为乌龙指涨了100倍,均值直接飞上天。嗯,这时候中位数反而更靠谱。
方差,衡量数据波动大小。方差越大,风险越高。但注意,方差是平方过的单位,不好解释。所以我们常用标准差——跟原始数据同单位,更直观。
核心公式:
- 均值:μ = (1/N) * Σ r_i
- 方差:σ² = (1/N) * Σ (r_i - μ)²
- 标准差:σ = √σ²
我的经验:计算方差时,用样本方差(除以N-1)还是总体方差(除以N)?如果你数据量够大(比如几千个交易日),差别微乎其微。但小样本时,记得用样本方差,不然会低估波动。
4.2 偏度与峰度:数据「长歪了」吗?
偏度,衡量数据分布是否对称。
- 偏度=0:左右对称,像正态分布。
- 偏度>0:右偏,尾巴在右边。说明有少量极端正收益。
- 偏度<0:左偏,尾巴在左边。说明有少量极端负收益。
做对冲策略时,我特别关注偏度。你想想看,如果某只股票偏度是负的,意味着它经常小涨,但偶尔暴跌。这种「慢涨急跌」的品种,做空它可能更划算。
峰度,衡量数据「尖」还是「平」。
- 峰度=3:正态分布。
- 峰度>3:尖峰厚尾。极端值比正态分布更多。
- 峰度<3:平峰薄尾。极端值更少。
金融数据几乎都是尖峰厚尾的。为什么?因为市场会突然暴跌或暴涨,正态分布根本兜不住。我曾经用正态分布模型做VaR,结果回测时发现实际亏损比模型预测的大得多——嗯,这就是没考虑厚尾的代价。
避坑指南:计算峰度时,有些软件返回的是「超额峰度」(峰度-3)。比如Excel的KURT函数,返回的就是超额峰度。记得看清楚文档,别搞混了。
4.3 正态性检验:Jarque-Bera 检验
前面说了偏度和峰度,那怎么判断数据是不是正态分布呢?JB检验就是干这个的。
JB统计量的公式:
JB = (N/6) * [S² + (K-3)²/4]
其中S是偏度,K是峰度,N是样本量。
如果数据是正态的,S≈0,K≈3,JB≈0。JB值越大,越不像正态分布。
实际应用中,JB检验的p值小于0.05,我们就拒绝「数据服从正态分布」的原假设。说实话,金融数据几乎100%会拒绝正态假设。但JB检验仍然有用——它告诉你「偏离正态的程度」有多大。
我的习惯:JB检验只是第一步。我还会画Q-Q图,直观看看数据尾部有多厚。两个工具配合使用,心里更有底。
4.4 实战:用Python计算股票收益率描述性统计
光说不练假把式。我们拿贵州茅台(600519.SH)过去3年的日收益率来算一算。
import yfinance as yf
import pandas as pd
import numpy as np
from scipy import stats
# 1. 获取数据
ticker = "600519.SS"
data = yf.download(ticker, start="2021-01-01", end="2024-01-01")
data['Return'] = data['Close'].pct_change().dropna()
# 2. 计算描述性统计
returns = data['Return'].dropna()
mean = np.mean(returns)
var = np.var(returns, ddof=1) # 样本方差
std = np.std(returns, ddof=1)
skew = stats.skew(returns)
kurt = stats.kurtosis(returns, fisher=True) # 超额峰度
# 3. Jarque-Bera 检验
jb_stat, jb_pvalue = stats.jarque_bera(returns)
# 4. 打印结果
print(f"均值: {mean:.6f}")
print(f"方差: {var:.8f}")
print(f"标准差: {std:.6f}")
print(f"偏度: {skew:.4f}")
print(f"超额峰度: {kurt:.4f}")
print(f"JB统计量: {jb_stat:.4f}")
print(f"JB p值: {jb_pvalue:.6e}")
输出结果大概长这样:
| 指标 | 值 |
|---|---|
| 均值 | 0.000312 |
| 标准差 | 0.018452 |
| 偏度 | -0.2341 |
| 超额峰度 | 2.8765 |
| JB p值 | 0.000000 |
看到没?偏度是负的,说明茅台偶尔会大跌。超额峰度2.87,远大于0,说明厚尾严重。JB p值几乎为0,铁定不是正态分布。
实战心得:我每次做策略回测前,都会先跑一遍这个代码。如果发现某只股票的偏度特别负,我会格外小心——它可能在压力测试中给你「惊喜」。
4.5 知识体系总览
下面这张图,帮你把本章的知识点串起来:
这张图把四个核心指标和JB检验串起来了。你从「描述性统计」出发,先算均值、方差、偏度、峰度,然后用JB检验判断是否正态,最后用Python落地。每一步都有它的意义。
公众号:蓝海资料掘金营,微信deep3321