夏普比率的统计陷阱
一份回测用 252 个日收益率算出年化夏普 1.5。它显著吗?在 IID 正态近似下,年化标准误约为 1.00,而不是 0.09;近似 95% 置信区间是 [-0.46, 3.46]。
这个很宽的区间揭示了常见实现错误:把年化夏普直接代入为单期夏普推导的标准误公式。
本文分别回答三个问题:
- 单个策略的夏普有多不确定?
- 它超过预先指定基准的概率是多少(PSR)?
- 从多个策略中挑出赢家后,它还能否超过相应门槛(DSR)?
这些统计量都不能证明策略实盘有效,也不能修复未来信息、错误价格、遗漏成本或反复使用样本外数据。
一、同一个夏普,两种单位
对每期超额收益:
SR_单期 = 平均超额收益 / 超额收益标准差
SR_年化 = sqrt(A) * SR_单期
A 是每年期数,日频常取 252,月频常取 12。在 IID 正态收益假设下,常用的大样本近似为:
SE(SR_单期) ≈ sqrt((1 + SR_单期² / 2) / N)
估计值乘以 sqrt(A),标准误也必须乘以 sqrt(A)。写成年化单位:
SE(SR_年化) ≈ sqrt((A + SR_年化² / 2) / N)
不能把年化夏普直接放进第一条公式。
日收益率示例
下表使用 估计值 ± 1.96 × SE,只是近似区间,不是保证。
| 年化夏普 | 日观测数 | 年化标准误 | 近似 95% 区间 |
|---|---|---|---|
| 1.0 | 252 | 1.00 | [-0.96, 2.96] |
| 1.0 | 756 | 0.58 | [-0.13, 2.13] |
| 2.0 | 252 | 1.00 | [0.03, 3.97] |
| 2.0 | 756 | 0.58 | [0.86, 3.14] |
观测数增加会缩小区间;仅仅更换年化标签不会增加信息。如果收益重叠或存在自相关,IID 区间仍可能过于乐观。Lo(2002)说明了序列相关为什么会改变夏普的统计推断。
二、口径一致的代码
from math import sqrt
from statistics import NormalDist
normal = NormalDist()
def annualized_sharpe_se(sr_annual: float, n: int, periods: int = 252) -> float:
"""IID 正态近似,输出单位为年化夏普。"""
return sqrt((periods + sr_annual**2 / 2) / n)
def annualized_sharpe_ci(
sr_annual: float, n: int, periods: int = 252, confidence: float = 0.95
) -> tuple[float, float]:
se = annualized_sharpe_se(sr_annual, n, periods)
z = normal.inv_cdf((1 + confidence) / 2)
return sr_annual - z * se, sr_annual + z * se
下载无第三方依赖的可执行核验脚本,保存为 verify-sharpe-statistics.py,再运行 python3 verify-sharpe-statistics.py,即可核验年化转换以及下文的 PSR、DSR 公式。
三、PSR:超过明确基准的概率
概率夏普比率(Probabilistic Sharpe Ratio)估计真实夏普超过基准 SR* 的概率,同时考虑样本长度、偏度和峰度:
PSR(SR*) = Φ(
(SR - SR*) * sqrt(N - 1)
/ sqrt(1 - 偏度 * SR + ((峰度 - 1) / 4) * SR²)
)
这里的峰度是原始峰度,正态分布为 3,而不是超额峰度。SR 与 SR* 必须采用相同频率。稳妥的实现应先把二者从年化值转换回观测频率,再代入公式。
年化夏普 1.5、252 个 IID 正态日收益、基准为 0 时,PSR 约为 93.2%,低于单边 95% 门槛。而且这只是单次检验,尚未处理“测试很多方案后只报告最好一个”的选择偏差。
四、DSR:处理赢家选择偏差
如果研究者测试了很多策略并只报告最高夏普,合理的零假设门槛不一定是 0。Bailey 与 López de Prado 的 Deflated Sharpe Ratio,本质上是以所有试验夏普的期望最大值作为门槛来计算 PSR。
论文公式 1 给出了包含试验分布均值 μ_SR 的一般期望最大值。但公式 2 定义的标准 DSR 以实际夏普为零作为零假设,因此拒绝门槛将均值项设为零,只使用 K 个近似独立试验夏普的离散程度 σ_SR:
SR* = σ_SR * [
(1 - γ) * Φ⁻¹(1 - 1/K)
+ γ * Φ⁻¹(1 - 1/(K * e))
]
其中 γ ≈ 0.5772 是欧拉—马歇罗尼常数,随后计算 DSR = PSR(SR*)。如果再加上试验夏普的经验均值,检验的就不再是标准的零均值零假设 DSR,而是另一个基准检验。
两个容易被忽略的条件:
- DSR 需要所有试验夏普的离散程度,不是只有参数组合数量就够了。
- 高度相关的参数变体并非独立试验。论文讨论了如何估计有效独立试验数;直接使用 1 或原始网格数量都可能错误校正。
- 只有一次试验时,多重检验门槛为零,DSR 退化为相对零基准的 PSR。
因此必须保存全部试验,包括失败结果。缺少这些记录,就无法诚实地重建期望最大夏普门槛。
五、夏普报告应该包含什么
| 字段 | 用途 |
|---|---|
| 收益频率与年化因子 | 防止日频和年化单位混用 |
| 非重叠观测数量 | 明确真实样本量 |
| 样本夏普与不确定性方法 | 避免只有点估计 |
| 偏度及原始/超额峰度标记 | 保证 PSR 公式口径正确 |
| 全部试验或有效独立试验 | 让选择偏差校正可审计 |
| 成本、滑点与数据截止日期 | 区分统计推断和回测真实性 |
| 未触碰的验证集规则 | 反复查看后,验证集会变成训练数据 |
“夏普超过 3 就一定过拟合”或“实盘夏普等于回测的一半”都不是统计定律,只能作为进一步排查的提示。
六、决策检查清单
- 检查收益对齐、价格、公司行动以及未来信息。
- 扣除合理的手续费、买卖价差、滑点、借券成本和市场冲击。
- 明确夏普频率;估计值和不确定性必须一起转换。
- 使用 IID 公式前检查自相关与重叠观测。
- 用看结果之前确定的门槛计算 PSR。
- 保存所有试验;从多个方案中选择时计算 DSR。
- 保留真正未触碰的验证期,并把后续实盘证据单独报告。
PSR 和 DSR 只回答有限的统计问题。它们是证据过滤器,不是上线许可。
一手来源与延伸阅读
- Andrew W. Lo,The Statistics of Sharpe Ratios(2002):抽样分布与序列相关影响。
- David H. Bailey、Marcos López de Prado,The Deflated Sharpe Ratio(2014):PSR、期望最大值与多重检验校正。
- William F. Sharpe,The Sharpe Ratio(1994):定义与测量频率一致性。
- 数学与统计基础
- 回测系统的陷阱