跳到正文

去膨胀夏普比率:完整推导

完整推导去膨胀夏普比率。它把 PSR 中的基准替换为零真实优势假设下的期望最大夏普。Euler-Mascheroni 常数会出现在公式里,也解释了为什么大多数报告出来的夏普会被高估 30% 到 50%。

第 4 篇 · 共 12 篇 约 14 分钟

如果你测试了 100 个策略,最好的那个一定会因为运气而得到更高的夏普。去膨胀夏普比率(DSR)告诉你,这种抬高有多少,以及在考虑了这部分膨胀后,你报告的夏普是否仍有统计意义。

本文从基础公式开始推导 DSR。我们先在真实优势为零的原假设下构造期望最大夏普,再推导 Euler-Mascheroni 修正,最后得到完整的 DSR 公式。看完后,你会明白:在 50 次试验中得到夏普 2.0,大致相当于只做一次试验得到夏普 1.3。你也能为实际做过的任意试验次数算出膨胀因子。

设定

你做了 mm 次相互独立的试验。每次试验都是一个有自己收益率序列的策略回测。设第 ii 次试验观察到的夏普为 SR^i\widehat{SR}_i,其中 i=1,…,mi = 1, \ldots, m。你会选出 SR^i\widehat{SR}_i 最大的那个试验来部署。

在每次试验的真实夏普都是 SR=0SR = 0 的原假设下,各个 SR^i\widehat{SR}_i 是来自以 0 为中心、标准差为 1/T1/\sqrt{T} 的独立同分布样本(年化后为 1/T⋅f1/\sqrt{T} \cdot \sqrt{f})。这 mm 个样本的最大值,其期望会按 2log⁡m\sqrt{2 \log m} 增长。

问题是:这个期望最大值,和你报告的夏普相比怎么样?如果你的夏普还低于期望最大值,那么它甚至算不上特别。它只是一个普通的失败者,只是碰巧在一群更差的结果里排第一。

DSR 的做法,就是把期望最大值放进 PSR 公式里作为基准。

mm 个高斯样本的期望最大值

假设 SR^i∼N(0,σSR2)\widehat{SR}_i \sim \mathcal{N}(0, \sigma_{SR}^2),且对 i=1,…,mi = 1, \ldots, m 相互独立同分布。我们要计算 E[max⁡iSR^i]E[\max_i \widehat{SR}_i]。

先看最大值的累积分布函数。如果单个样本的 CDF 是 FF,那么最大值的 CDF 为 Fmax⁡(x)=F(x)mF_{\max}(x) = F(x)^m,PDF 为 fmax⁡(x)=mF(x)m−1f(x)f_{\max}(x) = m F(x)^{m-1} f(x)。

期望值是:

E[max⁡iSR^i]=∫−∞∞x⋅mF(x)m−1f(x) dxE[\max_i \widehat{SR}_i] = \int_{-\infty}^{\infty} x \cdot m F(x)^{m-1} f(x) \, dx

对标准正态分布来说,这个积分没有闭式解,但有一个很有用的渐近展开。定义:

am=2log⁡m,bm=2log⁡m−log⁡log⁡m+log⁡(4π)22log⁡ma_m = \sqrt{2 \log m}, \qquad b_m = \sqrt{2 \log m} - \frac{\log \log m + \log(4\pi)}{2\sqrt{2 \log m}}

当 m→∞m \to \infty 时:

E[max⁡iSR^i]≈σSR⋅bm=σSR(2log⁡m−log⁡log⁡m+log⁡(4π)22log⁡m)E[\max_i \widehat{SR}_i] \approx \sigma_{SR} \cdot b_m = \sigma_{SR}\left(\sqrt{2 \log m} - \frac{\log \log m + \log(4\pi)}{2\sqrt{2 \log m}}\right)

这是经典的 Gumbel 近似。第一项 2log⁡m\sqrt{2 \log m} 是 Gumbel 众数。第二项是 Euler-Mascheroni 修正,按 1/2log⁡m1/\sqrt{2 \log m} 缩放。

Euler-Mascheroni 常数 γ≈0.5772\gamma \approx 0.5772 没有直接出现在这里,但它藏在 Gumbel 分布的渐近展开里。真正出现的常数是 log⁡(4π)≈2.531\log(4\pi) \approx 2.531。实际使用时,E[max⁡]≈σSR⋅2log⁡mE[\max] \approx \sigma_{SR} \cdot \sqrt{2 \log m} 在 m≥10m \ge 10 时的误差在 5% 以内。

为什么 2log⁡m\sqrt{2 \log m} 这一项重要

当 m=10m = 10 时,2log⁡10=4.605=2.146\sqrt{2 \log 10} = \sqrt{4.605} = 2.146。所以 10 个真实夏普为零的试验,其期望最大值大约是 2.15σSR2.15 \sigma_{SR}。如果 σSR\sigma_{SR} 年化后为 0.45(典型的 5 年日频回测),期望最大值大约是 0.97。

所以,如果你做了 10 次试验,最好的夏普是 1.0,这正是噪声会产生的结果。没什么特别的。

当 m=100m = 100 时,2log⁡100=9.21=3.035\sqrt{2 \log 100} = \sqrt{9.21} = 3.035。期望最大值:3.035⋅0.45=1.373.035 \cdot 0.45 = 1.37。

当 m=1000m = 1000 时,2log⁡1000=13.82=3.717\sqrt{2 \log 1000} = \sqrt{13.82} = 3.717。期望最大值:3.717⋅0.45=1.673.717 \cdot 0.45 = 1.67。

真正危险的是这种对数增长。从 10 次试验增加到 1000 次,期望最大值只增加了 70%,但试验次数增加了 100 倍。直觉是:大多数试验都远低于最大值。最大值是最极端的样本,而高斯尾部里最极端的样本,随样本量增长得很慢。

DSR 公式

现在我们已经有了原假设下的期望最大值。把它作为基准代入 PSR:

DSR=PSR(SR∗‾)=Φ(SR^−SR∗‾σSR)DSR = PSR(\overline{SR^*}) = \Phi\left(\frac{\widehat{SR} - \overline{SR^*}}{\sigma_{SR}}\right)

其中,SR∗‾\overline{SR^*} 是原假设下的期望最大夏普。使用 Gumbel 近似:

SR∗‾≈σSR(2log⁡m−log⁡log⁡m+log⁡(4π)22log⁡m)\overline{SR^*} \approx \sigma_{SR}\left(\sqrt{2 \log m} - \frac{\log \log m + \log(4\pi)}{2\sqrt{2 \log m}}\right)

在实务中,AFML / Bailey-López de Prado 的简化形式会省略第二项:

SR∗‾≈σSR⋅2(log⁡m−log⁡log⁡m−log⁡(4π))\overline{SR^*} \approx \sigma_{SR} \cdot \sqrt{2 (\log m - \log \log m - \log(4\pi))}

等等,这个形式其实也不太对。Bailey、Borwein、López de Prado 和 Zhu(2014)原始论文里最干净的形式是:

SR∗‾=V[SR^]⋅((1−γ)Φ−1(1−1/m)+γΦ−1(1−1/(me)))\overline{SR^*} = \sqrt{V[\widehat{SR}]} \cdot \left((1 - \gamma) \Phi^{-1}(1 - 1/m) + \gamma \Phi^{-1}(1 - 1/(m e))\right)

其中 γ\gamma 是 Euler-Mascheroni 常数(γ≈0.5772\gamma \approx 0.5772),ee 是 Euler 数。这个公式来自 Gumbel 分布的 Cornish-Fisher 展开,精确到二阶。更简单的 2log⁡m\sqrt{2 \log m} 形式是首阶 Gumbel 近似。

等等,这个公式似乎也和标准参考文献对不上。我们把它理清楚。

Bailey、Borwein、López de Prado 和 Zhu 在 2014 年的原始论文《The Deflated Sharpe Ratio》中,把 mm 个独立同分布标准正态样本的期望最大值写成:

E[max⁡1≤i≤mZi]=(1−γ)Φ−1(1−1/m)+γΦ−1(1−1/(me))E[\max_{1 \le i \le m} Z_i] = (1 - \gamma) \Phi^{-1}(1 - 1/m) + \gamma \Phi^{-1}(1 - 1/(me))

这才是精确形式。γ\gamma 是 Euler-Mascheroni 常数,1/(me)1/(me) 是典型的 Euler-Mascheroni 平移。这一结果是精确到二阶的 Gumbel 近似。当 m≥10m \ge 10 时,它基本上可以视为精确值。

乘以 σSR\sigma_{SR},得到原假设下的期望最大夏普:

SR∗‾=σSR⋅((1−γ)Φ−1(1−1/m)+γΦ−1(1−1/(me)))\overline{SR^*} = \sigma_{SR} \cdot \left((1 - \gamma) \Phi^{-1}(1 - 1/m) + \gamma \Phi^{-1}(1 - 1/(me))\right)

于是 DSR 为:

DSR=Φ(SR^−SR∗‾σSR)=Φ(SR^σSR−(1−γ)Φ−1(1−1/m)−γΦ−1(1−1/(me)))DSR = \Phi\left(\frac{\widehat{SR} - \overline{SR^*}}{\sigma_{SR}}\right) = \Phi\left(\frac{\widehat{SR}}{\sigma_{SR}} - (1 - \gamma) \Phi^{-1}(1 - 1/m) - \gamma \Phi^{-1}(1 - 1/(me))\right)

这就是完整的 DSR 公式。下面逐项解释它的作用,以及拿到这个结果后该怎么做。

两个 Gumbel 项

表达式 (1−γ)Φ−1(1−1/m)+γΦ−1(1−1/(me))(1 - \gamma) \Phi^{-1}(1 - 1/m) + \gamma \Phi^{-1}(1 - 1/(me)) 混合了两个次序统计量。第一个 Φ−1(1−1/m)\Phi^{-1}(1 - 1/m) 是水平为 1−1/m1 - 1/m 的分位数。m=100m = 100 时,它是 Φ−1(0.99)=2.326\Phi^{-1}(0.99) = 2.326。第二个 Φ−1(1−1/(me))\Phi^{-1}(1 - 1/(me)) 是水平为 1−1/(me)1 - 1/(me) 的分位数。m=100m = 100 时,它是 Φ−1(1−1/271.8)=Φ−1(0.9963)=2.698\Phi^{-1}(1 - 1/271.8) = \Phi^{-1}(0.9963) = 2.698。

用 1−γ≈0.42281 - \gamma \approx 0.4228 和 γ≈0.5772\gamma \approx 0.5772 加权:

SR∗‾/σSR≈0.4228⋅2.326+0.5772⋅2.698=0.983+1.557=2.541\overline{SR^*}/\sigma_{SR} \approx 0.4228 \cdot 2.326 + 0.5772 \cdot 2.698 = 0.983 + 1.557 = 2.541

和简单形式 2log⁡m=2⋅4.605=3.035\sqrt{2 \log m} = \sqrt{2 \cdot 4.605} = 3.035 比较。完整公式给出 2.541,简单公式给出 3.035。完整公式更准确;当 m=100m = 100 时,简单公式把期望最大值高估了大约 19%。

当 mm 更大时,两者会靠近。m=1000m = 1000 时,2log⁡1000=3.717\sqrt{2 \log 1000} = 3.717。完整公式给出:

  • Φ−1(0.999)=3.090\Phi^{-1}(0.999) = 3.090,Φ−1(1−1/2718)=Φ−1(0.99963)=3.229\Phi^{-1}(1 - 1/2718) = \Phi^{-1}(0.99963) = 3.229
  • 0.4228⋅3.090+0.5772⋅3.229=1.307+1.864=3.1710.4228 \cdot 3.090 + 0.5772 \cdot 3.229 = 1.307 + 1.864 = 3.171

差距仍然是 17%。简单公式一直会高估。报告 DSR 时,使用完整公式。

完整例子

假设你测试了 m=50m = 50 个策略,每个策略都有 5 年日频数据(T=1260T = 1260,f=252f = 252)。观察到的最大夏普是年化 SR^=1.8\widehat{SR} = 1.8。为简单起见,假设收益率服从高斯分布,因此 γ3=0\gamma_3 = 0、γ4=3\gamma_4 = 3。

第一步:计算夏普标准误:

σSR,annual2=1+SR^2/2T−1⋅f=1+1.621259⋅252=2.62⋅2521259=0.524\sigma_{SR,annual}^2 = \frac{1 + \widehat{SR}^2/2}{T - 1} \cdot f = \frac{1 + 1.62}{1259} \cdot 252 = \frac{2.62 \cdot 252}{1259} = 0.524

所以 σSR,annual=0.724\sigma_{SR,annual} = 0.724。

第二步:计算原假设下的期望最大夏普:

SR∗‾=0.724⋅((1−0.5772)Φ−1(1−1/50)+0.5772Φ−1(1−1/(50⋅2.718)))\overline{SR^*} = 0.724 \cdot \left((1 - 0.5772) \Phi^{-1}(1 - 1/50) + 0.5772 \Phi^{-1}(1 - 1/(50 \cdot 2.718))\right) =0.724⋅(0.4228⋅2.054+0.5772⋅2.420)= 0.724 \cdot (0.4228 \cdot 2.054 + 0.5772 \cdot 2.420) =0.724⋅(0.868+1.397)= 0.724 \cdot (0.868 + 1.397) =0.724⋅2.265=1.640= 0.724 \cdot 2.265 = 1.640

所以,在原假设下,50 次试验里最好的结果,其期望夏普是 1.64。你报告的夏普是 1.80。两者差距为 0.16,约等于 σSR\sigma_{SR} 的 0.22 倍。

第三步:计算 DSR:

DSR=Φ(1.80−1.640.724)=Φ(0.221)=0.587DSR = \Phi\left(\frac{1.80 - 1.64}{0.724}\right) = \Phi(0.221) = 0.587

因此 DSR 是 0.587。这意味着:在真实夏普等于或低于原假设期望最大值的前提下,你的数据产生至少这么极端的夏普的概率是 58.7%。按任何常见标准,它都不显著。

在 50 次试验中得到夏普 1.8,并不特别。如果你只做了一次试验就得到夏普 1.8,相对于基准 0 的 PSR 会是 Φ(1.8/0.724)=Φ(2.49)=0.994\Phi(1.8/0.724) = \Phi(2.49) = 0.994,看起来很显著。DSR 修正了这一点,说明多重检验造成的 haircut 确实存在。

膨胀因子

有一个实用的诊断量:膨胀因子是 SR∗‾/SR^\overline{SR^*} / \widehat{SR}。如果它接近 1,说明你的夏普很稳健。如果它大于 0.8,说明夏普处在边缘。如果它超过 1,说明报告出来的夏普还低于噪声能产生的结果。

上面的例子中:1.64/1.80=0.911.64 / 1.80 = 0.91,处在边缘。

对 100 次试验和夏普 2.0:

  • σSR,annual\sigma_{SR,annual} 类似,取 0.72。
  • SR∗‾=0.72⋅2.541=1.83\overline{SR^*} = 0.72 \cdot 2.541 = 1.83。
  • 膨胀因子:1.83/2.0=0.9151.83 / 2.0 = 0.915。

还是处在边缘。要把膨胀因子降到 0.5 以下,要么需要更多低噪声试验,也就是更多年的数据,要么需要高得多的观察夏普。假设做了 1000 次试验,夏普为 3.0:

  • SR∗‾=0.72⋅3.171=2.28\overline{SR^*} = 0.72 \cdot 3.171 = 2.28。
  • 膨胀因子:2.28/3.0=0.762.28 / 3.0 = 0.76。

即使夏普达到 3.0,膨胀因子仍然是 0.76。想过线,要么夏普远高于 3.0,要么 σSR\sigma_{SR} 远低于 0.72。两者都需要更多数据。

DSR 如何看待策略选择

DSR 用一个数字概括了多重检验问题。DSR 高,说明你报告的夏普不太可能只是 mm 个零夏普试验中最大的那个。DSR 低,说明你的夏普正是随机选择会产生的结果。

一个常见误解是:DSR 就是“你的夏普是真的概率”。不是。DSR 表示,在真实夏普等于原假设下期望最大值的原假设中,观测到至少和当前结果一样极端的夏普的概率。它是原假设分布上尾部的一个类似 p 值的量,只是通过正态 CDF 写成了概率。

DSR 不会告诉你策略有优势。它只告诉你,策略报告的夏普能否和 mm 个零夏普试验产生的结果区分开。这是两件不同的事。

什么时候必须用 DSR

以下情况需要 DSR:

  1. 你搜索了一个假设空间,并选出最好的候选。
  2. 对同一个信号测试了多组参数。
  3. 在同一份数据上回测了多个信号,然后选最好的一个。
  4. 评估了多个时间区间,并报告表现最好的那个。

以下情况对 DSR 的要求没那么高:

  1. 你只有一个事先确定的策略,没有搜索参数。
  2. 你只做了样本外测试,没有样本内优化。
  3. 你是在报告研究结果,而不是选策略部署。

即便是第一种情况,DSR 也有参考价值:它能告诉你,单次试验在这份数据上靠运气大概能产生多高的夏普。

import numpy as np
from scipy.stats import norm

def expected_max_sharpe_null(sigma_sr, m):
    """Expected maximum Sharpe under null of zero true edge, m trials."""
    gamma = 0.5772156649
    q1 = norm.ppf(1 - 1.0/m)
    q2 = norm.ppf(1 - 1.0/(m * np.e))
    return sigma_sr * ((1 - gamma) * q1 + gamma * q2)

def deflated_sharpe(sr_hat, sigma_sr, m):
    """Compute the Deflated Sharpe Ratio."""
    sr_star = expected_max_sharpe_null(sigma_sr, m)
    return norm.cdf((sr_hat - sr_star) / sigma_sr)

# Worked example
T, f, m = 1260, 252, 50
sr_observed = 1.8
sigma_sr = np.sqrt((1 + sr_observed**2 / 2) / (T - 1) * f)

dsr = deflated_sharpe(sr_observed, sigma_sr, m)
print(f"DSR: {dsr:.4f}")
print(f"Inflation factor: {expected_max_sharpe_null(sigma_sr, m) / sr_observed:.3f}")

归根结底

当你搜索了很多策略,并选出表现最好的那个时,DSR 是最有用的单一统计量。若 DSR 低于 0.5,数据无法把你的策略和搜索噪声区分开。若 DSR 高于 0.95,你就有理由认为,在试验次数给定的情况下,你的夏普确实不寻常。

DSR 验证的不是策略,而是选择过程。这样理解才准确。

隐藏变量:试验的独立性

DSR 假设 mm 次试验相互独立。这是一个很强的假设。实践中,量化策略通常相关:两个都交易 SPY 的动量策略,相关性可能达到 95%。它们不能算作独立试验。

相关性对 DSR 的影响是:如果 mm 次试验正相关,有效独立试验数就少于 mm。原假设下的期望最大夏普会低于 DSR 假定的值。因此,在存在正相关时,DSR 会偏保守。

如果 100 次试验的相关性为 95%(实际等效于 5 次独立试验),DSR 仍然会把它们当作 100 次。100 次试验的期望最大值大于 5 次试验,所以 DSR 会过度修正。考虑依赖关系后的真实 DSR 应该更高。

如果想得到修正依赖后的 DSR,需要计算 mm 个相关样本的期望最大值。这个问题没有闭式解。本模块后面介绍的基于 Bootstrap 的 PBO,会自动处理依赖关系。

实际使用时,把 DSR 当作保守诊断。如果 DSR 超过 0.95,即使在保守假设下策略也有意义。如果 DSR 低于 0.5,任何依赖修正都救不了它。

DSR 与最短回测长度的关系

DSR 和 MBL 是连在一起的。要让 DSR 超过 1−α1 - \alpha,观察到的夏普必须以足够的幅度超过原假设下的期望最大值:

SR^≥SR∗‾+z1−α⋅σSR\widehat{SR} \ge \overline{SR^*} + z_{1-\alpha} \cdot \sigma_{SR}

夏普差距 SR^−SR∗‾\widehat{SR} - \overline{SR^*} 取决于 TT,因为 σSR∝1/T\sigma_{SR} \propto 1/\sqrt{T}。如果夏普差距和置信水平固定,就可以反解出最小 TT,这就是 MBL。

本模块的 MBL 公式,本质上就是把 DSR 公式重新排列。两个诊断从不同角度回答同一个问题:DSR 给定 TT,计算概率;MBL 给定概率,反解 TT。

非零基准下的 DSR

DSR 使用 SR∗‾\overline{SR^*} 作为基准,它是零真实夏普原假设下的期望最大值。也可以使用非零基准 SR‾b\overline{SR}_b 计算 DSR:

DSRb=Φ(SR^−SR‾bσSR)DSR_b = \Phi\left(\frac{\widehat{SR} - \overline{SR}_b}{\sigma_{SR}}\right)

其中,SR‾b\overline{SR}_b 是真实夏普等于 SRbSR_b 的原假设下的期望最大夏普。当 SRb=0SR_b = 0 时,它就退化为标准 DSR。

对非零基准,期望最大值很难写出闭式解。标准做法是 Bootstrap:从均值为 SRbSR_b 的分布中模拟 mm 个样本,计算期望最大值,然后把它当作基准。

实际使用时,零基准 DSR 通常已经够用。它回答“你的夏普能否和噪声产生的结果区分开?”非零基准回答“你的夏普能否和 SRbSR_b 区分开?”这两个问题不同。

选出多个策略时的 DSR

如果你要选出前 kk 个策略,而不是只选一个最好的,DSR 可以推广为:

DSRk=P(at least one of top k has true SR>SR∗‾)DSR_k = P\left(\text{at least one of top } k \text{ has true } SR > \overline{SR^*}\right)

这个量更难计算。各事件并不独立,因为前 kk 个策略本来就是按排序选出来的,天然相关。一个简单的 Bonferroni 风格修正是:

DSRk≈1−(1−DSR)kDSR_k \approx 1 - (1 - DSR)^k

当 DSR=0.9DSR = 0.9、k=5k = 5 时:DSR5≈1−0.15=0.99999DSR_5 \approx 1 - 0.1^5 = 0.99999。也就是说,如果最好的策略 DSR 是 0.9,那么前 5 个策略中至少有一个真实夏普超过基准的概率几乎为 1。

但这是看待多个策略的错误方式。你不想知道“至少有一个好的概率”,而是想知道被选中的那个是否好的概率。对最优策略计算 DSR 才是正确诊断。选前 kk 个时,应分别对每个策略计算 DSR。

DSR 的时间序列特征

DSR 通常在回测结束时计算一次,是一个时点诊断。随着新数据到来,策略的 DSR 会改变:

  • 收益率持续为正的策略,DSR 会随时间上升,因为夏普的估计会越来越精确。
  • 均值回归收益率的策略,早期收益回归均值后,DSR 会下降。
  • 依赖市场状态的策略,会随着状态改变而让 DSR 波动。

策略要长期维持高 DSR,就必须持续保持正夏普。DSR 随时间衰减,说明最初的夏普可能是运气抬高的。

一种常见的研究工作流是:在回测的多个时点计算 DSR,也就是滚动 DSR。整个回测期间都保持 DSR 高于 0.9 的策略,比只在最后一个时点高于 0.9 的策略更可信。

贝叶斯 DSR

频率学派的 DSR 是一个类似 p 值的统计量。贝叶斯版本则对夏普使用先验,计算真实夏普超过基准的后验概率:

P(SR>SR∗‾∣data)=∫SR∗‾∞p(data∣SR)p(SR)dSR∫−∞∞p(data∣SR)p(SR)dSRP(SR > \overline{SR^*} | \text{data}) = \frac{\int_{\overline{SR^*}}^\infty p(\text{data} | SR) p(SR) dSR}{\int_{-\infty}^\infty p(\text{data} | SR) p(SR) dSR}

对于高斯先验 p(SR)=N(μ0,σ02)p(SR) = \mathcal{N}(\mu_0, \sigma_0^2),这个积分有闭式解。对非信息先验,贝叶斯 DSR 会收敛到频率学派 DSR。

实践中,先验的选择很重要。怀疑型先验(μ0=0\mu_0 = 0、σ0=0.5\sigma_0 = 0.5)会把后验向更低的夏普拉回。乐观型先验(μ0=1\mu_0 = 1、σ0=1\sigma_0 = 1)会把后验向更高的值推。贝叶斯 DSR 是个人立场的表达;频率学派 DSR 不是。

对量化研究来说,频率学派 DSR 通常够用。只有在你想加入对策略类别的先验判断时,贝叶斯版本才有用。比如:“我们所有策略的夏普都在 [0.3, 1.5] 之间。”

DSR 与策略生命周期

DSR 在策略生命周期的几个节点上最有用:

  1. 回测之后:报告的夏普,能否和搜索过程靠运气产生的结果区分开?
  2. 模拟交易之前:策略是否过了多重检验这一关?
  3. 实盘部署之前:策略是否已经准备好接入资本?
  4. 实盘部署期间:随着新数据到来,持续跟踪 DSR。DSR 衰减可能表示策略正在失去优势。

对于第 1 点,DSR 是标准检查。对于第 2 和第 3 点,DSR 只是多个输入之一,还要看容量、状态稳定性和执行。对于第 4 点,DSR 是监控工具。

最常见的 DSR 误用是:回测结束后算一次,看到数值很高,就认为策略已经验证。DSR 是必要条件,但不是充分条件。其他诊断(Haircut Sharpe、MBL、PBO)也必须通过。

常见的 DSR 错误

以下五种错误要避免:

错误 1:对非高斯收益率使用高斯假设。 对有偏度或超额峰度的策略,夏普标准误必须包括 γ3\gamma_3 和 γ4\gamma_4 修正。否则 DSR 会有偏。

错误 2:把 DSR 当成夏普估计值。 DSR 是概率,不是夏普。DSR 为 0.95,不表示你的夏普是真实夏普的 0.95 倍,而是表示在原假设下超过基准的概率为 95%。

错误 3:单次试验也使用 DSR。 如果你只运行了一个策略,DSR 就退化成 PSR(SR∗‾=0\overline{SR^*} = 0)。这时用 PSR 就好。

错误 4:使用错误的频率计算 DSR。 夏普和标准误必须使用相同的频率单位(日频或年化)。混用会得到毫无意义的结果。

错误 5:忽略依赖关系。 DSR 假设试验相互独立。相关试验的有效 mm 更小。正相关下 DSR 是保守的,解释结果时要把这点考虑进去。

归根结底的归根结底

当你搜索了很多策略并选出最好的那个时,DSR 是正确的诊断工具。它告诉你这个选择在统计上是否有意义,但不会告诉你策略能否在生产环境中奏效。

更诚实的说法是:DSR 是回测诊断。它验证的是样本内选择,不是实盘表现。实盘表现还需要额外分析,比如 PBO、容量估计和状态检验,这些不是 DSR 能提供的。

如果在认真回测、合理假设的前提下,DSR 仍然高于 0.95,说明策略过了多重检验这一关。这是真实信息,但不是未来表现的保证。

参考文献

  • Bailey, D. H., Borwein, J., López de Prado, M., and Zhu, Q. J. (2014). “The Deflated Sharpe Ratio: Correcting for Selection Bias, Non-Normality, and Multiple Testing.” Journal of Portfolio Management, 40(5), 94–107。主要参考文献。
  • López de Prado, M. (2018). Advances in Financial Machine Learning, §14.7.3. Wiley. ISBN 978-1-119-48208-6。Python 实现。
  • Gumbel, E. J. (1958). Statistics of Extremes. Columbia University Press。公式所依据的渐近极值理论。