关于 statistics-fundamentals
面向金融数据分析的统计基础技能,涵盖描述统计、分布检验、协方差估计、回归诊断与自助法,并提供 Python 计算方法。
主要功能
- 01描述统计与年化波动率
- 02Jarque-Bera 正态性检验
- 03协方差估计与收缩
- 04CAPM 回归诊断
- 05自助法置信区间
适用场景
- 01检查收益率分布与极端值
- 02为投资组合优化估计协方差
- 03评估 CAPM 的 alpha 与 beta
- 04为 Sharpe 比率估算置信区间
安装
复制下面的命令,在终端中运行。
npx skills add https:/ / github.com/ joellewis/ finance_skills --skill statistics-fundamentals安装后在 Claude Code 中输入/statistics-fundamentals确认已加载。
附带文件scripts/statistics_fundamentals.py
详细介绍
统计学基础
核心概念
约定与决策规则
样本方差:使用 n-1
根据收益率样本估算方差或标准差时,除以 n - 1(贝塞尔校正),而不是 n。除以 n 会系统性低估离散程度。收益率的标准差称为“波动率”;年化计算公式为 sigma_annual = sigma_period * sqrt(periods_per_year)(例如,月度数据乘以 sqrt(12),日度数据乘以 sqrt(252))。
正态性检验:Jarque-Bera 及其局限
JB = (n/6) * (skew^2 + excess_kurtosis^2 / 4);在正态性原假设下服从自由度为 2 的卡方分布(5% 临界值:5.99)。
**检验效力较低的注意事项:**样本较小时(n 大约低于 50),即使数据明显不服从正态分布,JB 检验也很少拒绝原假设——未能拒绝只能作为正态性的弱证据,并不代表确认正态性。样本较大时,金融收益率序列几乎总会被检验为不服从正态分布,这是因为其具有肥尾特征,且(对于股票)存在负偏度。应将该检验作为初筛,并结合实际偏度、峰度的大小以及极端观测值进行判断。
协方差估计与 Ledoit-Wolf 收缩
当资产数量 p 接近观测值数量 n 时,样本协方差矩阵 Sigma_hat = (1/(n-1)) (X - X_bar)^T (X - X_bar) 会变得条件不良或奇异。将其代入均值-方差优化器,会产生极端、不稳定的权重,这些权重会因数据的微小变化而大幅变动。
收缩通过将样本矩阵向结构化目标矩阵调整来进行融合:
$$\hat{\Sigma}_{shrunk} = \delta \cdot F + (1 - \delta) \cdot \hat{\Sigma}$$
其中,F 是目标矩阵(例如,缩放后的单位矩阵),delta 是收缩强度。Ledoit-Wolf(2004)推导出使到真实协方差矩阵的预期平方 Frobenius 距离最小的 delta,以少量偏差换取大幅降低方差,从而得到条件更好、可逆的矩阵和更稳定的投资组合权重。
**注意:**随附脚本中的 shrunk_covariance 实现的是简化的收缩强度估计,而非完整的 Ledoit-Wolf 估计器。生产环境中请使用 sklearn.covariance.LedoitWolf。
回归诊断(CAPM 和因子模型)
对于单因子 CAPM 回归 R_i - R_f = alpha + beta * (R_m - R_f) + epsilon:
beta = rho * sigma_i / sigma_m(市场敏感度);alpha是风险调整后的超额收益。- 在单因子回归中,
R^2 = rho^2。 - 使用 t 统计量判断系数(
t = coefficient / SE);自由度为n - 2时,|t| 大于约 2 表明在 5% 水平上显著。alpha 点估计为正但 |t| < 2,并不能证明存在投资技能。 - 增加回归变量总会提高 R 平方;应使用调整后 R 平方、AIC/BIC 或交叉验证来防止过拟合。
Bootstrap 步骤
当无法获得统计量(Sharpe 比率、alpha)的解析标准误、分布非正态或样本较小时,可使用非参数重抽样来估计统计量的抽样分布:
- 从原始
n个观测值中,有放回地抽取B个大小为n的重抽样样本(B = 1,000-10,000)。 - 对每个重抽样样本计算统计量。
- 百分位数法:
(1 - alpha)置信区间的上下限分别是 bootstrap 分布的alpha/2和1 - alpha/2百分位数;bootstrap 标准误是B个统计量的标准差。
注意:i.i.d. bootstrap 忽略自相关和波动率聚集;对于存在序列依赖的收益率序列,应使用区块 bootstrap。
标准分析工作流
给定一个收益率序列,按以下顺序执行:
- 描述性统计 — 均值、波动率(n-1)、偏度、超额峰度;报告时进行年化。
- 分布检验 — Jarque-Bera 检验(注意其检验效能较低),检查偏度/峰度的大小和最大离群值;判断基于正态分布的方法(参数 VaR、t 检验)是否合理。
- 协方差/相关性(多资产)— 计算样本协方差矩阵和相关系数矩阵;如果
p相对于n较大,在进行任何优化前应用收缩方法。 - 回归诊断 — 进行 CAPM 或因子回归;报告 alpha/beta、t 统计量和 R 平方;检查残差是否存在结构。
- Bootstrap 置信区间 — 对于没有简洁解析标准误的统计量(Sharpe、alpha、回撤),应通过 bootstrap 计算置信区间,而不是只报告点估计。
示例
示例 1:描述性统计和正态性检验
已知: 12 个月度收益率(%):[2.1, -0.5, 1.8, -3.2, 4.5, 0.3, -1.1, 2.7, -0.8, 3.4, 1.2, -0.6]
Mean = 9.8 / 12 = 0.8167% per month (~9.8% annualized, simple x12)
s^2 = 52.977 / 11 = 4.816 -> s = 2.195% per month
Ann. vol = 2.195% * sqrt(12) = 7.60%
Skewness = -0.045 (bias-corrected; near symmetric)
Ex. kurt = -0.42 (bias-corrected; lighter tails than normal)
JB = (12/6) * ((-0.045)^2 + (-0.42)^2 / 4) = 0.09
JB = 0.09 < 5.99(卡方分布 5% 临界值,df=2):无法拒绝正态性假设。只有 12 个观测值时,检验效能非常低——这并不能证明收益率确实服从正态分布。
示例 2:根据汇总统计量进行 CAPM 回归
已知: 24 个月度观测值。基金超额收益率:均值 0.8%,标准差 4.2%。市场超额收益率:均值 0.6%,标准差 3.8%。相关系数 0.85。
beta = rho * sigma_i / sigma_m = 0.85 * 4.2 / 3.8 = 0.939
alpha = 0.8% - 0.939 * 0.6% = 0.236% per month (~2.84% annualized)
R^2 = rho^2 = 0.7225
Residual std = 4.2% * sqrt(1 - 0.7225) = 2.213%
SE(alpha) = 2.213% / sqrt(24) = 0.452% -> t(alpha) = 0.236 / 0.452 = 0.52
SE(beta) = 2.213% / (3.8% * sqrt(23)) = 0.121 -> t(beta) = 0.939 / 0.121 = 7.74
自由度为 22 时,5% 双尾检验的临界 t 值为 2.074。Beta 显著性很高(7.74 >> 2.074);alpha 不显著(0.52 < 2.074)——尽管点估计为正,样本仍无法将其与零区分开来。
常见陷阱
- 使用总体方差而不是样本方差:根据样本进行估计时,始终使用
n - 1(贝塞尔校正)。 - 假定正态分布,而金融收益率往往具有肥尾:股票收益率通常呈现负偏度和正超额峰度;基于正态分布的模型(标准 VaR)会低估尾部风险。应使用 Student-t 分布或非参数方法。
- 忽略非平稳性:收益率分布会随时间变化(体制变化、波动率聚集)。与全样本统计量相比,滚动窗口估计或 GARCH 可能更合适。
- 因回归变量过多而过拟合:添加因子后,R 平方总会升高;应使用调整后的 R 平方、信息准则或交叉验证。
- 小样本下协方差矩阵不稳定:当
p接近或超过n时,在优化前应用 Ledoit-Wolf 收缩方法或基于因子的协方差模型。
运行脚本
scripts/statistics_fundamentals.py 提供了一个 StatisticsFundamentals 类,其中包含静态方法 descriptive_stats、covariance_matrix、correlation_matrix、shrunk_covariance(简化版 Ledoit-Wolf——参见上面的说明)、ols_regression、rolling_regression、bootstrap_mean 和 jarque_bera_test。
- 运行:
uv run scripts/statistics_fundamentals.py(PEP 723 内联元数据会解析 numpy 和 scipy),或者在已安装 numpy/scipy 的情况下运行python3 scripts/statistics_fundamentals.py。 - 直接运行(或使用
--verify)会打印合成数据的演示,并且断言示例 1 的计算值符合上述结果(12 个月序列的均值为 0.8167、标准差为 2.195、JB 为 0.09),如有任何不匹配则以非零状态码退出。 --help会列出可用方法和导入用法。- 以编程方式使用时,请导入而非运行:
from statistics_fundamentals import StatisticsFundamentals,然后调用例如StatisticsFundamentals.descriptive_stats(...)。
交叉引用
- return-calculations(核心插件):算术平均收益和几何平均收益、用于统计建模的对数收益
- time-value-of-money(核心插件):通过 CAPM 回归估算贴现率;NPV 和 IRR 计算使用统计输入
- factor-investing(财富管理插件):将单因子 CAPM/OLS 回归扩展为 Fama-French 多因子模型,用于阿尔法归因和基金评估
- financial-statements(财富管理插件):将描述性统计和趋势分析应用于财务比率和同业比较