如果你的日收益率有 ρ 1 = 0.10 \rho_1 = 0.10 ρ 1 = 0.10 的自相关,报告出来的夏普大约会比真实夏普高 20%。大多数量化策略都有正收益自相关:趋势跟踪、慢周期的均值回归,甚至某些做市策略。如果不修正,回测就会骗你。
本文从有效样本量开始推导 Haircut Sharpe 修正。我们先说明有效样本量,再计算 haircut 因子,最后说明收益率中的自相关如何转化成夏普比率的膨胀。
自相关问题
假设收益率 r t r_t r t 平稳,均值为 μ \mu μ ,方差为 σ 2 \sigma^2 σ 2 ,自相关函数为 ρ k = Corr ( r t , r t − k ) \rho_k = \text{Corr}(r_t, r_{t-k}) ρ k = Corr ( r t , r t − k ) 。如果 ρ 1 > 0 \rho_1 > 0 ρ 1 > 0 (正自相关),相邻收益率会比较相似。样本均值 r ˉ \bar{r} r ˉ 的方差为:
Var ( r ˉ ) = σ 2 T ( 1 + 2 ∑ k = 1 T − 1 ( 1 − k T ) ρ k ) \text{Var}(\bar{r}) = \frac{\sigma^2}{T}\left(1 + 2 \sum_{k=1}^{T-1} \left(1 - \frac{k}{T}\right) \rho_k\right) Var ( r ˉ ) = T σ 2 ( 1 + 2 k = 1 ∑ T − 1 ( 1 − T k ) ρ k )
对独立收益率,ρ k = 0 \rho_k = 0 ρ k = 0 (k ≥ 1 k \ge 1 k ≥ 1 ),于是恢复为 Var ( r ˉ ) = σ 2 / T \text{Var}(\bar{r}) = \sigma^2 / T Var ( r ˉ ) = σ 2 / T 。对有自相关的收益率,方差会更大。括号中的因子是实际方差与独立同分布方差的比值。把它称为方差膨胀因子(VIF):
V I F = 1 + 2 ∑ k = 1 T − 1 ( 1 − k T ) ρ k VIF = 1 + 2 \sum_{k=1}^{T-1} \left(1 - \frac{k}{T}\right) \rho_k V I F = 1 + 2 k = 1 ∑ T − 1 ( 1 − T k ) ρ k
当 T T T 很大,且 ρ k \rho_k ρ k 以 ϕ \phi ϕ 的速率指数衰减(大致有 ρ k = ρ 1 k \rho_k = \rho_1^k ρ k = ρ 1 k )时,VIF 会接近 1 / ( 1 − ρ 1 ) 1 / (1 - \rho_1) 1/ ( 1 − ρ 1 ) 。等等,这只对 AR(1) 过程成立。更准确地说,对系数为 ϕ \phi ϕ 的 AR(1):
∑ k = 1 ∞ ρ k = ϕ 1 − ϕ \sum_{k=1}^{\infty} \rho_k = \frac{\phi}{1 - \phi} k = 1 ∑ ∞ ρ k = 1 − ϕ ϕ
所以:
V I F A R ( 1 ) ≈ 1 + 2 ϕ 1 − ϕ = 1 + ϕ 1 − ϕ VIF_{AR(1)} \approx 1 + \frac{2\phi}{1 - \phi} = \frac{1 + \phi}{1 - \phi} V I F A R ( 1 ) ≈ 1 + 1 − ϕ 2 ϕ = 1 − ϕ 1 + ϕ
当 ϕ = 0.1 \phi = 0.1 ϕ = 0.1 时:V I F = 1.1 / 0.9 = 1.222 VIF = 1.1 / 0.9 = 1.222 V I F = 1.1/0.9 = 1.222 。因此,10% 的 AR(1) 系数会让均值的方差增加 22%。
有效样本量
把有效样本量定义为:能产生相同方差的独立同分布样本量:
Var ( r ˉ ) = σ 2 T e f f \text{Var}(\bar{r}) = \frac{\sigma^2}{T_{eff}} Var ( r ˉ ) = T e f f σ 2
令两边相等:
T e f f = T V I F = T 1 + 2 ∑ k = 1 T − 1 ( 1 − k / T ) ρ k T_{eff} = \frac{T}{VIF} = \frac{T}{1 + 2 \sum_{k=1}^{T-1} (1 - k/T) \rho_k} T e f f = V I F T = 1 + 2 ∑ k = 1 T − 1 ( 1 − k / T ) ρ k T
对 AR(1) 收益率:
T e f f ≈ T ⋅ 1 − ϕ 1 + ϕ T_{eff} \approx T \cdot \frac{1 - \phi}{1 + \phi} T e f f ≈ T ⋅ 1 + ϕ 1 − ϕ
当 ϕ = 0.1 \phi = 0.1 ϕ = 0.1 时:T e f f ≈ T ⋅ 0.9 / 1.1 = 0.818 T T_{eff} \approx T \cdot 0.9 / 1.1 = 0.818 T T e f f ≈ T ⋅ 0.9/1.1 = 0.818 T 。所以 5 年日频数据(T = 1260 T = 1260 T = 1260 )的有效样本量是 1260 ⋅ 0.818 = 1031 1260 \cdot 0.818 = 1031 1260 ⋅ 0.818 = 1031 ,大约相当于 4.1 年的独立数据。
夏普比率的分母是收益率标准差,不是均值标准误。到目前为止,我们只说明了自相关会让均值的标准误变大,还没有推导夏普本身该打多少 haircut。
推导夏普 Haircut
报告出来的夏普是 S R ^ = r ˉ / σ ^ \widehat{SR} = \bar{r} / \hat{\sigma} S R = r ˉ / σ ^ 。自相关也会影响标准差 σ ^ \hat{\sigma} σ ^ ,但影响程度远小于对均值的影响。
对系数为 ϕ \phi ϕ 、创新方差为 σ ϵ 2 \sigma_\epsilon^2 σ ϵ 2 的 AR(1) 过程,r t r_t r t 的无条件方差为:
σ 2 = σ ϵ 2 1 − ϕ 2 \sigma^2 = \frac{\sigma_\epsilon^2}{1 - \phi^2} σ 2 = 1 − ϕ 2 σ ϵ 2
样本方差 σ ^ 2 \hat{\sigma}^2 σ ^ 2 会收敛到 σ 2 \sigma^2 σ 2 。自相关会影响 σ 2 \sigma^2 σ 2 的估计 ,但不会改变它的期望。因此在首阶近似下,σ ^ \hat{\sigma} σ ^ 不会因为自相关而改变,但 r ˉ \bar{r} r ˉ 的方差变大了,于是夏普估计会膨胀。
要推导 haircut,在大样本下工作。定义“真实”夏普为 S R = μ / σ SR = \mu / \sigma S R = μ / σ 。报告夏普为 S R ^ = r ˉ / σ ^ \widehat{SR} = \bar{r} / \hat{\sigma} S R = r ˉ / σ ^ 。渐近地,S R ^ \widehat{SR} S R 依概率收敛到 S R SR S R ,但在有限样本下,有自相关时分布会更分散。
具体来说:
S R ^ ≈ S R + r ˉ − μ σ \widehat{SR} \approx SR + \frac{\bar{r} - \mu}{\sigma} S R ≈ S R + σ r ˉ − μ
S R ^ \widehat{SR} S R 的方差是:
Var ( S R ^ ) = 1 σ 2 Var ( r ˉ ) = V I F T \text{Var}(\widehat{SR}) = \frac{1}{\sigma^2} \text{Var}(\bar{r}) = \frac{VIF}{T} Var ( S R ) = σ 2 1 Var ( r ˉ ) = T V I F
Haircut Sharpe 是一个缩放,把有自相关的夏普映射到等效独立同分布夏普。如果你希望有效独立观测数是 T e f f T_{eff} T e f f 而不是 T T T :
S R ^ h a i r c u t = S R ^ ⋅ T e f f T = S R ^ ⋅ 1 V I F \widehat{SR}_{haircut} = \widehat{SR} \cdot \sqrt{\frac{T_{eff}}{T}} = \widehat{SR} \cdot \sqrt{\frac{1}{VIF}} S R hai r c u t = S R ⋅ T T e f f = S R ⋅ V I F 1
对 AR(1) 收益率:
S R ^ h a i r c u t = S R ^ ⋅ 1 − ϕ 1 + ϕ \widehat{SR}_{haircut} = \widehat{SR} \cdot \sqrt{\frac{1 - \phi}{1 + \phi}} S R hai r c u t = S R ⋅ 1 + ϕ 1 − ϕ
当 ϕ = 0.1 \phi = 0.1 ϕ = 0.1 时:0.9 / 1.1 = 0.818 = 0.904 \sqrt{0.9 / 1.1} = \sqrt{0.818} = 0.904 0.9/1.1 = 0.818 = 0.904 。所以报告夏普 2.0 会变成 Haircut Sharpe 1.81,减少约 10%。
当 ϕ = 0.2 \phi = 0.2 ϕ = 0.2 时:0.8 / 1.2 = 0.667 = 0.816 \sqrt{0.8 / 1.2} = \sqrt{0.667} = 0.816 0.8/1.2 = 0.667 = 0.816 。报告夏普 2.0 会变成 1.63。
当 ϕ = − 0.1 \phi = -0.1 ϕ = − 0.1 (负自相关,均值回归)时:1.1 / 0.9 = 1.105 \sqrt{1.1/0.9} = 1.105 1.1/0.9 = 1.105 。haircut 因子大于 1,说明报告出来的夏普反而低估 了真实优势。均值回归策略会从自相关中受益:它的有效样本量大于名义样本量。
AFML / Lo(2002)形式
Haircut Sharpe 最常引用的版本来自 Andrew Lo 2002 年的论文,并在 AFML 中重现。公式是:
S R ^ a d j = S R ^ ⋅ 1 1 + 2 ∑ k = 1 K ρ k ⋅ 1 − γ ^ 3 S R ^ + γ ^ 4 − 1 4 S R ^ 2 1 − γ ^ 3 S R ^ + γ ^ 4 − 1 4 S R ^ 2 \widehat{SR}_{adj} = \widehat{SR} \cdot \sqrt{\frac{1}{1 + 2 \sum_{k=1}^{K} \rho_k}} \cdot \sqrt{\frac{1 - \hat{\gamma}_3 \widehat{SR} + \frac{\hat{\gamma}_4 - 1}{4} \widehat{SR}^2}{1 - \hat{\gamma}_3 \widehat{SR} + \frac{\hat{\gamma}_4 - 1}{4} \widehat{SR}^2}} S R a d j = S R ⋅ 1 + 2 ∑ k = 1 K ρ k 1 ⋅ 1 − γ ^ 3 S R + 4 γ ^ 4 − 1 S R 2 1 − γ ^ 3 S R + 4 γ ^ 4 − 1 S R 2
第二个平方根会化简为 1,所以公式变成:
S R ^ a d j = S R ^ ⋅ 1 1 + 2 ∑ k = 1 K ρ k \widehat{SR}_{adj} = \widehat{SR} \cdot \sqrt{\frac{1}{1 + 2 \sum_{k=1}^{K} \rho_k}} S R a d j = S R ⋅ 1 + 2 ∑ k = 1 K ρ k 1
求和截断点 K K K 很重要。实践中,你可以在 ρ k \rho_k ρ k 变得无法在统计上与零区分时截断自相关函数,也可以使用 K = min ( T / 4 , 50 ) K = \min(T/4, 50) K = min ( T /4 , 50 ) 这样的经验规则。
有一个细节:Lo 公式使用的是 1 + 2 ∑ ρ k 1 + 2 \sum \rho_k 1 + 2 ∑ ρ k ,而不是 1 + 2 ∑ ( 1 − k / T ) ρ k 1 + 2 \sum (1 - k/T) \rho_k 1 + 2 ∑ ( 1 − k / T ) ρ k 。后者在有限 T T T 时更准确,前者则是平稳过程在 T → ∞ T \to \infty T → ∞ 时的极限。当 T = 1260 T = 1260 T = 1260 且 ρ k \rho_k ρ k 指数衰减时,两者差异很小。
估计自相关函数
实际问题是:回测中怎么估计 ρ k \rho_k ρ k ?标准估计量是:
ρ ^ k = ∑ t = k + 1 T ( r t − r ˉ ) ( r t − k − r ˉ ) ∑ t = 1 T ( r t − r ˉ ) 2 \hat{\rho}_k = \frac{\sum_{t=k+1}^{T} (r_t - \bar{r})(r_{t-k} - \bar{r})}{\sum_{t=1}^{T} (r_t - \bar{r})^2} ρ ^ k = ∑ t = 1 T ( r t − r ˉ ) 2 ∑ t = k + 1 T ( r t − r ˉ ) ( r t − k − r ˉ )
这是滞后 k k k 的样本自相关。对几年日频收益率,前 20 个滞后通常可以较精确地估计。
一个常见错误是:直接使用 ρ ^ k \hat{\rho}_k ρ ^ k ,不检验它是否显著偏离零。样本自相关的抽样波动并不小。对 T = 1260 T = 1260 T = 1260 、真实 ρ 1 = 0 \rho_1 = 0 ρ 1 = 0 的情况,ρ ^ 1 \hat{\rho}_1 ρ ^ 1 的标准误约为 1 / T ≈ 0.028 1/\sqrt{T} \approx 0.028 1/ T ≈ 0.028 。所以样本自相关 0.05 只能算勉强显著。如果你不加判断地把它放进 haircut,就会过度修正。
有两个实用修正。第一,使用 Bartlett 类型的置信区间,把统计上无法与零区分的自相关设为零。第二,拟合 AR(p) 模型,使用模型隐含的自相关函数,这样可以让估计更稳定。
AFML 的建议(第 14 章,Advances in Financial Machine Learning ,ISBN 978-1-119-48208-6)是使用 Newey-West 类型的 HAC 估计量,直接得到均值的标准误,避免逐个滞后估计自相关函数。它的形式是:
Var ^ ( r ˉ ) = σ ^ 2 T ( 1 + 2 ∑ k = 1 K w k ρ ^ k ) \widehat{\text{Var}}(\bar{r}) = \frac{\hat{\sigma}^2}{T} \left(1 + 2 \sum_{k=1}^{K} w_k \hat{\rho}_k\right) Var ( r ˉ ) = T σ ^ 2 ( 1 + 2 k = 1 ∑ K w k ρ ^ k )
其中 w k w_k w k 是核权重(Bartlett 核:w k = 1 − k / ( K + 1 ) w_k = 1 - k/(K+1) w k = 1 − k / ( K + 1 ) )。得到的标准误已经考虑了自相关。Haircut Sharpe 于是是:
S R ^ h a i r c u t = S R ^ ⋅ σ ^ T ⋅ S E ^ H A C ( r ˉ ) ⋅ 1 T \widehat{SR}_{haircut} = \widehat{SR} \cdot \frac{\hat{\sigma}}{\sqrt{T} \cdot \widehat{SE}_{HAC}(\bar{r})} \cdot \frac{1}{\sqrt{T}} S R hai r c u t = S R ⋅ T ⋅ S E H A C ( r ˉ ) σ ^ ⋅ T 1
好,这个化简写得有点乱。重新清楚地写一遍:
Haircut Sharpe 是报告夏普乘以“收益率标准差与均值 HAC 标准误之比”,再乘以 T \sqrt{T} T :
S R ^ h a i r c u t = r ˉ S E ^ H A C ( r ˉ ) = r ˉ σ ^ / T ⋅ V I F \widehat{SR}_{haircut} = \frac{\bar{r}}{\widehat{SE}_{HAC}(\bar{r})} = \frac{\bar{r}}{\hat{\sigma}/\sqrt{T} \cdot \sqrt{VIF}} S R hai r c u t = S E H A C ( r ˉ ) r ˉ = σ ^ / T ⋅ V I F r ˉ
= r ˉ ⋅ T σ ^ ⋅ V I F = S R ^ V I F = \frac{\bar{r} \cdot \sqrt{T}}{\hat{\sigma} \cdot \sqrt{VIF}} = \frac{\widehat{SR}}{\sqrt{VIF}} = σ ^ ⋅ V I F r ˉ ⋅ T = V I F S R
所以,简单形式是对的。HAC 估计量只是给了你一个更稳健的 VIF 估计。
完整例子
考虑一个交易股指期货的趋势跟踪策略。收益率有 ϕ ≈ 0.08 \phi \approx 0.08 ϕ ≈ 0.08 的轻微正自相关,这和动量信号缓慢衰减的特征一致。数据有 5 年:T = 1260 T = 1260 T = 1260 。报告的年化夏普是 1.5。
第一步:计算 VIF:
V I F = 1 + ϕ 1 − ϕ = 1.08 0.92 = 1.174 VIF = \frac{1 + \phi}{1 - \phi} = \frac{1.08}{0.92} = 1.174 V I F = 1 − ϕ 1 + ϕ = 0.92 1.08 = 1.174
第二步:计算 haircut 因子:
1 / V I F = 1 / 1.174 = 0.852 = 0.923 \sqrt{1/VIF} = \sqrt{1/1.174} = \sqrt{0.852} = 0.923 1/ V I F = 1/1.174 = 0.852 = 0.923
第三步:计算 Haircut Sharpe:
S R ^ h a i r c u t = 1.5 ⋅ 0.923 = 1.385 \widehat{SR}_{haircut} = 1.5 \cdot 0.923 = 1.385 S R hai r c u t = 1.5 ⋅ 0.923 = 1.385
所以,报告夏普 1.5 会变成 Haircut Sharpe 1.39,减少约 7.7%。幅度不算大,但不能忽略。
对更激进的趋势跟踪策略,假设 ϕ = 0.15 \phi = 0.15 ϕ = 0.15 :
V I F = 1.15 / 0.85 = 1.353 , 1 / V I F = 0.860 VIF = 1.15/0.85 = 1.353, \quad \sqrt{1/VIF} = 0.860 V I F = 1.15/0.85 = 1.353 , 1/ V I F = 0.860
S R ^ h a i r c u t = 1.5 ⋅ 0.860 = 1.29 \widehat{SR}_{haircut} = 1.5 \cdot 0.860 = 1.29 S R hai r c u t = 1.5 ⋅ 0.860 = 1.29
减少 13.7%,幅度就明显了。
对 ϕ = − 0.10 \phi = -0.10 ϕ = − 0.10 的均值回归统计套利策略:
V I F = 0.9 / 1.1 = 0.818 , 1 / V I F = 1.106 VIF = 0.9/1.1 = 0.818, \quad \sqrt{1/VIF} = 1.106 V I F = 0.9/1.1 = 0.818 , 1/ V I F = 1.106
S R ^ h a i r c u t = 1.5 ⋅ 1.106 = 1.66 \widehat{SR}_{haircut} = 1.5 \cdot 1.106 = 1.66 S R hai r c u t = 1.5 ⋅ 1.106 = 1.66
均值回归策略得到了一个加成 。haircut 因子大于 1,是因为负自相关让每次观测包含了更多独立信息。
import numpy as np
import pandas as pd
def haircut_sharpe ( returns , max_lag = 20 ):
""" Compute the Haircut Sharpe ratio adjusted for autocorrelation.
Uses Bartlett kernel weights on the autocorrelation function. """
T = len ( returns )
sr = returns . mean () / returns . std () * np . sqrt ( 252 )
# Compute autocorrelations
acf = []
for k in range ( 1 , max_lag + 1 ):
rho_k = np . corrcoef ( returns [: - k ], returns [ k :])[ 0 , 1 ]
acf . append ( rho_k )
# Bartlett kernel VIF
vif = 1.0
for k , rho_k in enumerate ( acf , start = 1 ):
weight = 1.0 - k / ( max_lag + 1 )
vif += 2 * weight * rho_k
return sr / np . sqrt ( vif )
# Example
np . random . seed ( 42 )
phi = 0.08
eps = np . random . normal ( 0 , 0.01 , 1260 )
returns = np . zeros ( 1260 )
for t in range ( 1 , 1260 ):
returns [ t ] = phi * returns [ t - 1 ] + eps [ t ]
print ( f "Reported Sharpe: { returns . mean () / returns . std () * np . sqrt ( 252 ) :.3f } " )
print ( f "Haircut Sharpe: { haircut_sharpe ( returns ) :.3f } " )
这在实务中为什么重要
报告夏普是回测系统输出的数字,是幻灯片上的数字。Haircut Sharpe 才是在其他条件不变时,策略在生产环境中更可能实现的夏普。对收益率有正自相关的策略来说,几乎所有趋势跟踪或动量策略都属于这一类,差别不小。
一个从 1.5 变成 1.29 的夏普,是完全不同的投资命题。夏普 1.5 支持的资本配置,用 1.29 可能就不合理。夏普 1.5 支持的容量假设,在 1.29 下也可能不成立。说策略做出了 1.5 的夏普,在技术上没错,但实际会误导人。
策略为什么会有自相关
大多数量化策略都有收益自相关。主要有三个来源:
信号惯性。 趋势跟踪和动量信号依赖移动平均线或突破。信号会持续几天到几周,所以即使中间有噪声,策略仍然会继续持有同一方向。这会在收益率中形成正自相关。连续多天持有多头仓位,会产生相关的盈亏。
仓位管理。 很多策略会持仓数日。第 t + 1 t+1 t + 1 天的盯市盈亏和第 t t t 天相关,因为仓位大体相同。持仓周期越长,自相关通常越强。
波动率聚集。 即使收益率在条件上不相关,波动率也会聚集:高波动期之后通常还是高波动期。平方收益率会有自相关,这会通过高阶矩影响夏普标准误。
对做市策略来说,自相关往往是负的 ,也就是盈亏均值回归:大幅盈利之后通常会出现均值回归。因此,做市策略的 Haircut Sharpe 经常高于报告夏普。
如何检测自相关
在应用 Haircut 之前,应该先检查收益率是否有自相关。常用的有三种检验:
Ljung-Box 检验。 检验统计量为:
Q ( m ) = T ( T + 2 ) ∑ k = 1 m ρ ^ k 2 T − k Q(m) = T(T+2) \sum_{k=1}^{m} \frac{\hat{\rho}_k^2}{T-k} Q ( m ) = T ( T + 2 ) k = 1 ∑ m T − k ρ ^ k 2
在最多 m m m 阶没有自相关的原假设下,Q ( m ) ∼ χ m 2 Q(m) \sim \chi^2_m Q ( m ) ∼ χ m 2 。如果 Q ( m ) Q(m) Q ( m ) 超过卡方临界值,就拒绝原假设。
对 5 年日收益率、m = 20 m = 20 m = 20 个滞后,在 α = 0.05 \alpha = 0.05 α = 0.05 下临界值为 χ 20 , 0.95 2 ≈ 31.4 \chi^2_{20, 0.95} \approx 31.4 χ 20 , 0.95 2 ≈ 31.4 。统计量超过 31.4,表示自相关显著。
样本自相关与置信带。 计算 ρ ^ k \hat{\rho}_k ρ ^ k ,其中 k = 1 , 2 , … , K k = 1, 2, \ldots, K k = 1 , 2 , … , K 。在原假设下,95% 置信带为 ± 1.96 / T \pm 1.96/\sqrt{T} ± 1.96/ T 。当 T = 1260 T = 1260 T = 1260 时,这是 ± 0.055 \pm 0.055 ± 0.055 。落在置信带之外的自相关在统计上显著。
方差比检验。 比较 k k k 期收益率的方差和 1 期收益率方差的 k k k 倍。在无自相关原假设下,比值为 1。对 k = 10 k = 10 k = 10 :
V R ( 10 ) = Var ( r t + r t + 1 + … + r t + 9 ) 10 ⋅ Var ( r t ) VR(10) = \frac{\text{Var}(r_t + r_{t+1} + \ldots + r_{t+9})}{10 \cdot \text{Var}(r_t)} V R ( 10 ) = 10 ⋅ Var ( r t ) Var ( r t + r t + 1 + … + r t + 9 )
显著高于 1 表示正自相关,显著低于 1 表示负自相关。
Newey-West 最优滞后阶数
Newey-West(1994)的自动滞后选择公式是:
q = ⌊ 4 ⋅ ( T / 100 ) 2 / 9 ⌋ q = \lfloor 4 \cdot (T/100)^{2/9} \rfloor q = ⌊ 4 ⋅ ( T /100 ) 2/9 ⌋
当 T = 1260 T = 1260 T = 1260 时:q = ⌊ 4 ⋅ 12.6 2 / 9 ⌋ = ⌊ 4 ⋅ 1.59 ⌋ = ⌊ 6.36 ⌋ = 6 q = \lfloor 4 \cdot 12.6^{2/9} \rfloor = \lfloor 4 \cdot 1.59 \rfloor = \lfloor 6.36 \rfloor = 6 q = ⌊ 4 ⋅ 12. 6 2/9 ⌋ = ⌊ 4 ⋅ 1.59 ⌋ = ⌊ 6.36 ⌋ = 6 。
所以,5 年日频收益率的最优滞后是 6 天。在 Bartlett 核中使用第 1 到第 6 阶滞后。超过第 6 阶后,自相关太嘈杂,无法可靠估计。
一个常见错误是使用太多滞后。如果加入 50 个滞后,而第 30 到第 50 阶的自相关纯粹是噪声(均值为零、方差很大),VIF 估计量的方差就会变高。Newey-West 公式在偏差和方差之间做了平衡。
Haircut Sharpe 的 Bootstrap 置信区间
点估计 S R ^ h a i r c u t \widehat{SR}_{haircut} S R hai r c u t 本身也有抽样波动。Bootstrap 置信区间可以把这点反映出来。
步骤如下:
有放回地重采样收益率(或者使用 block bootstrap),得到长度为 T T T 的 Bootstrap 样本。
在这个样本上计算 Haircut Sharpe。
重复 B B B 次。
取 Bootstrap 分布的第 2.5 和第 97.5 百分位数,作为 95% 置信区间。
对 block bootstrap,块长度可以取 Newey-West 滞后阶数(例如 6 天)。这样能保留块内的自相关结构。
Haircut Sharpe 的 Bootstrap 置信区间会比单独看点估计宽得多。报告 Haircut Sharpe 为 1.3,可能对应 [0.9, 1.7] 的 95% 置信区间。只报告点估计会误导读者。
Haircut Sharpe 与年化的区别
一个容易混淆的地方:Haircut Sharpe 不等于年化夏普。
年化是把期间夏普乘以 f \sqrt{f} f ,其中 f f f 是每年的期间数。Haircut 则是乘以 1 / V I F 1/\sqrt{VIF} 1/ V I F 。这是两个不同的操作:
年化处理的是测量的时间范围。
Haircut 处理的是观测值之间的依赖结构。
观测值相互独立时,VIF = 1,haircut 因子为 1(不需要 haircut)。观测值存在依赖时,VIF > 1,haircut 因子小于 1。
回测报告中应该同时给出两者:
S R ^ a n n u a l , h a i r c u t = S R ^ p e r i o d ⋅ f ⋅ 1 V I F \widehat{SR}_{annual, haircut} = \widehat{SR}_{period} \cdot \sqrt{f} \cdot \frac{1}{\sqrt{VIF}} S R ann u a l , hai r c u t = S R p er i o d ⋅ f ⋅ V I F 1
这才是正确的报告方式。大多数报告系统会省略 haircut,所以才有了这篇文章。
Haircut 修正不了什么
Haircut Sharpe 修正的是自相关。它修正不了:
多重检验。 这要使用去膨胀夏普比率。
收益率的非正态性。 PSR 的标准误公式会处理这个问题。
前视偏差。 如果回测使用了交易时点不可获得的信息,任何统计修正都救不了它。
容量限制。 名义本金 100 万美元时夏普为 1.5,规模到 1 亿美元时可能只剩夏普 0.8。统计修正无法处理容量问题。
Haircut Sharpe 只是一块拼图。完整诊断体系是:PSR(相对于基准的显著性)、Haircut Sharpe(自相关)、DSR(多重检验)、MBL(样本量)和 PBO(过拟合)。每一层回答不同的问题。
被高估的置信区间
有个细节容易被忽略:夏普比率的标准 95% 置信区间假设收益率独立同分布。有自相关时,这个区间会过窄。
独立同分布下的置信区间:
C I 95 % = S R ^ ± 1.96 ⋅ 1 T CI_{95\%} = \widehat{SR} \pm 1.96 \cdot \frac{1}{\sqrt{T}} C I 95% = S R ± 1.96 ⋅ T 1
当 S R ^ = 1.5 \widehat{SR} = 1.5 S R = 1.5 、T = 1260 T = 1260 T = 1260 时:C I = [ 1.5 − 0.055 , 1.5 + 0.055 ] = [ 1.445 , 1.555 ] CI = [1.5 - 0.055, 1.5 + 0.055] = [1.445, 1.555] C I = [ 1.5 − 0.055 , 1.5 + 0.055 ] = [ 1.445 , 1.555 ] ,非常窄。
考虑自相关后的置信区间:
C I a u t o c o r r , 95 % = S R ^ ± 1.96 ⋅ 1 T e f f = S R ^ ± 1.96 ⋅ V I F T CI_{autocorr, 95\%} = \widehat{SR} \pm 1.96 \cdot \frac{1}{\sqrt{T_{eff}}} = \widehat{SR} \pm 1.96 \cdot \frac{\sqrt{VIF}}{\sqrt{T}} C I a u t ocor r , 95% = S R ± 1.96 ⋅ T e f f 1 = S R ± 1.96 ⋅ T V I F
当 VIF = 1.174(ϕ = 0.1 \phi = 0.1 ϕ = 0.1 的 AR(1))时:C I = [ 1.5 − 0.060 , 1.5 + 0.060 ] = [ 1.440 , 1.560 ] CI = [1.5 - 0.060, 1.5 + 0.060] = [1.440, 1.560] C I = [ 1.5 − 0.060 , 1.5 + 0.060 ] = [ 1.440 , 1.560 ] ,略宽一些。
当 VIF = 1.5(自相关更持久)时:C I = [ 1.5 − 0.070 , 1.5 + 0.070 ] = [ 1.430 , 1.570 ] CI = [1.5 - 0.070, 1.5 + 0.070] = [1.430, 1.570] C I = [ 1.5 − 0.070 , 1.5 + 0.070 ] = [ 1.430 , 1.570 ] ,宽度已经比较明显。
当 VIF = 2(自相关非常持久)时:C I = [ 1.5 − 0.078 , 1.5 + 0.078 ] = [ 1.422 , 1.578 ] CI = [1.5 - 0.078, 1.5 + 0.078] = [1.422, 1.578] C I = [ 1.5 − 0.078 , 1.5 + 0.078 ] = [ 1.422 , 1.578 ] ,明显变宽。
教训是:独立同分布置信区间过于乐观。对有显著自相关的策略,真实置信区间更宽。Haircut Sharpe 在点估计上处理这个问题,置信区间则在精度上处理它。
不当年化的风险
一个常见错误是用错公式年化 Haircut Sharpe。
对独立同分布策略:S R a n n u a l = S R d a i l y ⋅ 252 SR_{annual} = SR_{daily} \cdot \sqrt{252} S R ann u a l = S R d ai l y ⋅ 252 。
对有自相关的策略:S R a n n u a l , h a i r c u t = S R d a i l y ⋅ 252 / V I F SR_{annual,haircut} = SR_{daily} \cdot \sqrt{252} / \sqrt{VIF} S R ann u a l , hai r c u t = S R d ai l y ⋅ 252 / V I F 。
两条公式不同。考虑自相关的公式会给出更低的年化夏普。
常见的正确做法是:先计算 S R d a i l y SR_{daily} S R d ai l y ,再乘 1 / V I F 1/\sqrt{VIF} 1/ V I F 做 haircut,最后乘 252 \sqrt{252} 252 年化。错误做法是先年化,再 haircut:
S R a n n u a l = S R d a i l y ⋅ 252 SR_{annual} = SR_{daily} \cdot \sqrt{252} S R ann u a l = S R d ai l y ⋅ 252
S R a n n u a l , h a i r c u t , w r o n g = S R a n n u a l / V I F SR_{annual,haircut, wrong} = SR_{annual} / \sqrt{VIF} S R ann u a l , hai r c u t , w r o n g = S R ann u a l / V I F
这会重复计算自相关效应。正确公式是:
S R a n n u a l , h a i r c u t = ( S R d a i l y / V I F ) ⋅ 252 = S R d a i l y ⋅ 252 / V I F SR_{annual,haircut} = (SR_{daily} / \sqrt{VIF}) \cdot \sqrt{252} = SR_{daily} \cdot \sqrt{252 / VIF} S R ann u a l , hai r c u t = ( S R d ai l y / V I F ) ⋅ 252 = S R d ai l y ⋅ 252/ V I F
因子是 252 / V I F \sqrt{252/VIF} 252/ V I F ,不是 252 / V I F \sqrt{252}/\sqrt{VIF} 252 / V I F 。两者结果一样,但运算顺序要统一。
时间聚合问题
还有一个细节:日收益率的自相关,可能和周收益率或月收益率的自相关不同。假设策略的 ϕ d a i l y = 0.1 \phi_{daily} = 0.1 ϕ d ai l y = 0.1 ,周频 AR(1) 系数大约是 ϕ w e e k l y = ϕ d a i l y 5 = 10 − 5 \phi_{weekly} = \phi_{daily}^5 = 10^{-5} ϕ w ee k l y = ϕ d ai l y 5 = 1 0 − 5 ,基本可以视为零。
这意味着:一个日频自相关很强的策略,周频自相关可能已经很小。日频 haircut 会远大于周频 haircut。
报告时要选定一个频率,并始终保持一致。混用日频和周频的修正会得到毫无意义的结果。标准做法是使用日收益率,报告年化 Haircut Sharpe。
多期再平衡下的夏普
有些策略每周或每月再平衡,但信号是用日频数据计算的。实际实现的收益率频率低于信号频率,而实现收益率的自相关反映的是再平衡频率。
对一个使用日频信号、每周再平衡的策略,实际收益率是周频的。周频自相关通常高于日频自相关,因为策略持仓时间更长。因此,周频 haircut 可能更大。
标准做法是在实际收益率频率(周频或月频)上计算 haircut,而不是在信号频率(日频)上计算。这才是“诚实”的 haircut。
Haircut 的贝叶斯解释
Haircut Sharpe 可以解释为一次带有怀疑型先验的贝叶斯更新。先验是:“考虑到自相关,这类策略的夏普很可能低于数据直接显示的数值。”似然是考虑了自相关的数据。后验就是 Haircut Sharpe。
自相关很强时,先验会把后验向下拉。负自相关时,先验会把后验向上推。Haircut Sharpe 就是这个特定先验下的贝叶斯后验。
这个说法有助于沟通。“报告夏普是 1.5,但我们对这类策略的先验判断是,由于自相关要打 10% 的折扣,所以 Haircut Sharpe 是 1.35。”这样比讲 HAC 推导直观。
对研究报告来说,这种表述也比技术性的 HAC 推导更容易让人读懂。数学没变,只是说法变了。
报告标准
一份完整的回测报告应包括:
报告夏普,同时给出样本量和收益率频率。
估计出的自相关函数,至少给出前 5 个滞后。
使用的 Newey-West 截断滞后阶数。
VIF 估计值。
Haircut Sharpe。
Haircut Sharpe 应该和报告夏普一起给出,而不是替代它。报告夏普是策略实际打印出来的结果,Haircut Sharpe 是更可能持续的结果。
研究论文应同时给出两个数字及各自的置信区间。营销报告则取决于受众。机构投资者通常想看两个数字,零售投资者通常只会看到较高的那个。诚实的做法是两个都报告。
总结
Haircut Sharpe 是针对收益率自相关的修正。它根据自相关函数得到有效样本量,再用有效样本量重新缩放报告夏普。正自相关(趋势跟踪、动量)下,Haircut Sharpe 更低;负自相关(均值回归)下,Haircut Sharpe 更高。
这个修正可以通过 HAC 估计量(Newey-West)实现,也可以直接估计自相关函数。标准误和置信区间也应该使用 HAC 标准误,而不是独立同分布标准误。
Haircut Sharpe 只是多个诊断中的一个。它处理不了多重检验、容量、状态变化或前视偏差,只处理自相关问题。要得到完整判断,需要把它和其他诊断结合起来。
没有 haircut 的夏普 1.5 是营销。报告夏普 1.5、Haircut Sharpe 1.3,是研究。差别很大。
参考文献
Lo, A. W. (2002). “The Statistics of Sharpe Ratios.” Financial Analysts Journal , 58(4), 36–52。自相关修正夏普的原始推导。
López de Prado, M. (2018). Advances in Financial Machine Learning , 第 14 章。Wiley. ISBN 978-1-119-48208-6。实现与基于 HAC 的修正。
Newey, W. K. and West, K. D. (1987). “A Simple, Positive Semi-Definite, Heteroskedasticity and Autocorrelation Consistent Covariance Matrix.” Econometrica , 55(3), 703–708。HAC 估计量。
Bartlett, M. S. (1946). “On the Theoretical Specification and Sampling Properties of Autocorrelated Time-Series.” Journal of the Royal Statistical Society , 8(1), 27–41。核函数。