如果你测试了 100 个策略,最好的那个一定会因为运气而得到更高的夏普。去膨胀夏普比率(DSR)告诉你,这种抬高有多少,以及在考虑了这部分膨胀后,你报告的夏普是否仍有统计意义。
本文从基础公式开始推导 DSR。我们先在真实优势为零的原假设下构造期望最大夏普,再推导 Euler-Mascheroni 修正,最后得到完整的 DSR 公式。看完后,你会明白:在 50 次试验中得到夏普 2.0,大致相当于只做一次试验得到夏普 1.3。你也能为实际做过的任意试验次数算出膨胀因子。
设定
你做了 m m m 次相互独立的试验。每次试验都是一个有自己收益率序列的策略回测。设第 i i i 次试验观察到的夏普为 S R ^ i \widehat{SR}_i S R i ,其中 i = 1 , … , m i = 1, \ldots, m i = 1 , … , m 。你会选出 S R ^ i \widehat{SR}_i S R i 最大的那个试验来部署。
在每次试验的真实夏普都是 S R = 0 SR = 0 S R = 0 的原假设下,各个 S R ^ i \widehat{SR}_i S R i 是来自以 0 为中心、标准差为 1 / T 1/\sqrt{T} 1/ T 的独立同分布样本(年化后为 1 / T ⋅ f 1/\sqrt{T} \cdot \sqrt{f} 1/ T ⋅ f )。这 m m m 个样本的最大值,其期望会按 2 log m \sqrt{2 \log m} 2 log m 增长。
问题是:这个期望最大值,和你报告的夏普相比怎么样?如果你的夏普还低于期望最大值,那么它甚至算不上特别。它只是一个普通的失败者,只是碰巧在一群更差的结果里排第一。
DSR 的做法,就是把期望最大值放进 PSR 公式里作为基准。
m m m 个高斯样本的期望最大值
假设 S R ^ i ∼ N ( 0 , σ S R 2 ) \widehat{SR}_i \sim \mathcal{N}(0, \sigma_{SR}^2) S R i ∼ N ( 0 , σ S R 2 ) ,且对 i = 1 , … , m i = 1, \ldots, m i = 1 , … , m 相互独立同分布。我们要计算 E [ max i S R ^ i ] E[\max_i \widehat{SR}_i] E [ max i S R i ] 。
先看最大值的累积分布函数。如果单个样本的 CDF 是 F F F ,那么最大值的 CDF 为 F max ( x ) = F ( x ) m F_{\max}(x) = F(x)^m F m a x ( x ) = F ( x ) m ,PDF 为 f max ( x ) = m F ( x ) m − 1 f ( x ) f_{\max}(x) = m F(x)^{m-1} f(x) f m a x ( x ) = m F ( x ) m − 1 f ( x ) 。
期望值是:
E [ max i S R ^ i ] = ∫ − ∞ ∞ x ⋅ m F ( x ) m − 1 f ( x ) d x E[\max_i \widehat{SR}_i] = \int_{-\infty}^{\infty} x \cdot m F(x)^{m-1} f(x) \, dx E [ i max S R i ] = ∫ − ∞ ∞ x ⋅ m F ( x ) m − 1 f ( x ) d x
对标准正态分布来说,这个积分没有闭式解,但有一个很有用的渐近展开。定义:
a m = 2 log m , b m = 2 log m − log log m + log ( 4 π ) 2 2 log m a_m = \sqrt{2 \log m}, \qquad b_m = \sqrt{2 \log m} - \frac{\log \log m + \log(4\pi)}{2\sqrt{2 \log m}} a m = 2 log m , b m = 2 log m − 2 2 log m log log m + log ( 4 π )
当 m → ∞ m \to \infty m → ∞ 时:
E [ max i S R ^ i ] ≈ σ S R ⋅ b m = σ S R ( 2 log m − log log m + log ( 4 π ) 2 2 log 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) E [ i max S R i ] ≈ σ S R ⋅ b m = σ S R ( 2 log m − 2 2 log m log log m + log ( 4 π ) )
这是经典的 Gumbel 近似。第一项 2 log m \sqrt{2 \log m} 2 log m 是 Gumbel 众数。第二项是 Euler-Mascheroni 修正,按 1 / 2 log m 1/\sqrt{2 \log m} 1/ 2 log m 缩放。
Euler-Mascheroni 常数 γ ≈ 0.5772 \gamma \approx 0.5772 γ ≈ 0.5772 没有直接出现在这里,但它藏在 Gumbel 分布的渐近展开里。真正出现的常数是 log ( 4 π ) ≈ 2.531 \log(4\pi) \approx 2.531 log ( 4 π ) ≈ 2.531 。实际使用时,E [ max ] ≈ σ S R ⋅ 2 log m E[\max] \approx \sigma_{SR} \cdot \sqrt{2 \log m} E [ max ] ≈ σ S R ⋅ 2 log m 在 m ≥ 10 m \ge 10 m ≥ 10 时的误差在 5% 以内。
为什么 2 log m \sqrt{2 \log m} 2 log m 这一项重要
当 m = 10 m = 10 m = 10 时,2 log 10 = 4.605 = 2.146 \sqrt{2 \log 10} = \sqrt{4.605} = 2.146 2 log 10 = 4.605 = 2.146 。所以 10 个真实夏普为零的试验,其期望最大值大约是 2.15 σ S R 2.15 \sigma_{SR} 2.15 σ S R 。如果 σ S R \sigma_{SR} σ S R 年化后为 0.45(典型的 5 年日频回测),期望最大值大约是 0.97。
所以,如果你做了 10 次试验,最好的夏普是 1.0,这正是噪声会产生的结果。没什么特别的。
当 m = 100 m = 100 m = 100 时,2 log 100 = 9.21 = 3.035 \sqrt{2 \log 100} = \sqrt{9.21} = 3.035 2 log 100 = 9.21 = 3.035 。期望最大值:3.035 ⋅ 0.45 = 1.37 3.035 \cdot 0.45 = 1.37 3.035 ⋅ 0.45 = 1.37 。
当 m = 1000 m = 1000 m = 1000 时,2 log 1000 = 13.82 = 3.717 \sqrt{2 \log 1000} = \sqrt{13.82} = 3.717 2 log 1000 = 13.82 = 3.717 。期望最大值:3.717 ⋅ 0.45 = 1.67 3.717 \cdot 0.45 = 1.67 3.717 ⋅ 0.45 = 1.67 。
真正危险的是这种对数增长。从 10 次试验增加到 1000 次,期望最大值只增加了 70%,但试验次数增加了 100 倍。直觉是:大多数试验都远低于最大值。最大值是最极端的样本,而高斯尾部里最极端的样本,随样本量增长得很慢。
DSR 公式
现在我们已经有了原假设下的期望最大值。把它作为基准代入 PSR:
D S R = P S R ( S R ∗ ‾ ) = Φ ( S R ^ − S R ∗ ‾ σ S R ) DSR = PSR(\overline{SR^*}) = \Phi\left(\frac{\widehat{SR} - \overline{SR^*}}{\sigma_{SR}}\right) D S R = P S R ( S R ∗ ) = Φ ( σ S R S R − S R ∗ )
其中,S R ∗ ‾ \overline{SR^*} S R ∗ 是原假设下的期望最大夏普。使用 Gumbel 近似:
S R ∗ ‾ ≈ σ S R ( 2 log m − log log m + log ( 4 π ) 2 2 log m ) \overline{SR^*} \approx \sigma_{SR}\left(\sqrt{2 \log m} - \frac{\log \log m + \log(4\pi)}{2\sqrt{2 \log m}}\right) S R ∗ ≈ σ S R ( 2 log m − 2 2 log m log log m + log ( 4 π ) )
在实务中,AFML / Bailey-López de Prado 的简化形式会省略第二项:
S R ∗ ‾ ≈ σ S R ⋅ 2 ( log m − log log m − log ( 4 π ) ) \overline{SR^*} \approx \sigma_{SR} \cdot \sqrt{2 (\log m - \log \log m - \log(4\pi))} S R ∗ ≈ σ S R ⋅ 2 ( log m − log log m − log ( 4 π ))
等等,这个形式其实也不太对。Bailey、Borwein、López de Prado 和 Zhu(2014)原始论文里最干净的形式是:
S R ∗ ‾ = V [ S R ^ ] ⋅ ( ( 1 − γ ) Φ − 1 ( 1 − 1 / m ) + γ Φ − 1 ( 1 − 1 / ( m e ) ) ) \overline{SR^*} = \sqrt{V[\widehat{SR}]} \cdot \left((1 - \gamma) \Phi^{-1}(1 - 1/m) + \gamma \Phi^{-1}(1 - 1/(m e))\right) S R ∗ = V [ S R ] ⋅ ( ( 1 − γ ) Φ − 1 ( 1 − 1/ m ) + γ Φ − 1 ( 1 − 1/ ( m e )) )
其中 γ \gamma γ 是 Euler-Mascheroni 常数(γ ≈ 0.5772 \gamma \approx 0.5772 γ ≈ 0.5772 ),e e e 是 Euler 数。这个公式来自 Gumbel 分布的 Cornish-Fisher 展开,精确到二阶。更简单的 2 log m \sqrt{2 \log m} 2 log m 形式是首阶 Gumbel 近似。
等等,这个公式似乎也和标准参考文献对不上。我们把它理清楚。
Bailey、Borwein、López de Prado 和 Zhu 在 2014 年的原始论文《The Deflated Sharpe Ratio》中,把 m m m 个独立同分布标准正态样本的期望最大值写成:
E [ max 1 ≤ i ≤ m Z i ] = ( 1 − γ ) Φ − 1 ( 1 − 1 / m ) + γ Φ − 1 ( 1 − 1 / ( m e ) ) E[\max_{1 \le i \le m} Z_i] = (1 - \gamma) \Phi^{-1}(1 - 1/m) + \gamma \Phi^{-1}(1 - 1/(me)) E [ 1 ≤ i ≤ m max Z i ] = ( 1 − γ ) Φ − 1 ( 1 − 1/ m ) + γ Φ − 1 ( 1 − 1/ ( m e ))
这才是精确形式。γ \gamma γ 是 Euler-Mascheroni 常数,1 / ( m e ) 1/(me) 1/ ( m e ) 是典型的 Euler-Mascheroni 平移。这一结果是精确到二阶的 Gumbel 近似。当 m ≥ 10 m \ge 10 m ≥ 10 时,它基本上可以视为精确值。
乘以 σ S R \sigma_{SR} σ S R ,得到原假设下的期望最大夏普:
S R ∗ ‾ = σ S R ⋅ ( ( 1 − γ ) Φ − 1 ( 1 − 1 / m ) + γ Φ − 1 ( 1 − 1 / ( m e ) ) ) \overline{SR^*} = \sigma_{SR} \cdot \left((1 - \gamma) \Phi^{-1}(1 - 1/m) + \gamma \Phi^{-1}(1 - 1/(me))\right) S R ∗ = σ S R ⋅ ( ( 1 − γ ) Φ − 1 ( 1 − 1/ m ) + γ Φ − 1 ( 1 − 1/ ( m e )) )
于是 DSR 为:
D S R = Φ ( S R ^ − S R ∗ ‾ σ S R ) = Φ ( S R ^ σ S R − ( 1 − γ ) Φ − 1 ( 1 − 1 / m ) − γ Φ − 1 ( 1 − 1 / ( m e ) ) ) 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) D S R = Φ ( σ S R S R − S R ∗ ) = Φ ( σ S R S R − ( 1 − γ ) Φ − 1 ( 1 − 1/ m ) − γ Φ − 1 ( 1 − 1/ ( m e )) )
这就是完整的 DSR 公式。下面逐项解释它的作用,以及拿到这个结果后该怎么做。
两个 Gumbel 项
表达式 ( 1 − γ ) Φ − 1 ( 1 − 1 / m ) + γ Φ − 1 ( 1 − 1 / ( m e ) ) (1 - \gamma) \Phi^{-1}(1 - 1/m) + \gamma \Phi^{-1}(1 - 1/(me)) ( 1 − γ ) Φ − 1 ( 1 − 1/ m ) + γ Φ − 1 ( 1 − 1/ ( m e )) 混合了两个次序统计量。第一个 Φ − 1 ( 1 − 1 / m ) \Phi^{-1}(1 - 1/m) Φ − 1 ( 1 − 1/ m ) 是水平为 1 − 1 / m 1 - 1/m 1 − 1/ m 的分位数。m = 100 m = 100 m = 100 时,它是 Φ − 1 ( 0.99 ) = 2.326 \Phi^{-1}(0.99) = 2.326 Φ − 1 ( 0.99 ) = 2.326 。第二个 Φ − 1 ( 1 − 1 / ( m e ) ) \Phi^{-1}(1 - 1/(me)) Φ − 1 ( 1 − 1/ ( m e )) 是水平为 1 − 1 / ( m e ) 1 - 1/(me) 1 − 1/ ( m e ) 的分位数。m = 100 m = 100 m = 100 时,它是 Φ − 1 ( 1 − 1 / 271.8 ) = Φ − 1 ( 0.9963 ) = 2.698 \Phi^{-1}(1 - 1/271.8) = \Phi^{-1}(0.9963) = 2.698 Φ − 1 ( 1 − 1/271.8 ) = Φ − 1 ( 0.9963 ) = 2.698 。
用 1 − γ ≈ 0.4228 1 - \gamma \approx 0.4228 1 − γ ≈ 0.4228 和 γ ≈ 0.5772 \gamma \approx 0.5772 γ ≈ 0.5772 加权:
S R ∗ ‾ / σ S R ≈ 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 S R ∗ / σ S R ≈ 0.4228 ⋅ 2.326 + 0.5772 ⋅ 2.698 = 0.983 + 1.557 = 2.541
和简单形式 2 log m = 2 ⋅ 4.605 = 3.035 \sqrt{2 \log m} = \sqrt{2 \cdot 4.605} = 3.035 2 log m = 2 ⋅ 4.605 = 3.035 比较。完整公式给出 2.541,简单公式给出 3.035。完整公式更准确;当 m = 100 m = 100 m = 100 时,简单公式把期望最大值高估了大约 19%。
当 m m m 更大时,两者会靠近。m = 1000 m = 1000 m = 1000 时,2 log 1000 = 3.717 \sqrt{2 \log 1000} = 3.717 2 log 1000 = 3.717 。完整公式给出:
Φ − 1 ( 0.999 ) = 3.090 \Phi^{-1}(0.999) = 3.090 Φ − 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 Φ − 1 ( 1 − 1/2718 ) = Φ − 1 ( 0.99963 ) = 3.229
0.4228 ⋅ 3.090 + 0.5772 ⋅ 3.229 = 1.307 + 1.864 = 3.171 0.4228 \cdot 3.090 + 0.5772 \cdot 3.229 = 1.307 + 1.864 = 3.171 0.4228 ⋅ 3.090 + 0.5772 ⋅ 3.229 = 1.307 + 1.864 = 3.171
差距仍然是 17%。简单公式一直会高估。报告 DSR 时,使用完整公式。
完整例子
假设你测试了 m = 50 m = 50 m = 50 个策略,每个策略都有 5 年日频数据(T = 1260 T = 1260 T = 1260 ,f = 252 f = 252 f = 252 )。观察到的最大夏普是年化 S R ^ = 1.8 \widehat{SR} = 1.8 S R = 1.8 。为简单起见,假设收益率服从高斯分布,因此 γ 3 = 0 \gamma_3 = 0 γ 3 = 0 、γ 4 = 3 \gamma_4 = 3 γ 4 = 3 。
第一步:计算夏普标准误:
σ S R , a n n u a l 2 = 1 + S R ^ 2 / 2 T − 1 ⋅ f = 1 + 1.62 1259 ⋅ 252 = 2.62 ⋅ 252 1259 = 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 σ S R , ann u a l 2 = T − 1 1 + S R 2 /2 ⋅ f = 1259 1 + 1.62 ⋅ 252 = 1259 2.62 ⋅ 252 = 0.524
所以 σ S R , a n n u a l = 0.724 \sigma_{SR,annual} = 0.724 σ S R , ann u a l = 0.724 。
第二步:计算原假设下的期望最大夏普:
S R ∗ ‾ = 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) S R ∗ = 0.724 ⋅ ( ( 1 − 0.5772 ) Φ − 1 ( 1 − 1/50 ) + 0.5772 Φ − 1 ( 1 − 1/ ( 50 ⋅ 2.718 )) )
= 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.4228 ⋅ 2.054 + 0.5772 ⋅ 2.420 )
= 0.724 ⋅ ( 0.868 + 1.397 ) = 0.724 \cdot (0.868 + 1.397) = 0.724 ⋅ ( 0.868 + 1.397 )
= 0.724 ⋅ 2.265 = 1.640 = 0.724 \cdot 2.265 = 1.640 = 0.724 ⋅ 2.265 = 1.640
所以,在原假设下,50 次试验里最好的结果,其期望夏普是 1.64。你报告的夏普是 1.80。两者差距为 0.16,约等于 σ S R \sigma_{SR} σ S R 的 0.22 倍。
第三步:计算 DSR:
D S R = Φ ( 1.80 − 1.64 0.724 ) = Φ ( 0.221 ) = 0.587 DSR = \Phi\left(\frac{1.80 - 1.64}{0.724}\right) = \Phi(0.221) = 0.587 D S R = Φ ( 0.724 1.80 − 1.64 ) = Φ ( 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 Φ ( 1.8/0.724 ) = Φ ( 2.49 ) = 0.994 ,看起来很显著。DSR 修正了这一点,说明多重检验造成的 haircut 确实存在。
膨胀因子
有一个实用的诊断量:膨胀因子 是 S R ∗ ‾ / S R ^ \overline{SR^*} / \widehat{SR} S R ∗ / S R 。如果它接近 1,说明你的夏普很稳健。如果它大于 0.8,说明夏普处在边缘。如果它超过 1,说明报告出来的夏普还低于 噪声能产生的结果。
上面的例子中:1.64 / 1.80 = 0.91 1.64 / 1.80 = 0.91 1.64/1.80 = 0.91 ,处在边缘。
对 100 次试验和夏普 2.0:
σ S R , a n n u a l \sigma_{SR,annual} σ S R , ann u a l 类似,取 0.72。
S R ∗ ‾ = 0.72 ⋅ 2.541 = 1.83 \overline{SR^*} = 0.72 \cdot 2.541 = 1.83 S R ∗ = 0.72 ⋅ 2.541 = 1.83 。
膨胀因子:1.83 / 2.0 = 0.915 1.83 / 2.0 = 0.915 1.83/2.0 = 0.915 。
还是处在边缘。要把膨胀因子降到 0.5 以下,要么需要更多低噪声试验,也就是更多年的数据,要么需要高得多的观察夏普。假设做了 1000 次试验,夏普为 3.0:
S R ∗ ‾ = 0.72 ⋅ 3.171 = 2.28 \overline{SR^*} = 0.72 \cdot 3.171 = 2.28 S R ∗ = 0.72 ⋅ 3.171 = 2.28 。
膨胀因子:2.28 / 3.0 = 0.76 2.28 / 3.0 = 0.76 2.28/3.0 = 0.76 。
即使夏普达到 3.0,膨胀因子仍然是 0.76。想过线,要么夏普远高于 3.0,要么 σ S R \sigma_{SR} σ S R 远低于 0.72。两者都需要更多数据。
DSR 如何看待策略选择
DSR 用一个数字概括了多重检验问题。DSR 高,说明你报告的夏普不太可能只是 m m m 个零夏普试验中最大的那个。DSR 低,说明你的夏普正是随机选择会产生的结果。
一个常见误解是:DSR 就是“你的夏普是真的概率”。不是。DSR 表示,在真实夏普等于原假设下期望最大值的原假设中,观测到至少和当前结果一样极端的夏普的概率。它是原假设分布上尾部的一个类似 p 值的量,只是通过正态 CDF 写成了概率。
DSR 不会告诉你策略有优势。它只告诉你,策略报告的夏普能否和 m m m 个零夏普试验产生的结果区分开。这是两件不同的事。
什么时候必须用 DSR
以下情况需要 DSR:
你搜索了一个假设空间,并选出最好的候选。
对同一个信号测试了多组参数。
在同一份数据上回测了多个信号,然后选最好的一个。
评估了多个时间区间,并报告表现最好的那个。
以下情况对 DSR 的要求没那么高:
你只有一个事先确定的策略,没有搜索参数。
你只做了样本外测试,没有样本内优化。
你是在报告研究结果,而不是选策略部署。
即便是第一种情况,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 假设 m m m 次试验相互独立。这是一个很强的假设。实践中,量化策略通常相关:两个都交易 SPY 的动量策略,相关性可能达到 95%。它们不能算作独立试验。
相关性对 DSR 的影响是:如果 m m m 次试验正相关,有效独立试验数就少于 m m m 。原假设下的期望最大夏普会低于 DSR 假定的值。因此,在存在正相关时,DSR 会偏保守。
如果 100 次试验的相关性为 95%(实际等效于 5 次独立试验),DSR 仍然会把它们当作 100 次。100 次试验的期望最大值大于 5 次试验,所以 DSR 会过度修正。考虑依赖关系后的真实 DSR 应该更高。
如果想得到修正依赖后的 DSR,需要计算 m m m 个相关样本的期望最大值。这个问题没有闭式解。本模块后面介绍的基于 Bootstrap 的 PBO,会自动处理依赖关系。
实际使用时,把 DSR 当作保守诊断。如果 DSR 超过 0.95,即使在保守假设下策略也有意义。如果 DSR 低于 0.5,任何依赖修正都救不了它。
DSR 与最短回测长度的关系
DSR 和 MBL 是连在一起的。要让 DSR 超过 1 − α 1 - \alpha 1 − α ,观察到的夏普必须以足够的幅度超过原假设下的期望最大值:
S R ^ ≥ S R ∗ ‾ + z 1 − α ⋅ σ S R \widehat{SR} \ge \overline{SR^*} + z_{1-\alpha} \cdot \sigma_{SR} S R ≥ S R ∗ + z 1 − α ⋅ σ S R
夏普差距 S R ^ − S R ∗ ‾ \widehat{SR} - \overline{SR^*} S R − S R ∗ 取决于 T T T ,因为 σ S R ∝ 1 / T \sigma_{SR} \propto 1/\sqrt{T} σ S R ∝ 1/ T 。如果夏普差距和置信水平固定,就可以反解出最小 T T T ,这就是 MBL。
本模块的 MBL 公式,本质上就是把 DSR 公式重新排列。两个诊断从不同角度回答同一个问题:DSR 给定 T T T ,计算概率;MBL 给定概率,反解 T T T 。
非零基准下的 DSR
DSR 使用 S R ∗ ‾ \overline{SR^*} S R ∗ 作为基准,它是零真实夏普原假设下的期望最大值。也可以使用非零基准 S R ‾ b \overline{SR}_b S R b 计算 DSR:
D S R b = Φ ( S R ^ − S R ‾ b σ S R ) DSR_b = \Phi\left(\frac{\widehat{SR} - \overline{SR}_b}{\sigma_{SR}}\right) D S R b = Φ ( σ S R S R − S R b )
其中,S R ‾ b \overline{SR}_b S R b 是真实夏普等于 S R b SR_b S R b 的原假设下的期望最大夏普。当 S R b = 0 SR_b = 0 S R b = 0 时,它就退化为标准 DSR。
对非零基准,期望最大值很难写出闭式解。标准做法是 Bootstrap:从均值为 S R b SR_b S R b 的分布中模拟 m m m 个样本,计算期望最大值,然后把它当作基准。
实际使用时,零基准 DSR 通常已经够用。它回答“你的夏普能否和噪声产生的结果区分开?”非零基准回答“你的夏普能否和 S R b SR_b S R b 区分开?”这两个问题不同。
选出多个策略时的 DSR
如果你要选出前 k k k 个策略,而不是只选一个最好的,DSR 可以推广为:
D S R k = P ( at least one of top k has true S R > S R ∗ ‾ ) DSR_k = P\left(\text{at least one of top } k \text{ has true } SR > \overline{SR^*}\right) D S R k = P ( at least one of top k has true S R > S R ∗ )
这个量更难计算。各事件并不独立,因为前 k k k 个策略本来就是按排序选出来的,天然相关。一个简单的 Bonferroni 风格修正是:
D S R k ≈ 1 − ( 1 − D S R ) k DSR_k \approx 1 - (1 - DSR)^k D S R k ≈ 1 − ( 1 − D S R ) k
当 D S R = 0.9 DSR = 0.9 D S R = 0.9 、k = 5 k = 5 k = 5 时:D S R 5 ≈ 1 − 0.1 5 = 0.99999 DSR_5 \approx 1 - 0.1^5 = 0.99999 D S R 5 ≈ 1 − 0. 1 5 = 0.99999 。也就是说,如果最好的策略 DSR 是 0.9,那么前 5 个策略中至少有一个真实夏普超过基准的概率几乎为 1。
但这是看待多个策略的错误方式。你不想知道“至少有一个好的概率”,而是想知道被选中的那个 是否好的概率。对最优策略计算 DSR 才是正确诊断。选前 k k k 个时,应分别对每个策略计算 DSR。
DSR 的时间序列特征
DSR 通常在回测结束时计算一次,是一个时点诊断。随着新数据到来,策略的 DSR 会改变:
收益率持续为正的策略,DSR 会随时间上升,因为夏普的估计会越来越精确。
均值回归收益率的策略,早期收益回归均值后,DSR 会下降。
依赖市场状态的策略,会随着状态改变而让 DSR 波动。
策略要长期维持高 DSR,就必须持续保持正夏普。DSR 随时间衰减,说明最初的夏普可能是运气抬高的。
一种常见的研究工作流是:在回测的多个时点计算 DSR,也就是滚动 DSR。整个回测期间都保持 DSR 高于 0.9 的策略,比只在最后一个时点高于 0.9 的策略更可信。
贝叶斯 DSR
频率学派的 DSR 是一个类似 p 值的统计量。贝叶斯版本则对夏普使用先验,计算真实夏普超过基准的后验概率:
P ( S R > S R ∗ ‾ ∣ data ) = ∫ S R ∗ ‾ ∞ p ( data ∣ S R ) p ( S R ) d S R ∫ − ∞ ∞ p ( data ∣ S R ) p ( S R ) d S R P(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 ( S R > S R ∗ ∣ data ) = ∫ − ∞ ∞ p ( data ∣ S R ) p ( S R ) d S R ∫ S R ∗ ∞ p ( data ∣ S R ) p ( S R ) d S R
对于高斯先验 p ( S R ) = N ( μ 0 , σ 0 2 ) p(SR) = \mathcal{N}(\mu_0, \sigma_0^2) p ( S R ) = N ( μ 0 , σ 0 2 ) ,这个积分有闭式解。对非信息先验,贝叶斯 DSR 会收敛到频率学派 DSR。
实践中,先验的选择很重要。怀疑型先验(μ 0 = 0 \mu_0 = 0 μ 0 = 0 、σ 0 = 0.5 \sigma_0 = 0.5 σ 0 = 0.5 )会把后验向更低的夏普拉回。乐观型先验(μ 0 = 1 \mu_0 = 1 μ 0 = 1 、σ 0 = 1 \sigma_0 = 1 σ 0 = 1 )会把后验向更高的值推。贝叶斯 DSR 是个人立场的表达;频率学派 DSR 不是。
对量化研究来说,频率学派 DSR 通常够用。只有在你想加入对策略类别的先验判断时,贝叶斯版本才有用。比如:“我们所有策略的夏普都在 [0.3, 1.5] 之间。”
DSR 与策略生命周期
DSR 在策略生命周期的几个节点上最有用:
回测之后 :报告的夏普,能否和搜索过程靠运气产生的结果区分开?
模拟交易之前 :策略是否过了多重检验这一关?
实盘部署之前 :策略是否已经准备好接入资本?
实盘部署期间 :随着新数据到来,持续跟踪 DSR。DSR 衰减可能表示策略正在失去优势。
对于第 1 点,DSR 是标准检查。对于第 2 和第 3 点,DSR 只是多个输入之一,还要看容量、状态稳定性和执行。对于第 4 点,DSR 是监控工具。
最常见的 DSR 误用是:回测结束后算一次,看到数值很高,就认为策略已经验证。DSR 是必要条件,但不是充分条件。其他诊断(Haircut Sharpe、MBL、PBO)也必须通过。
常见的 DSR 错误
以下五种错误要避免:
错误 1:对非高斯收益率使用高斯假设。 对有偏度或超额峰度的策略,夏普标准误必须包括 γ 3 \gamma_3 γ 3 和 γ 4 \gamma_4 γ 4 修正。否则 DSR 会有偏。
错误 2:把 DSR 当成夏普估计值。 DSR 是概率,不是夏普。DSR 为 0.95,不表示你的夏普是真实夏普的 0.95 倍,而是表示在原假设下超过基准的概率为 95%。
错误 3:单次试验也使用 DSR。 如果你只运行了一个策略,DSR 就退化成 PSR(S R ∗ ‾ = 0 \overline{SR^*} = 0 S R ∗ = 0 )。这时用 PSR 就好。
错误 4:使用错误的频率计算 DSR。 夏普和标准误必须使用相同的频率单位(日频或年化)。混用会得到毫无意义的结果。
错误 5:忽略依赖关系。 DSR 假设试验相互独立。相关试验的有效 m m m 更小。正相关下 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。公式所依据的渐近极值理论。