夏普比率的统计陷阱

一份回测用 252 个日收益率算出年化夏普 1.5。它显著吗?在 IID 正态近似下,年化标准误约为 1.00,而不是 0.09;近似 95% 置信区间是 [-0.46, 3.46]。

这个很宽的区间揭示了常见实现错误:把年化夏普直接代入为单期夏普推导的标准误公式。

本文分别回答三个问题:

  1. 单个策略的夏普有多不确定?
  2. 它超过预先指定基准的概率是多少(PSR)?
  3. 从多个策略中挑出赢家后,它还能否超过相应门槛(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.02521.00[-0.96, 2.96]
1.07560.58[-0.13, 2.13]
2.02521.00[0.03, 3.97]
2.07560.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 就一定过拟合”或“实盘夏普等于回测的一半”都不是统计定律,只能作为进一步排查的提示。

六、决策检查清单

  1. 检查收益对齐、价格、公司行动以及未来信息。
  2. 扣除合理的手续费、买卖价差、滑点、借券成本和市场冲击。
  3. 明确夏普频率;估计值和不确定性必须一起转换。
  4. 使用 IID 公式前检查自相关与重叠观测。
  5. 用看结果之前确定的门槛计算 PSR。
  6. 保存所有试验;从多个方案中选择时计算 DSR。
  7. 保留真正未触碰的验证期,并把后续实盘证据单独报告。

PSR 和 DSR 只回答有限的统计问题。它们是证据过滤器,不是上线许可。

一手来源与延伸阅读

引用本章
Zhang, Wayland (2026). 夏普比率的统计陷阱:置信区间、PSR 与 DSR. In AI Quantitative Trading: From Zero to One. https://waylandz.com/quant-book/%E5%A4%8F%E6%99%AE%E6%AF%94%E7%8E%87%E7%9A%84%E7%BB%9F%E8%AE%A1%E9%99%B7%E9%98%B1/
@incollection{zhang2026quant_chapter_14e5xvb,
  author = {Zhang, Wayland},
  title = {夏普比率的统计陷阱:置信区间、PSR 与 DSR},
  booktitle = {AI Quantitative Trading: From Zero to One},
  year = {2026},
  url = {https://waylandz.com/quant-book/%E5%A4%8F%E6%99%AE%E6%AF%94%E7%8E%87%E7%9A%84%E7%BB%9F%E8%AE%A1%E9%99%B7%E9%98%B1/}
}