halo 的技术博客

返回

你跑完一个策略回测,兴冲冲记下来:年化夏普 0.78

同事说:「我用周频数据复跑了一下,怎么只有 0.66?」

你俩用的同一个策略、同一段历史、同一个进出场逻辑——夏普凭什么不一样?

答案不是 bug,是采样频率偏差(sampling frequency bias):当你把日收益聚合成周收益(或月收益)再算夏普,聚合过程会扭曲波动率,而夏普 = 均值/波动,波动一变,夏普就变。变的方向,由你的日收益一阶自相关决定。

本文用 AR(1) 合成序列 + 200 次蒙特卡洛,从零证明这件事,并给出可记的数字:正自相关(动量)让周频夏普系统性偏低(φ=+0.2 时 −14.8%),负自相关(均值回复)让它偏高(φ=−0.2 时 +17.7%)

一、为什么聚合收益会改变夏普#

先回忆夏普的年化:

  • 日频年化夏普:Sd=rˉdσd252S_d = \frac{\bar r_d}{\sigma_d} \cdot \sqrt{252}
  • 周频年化夏普:先把每 5 个日收益求和成周收益 rwr_w,再 Sw=rˉwσw252/5S_w = \frac{\bar r_w}{\sigma_w} \cdot \sqrt{252/5}

均值没问题:周收益均值 = 5×日收益均值,年化后两路一致。

问题出在波动率(标准差)上。 把 h 个日收益求和:

Var(rw)=hσd2+2σd2k=1h1(hk)ρk\text{Var}(r_w) = h \cdot \sigma_d^2 + 2\sigma_d^2\sum_{k=1}^{h-1}(h-k)\rho_k

其中 ρk\rho_k 是日收益滞后 k 阶自相关。

  • ρk=0\rho_k = 0(iid):Var(rw)=hσd2\text{Var}(r_w) = h\sigma_d^2,√(h) 恰好被年化因子 √(252/5) 抵掉 → 日频周频夏普相等
  • ρk>0\rho_k > 0(正自相关,动量):交叉项为正,周收益方差被放大σw\sigma_w 变大 → 周频夏普偏低
  • ρk<0\rho_k < 0(负自相关,均值回复):交叉项为负,周收益方差被压缩σw\sigma_w 变小 → 周频夏普偏高

一句话:聚合频率把自相关「显影」成了波动率偏差。

二、合成数据:带自相关的 AR(1) 日收益#

为了能「对答案」,我们造一组已知自相关的日收益:

这样我们精准控制 φ(日收益自相关),就能看夏普偏差怎么随 φ 走。

三、定律显影:夏普随自相关系统性分化#

对 φ ∈ [−0.3, 0.3] 每个值跑 200 次蒙特卡洛(换种子),取平均:

phis = np.linspace(-0.3, 0.3, 25)
N_MC = 200
daily_means, weekly_means = [], []
for phi in phis:
    sd_l, sw_l = [], []
    for _ in range(N_MC):
        r = gen_ar1(phi)
        sd_l.append(ann_sharpe_daily(r))
        sw_l.append(ann_sharpe_weekly(r))
    daily_means.append(np.mean(sd_l))
    weekly_means.append(np.mean(sw_l))
python

同一策略在不同采样频率下年化夏普系统性分化 (φ=0 处重合)

图 1:蓝=日频年化夏普,红=周频年化夏普。两条线在 φ=0 处完美重合(iid 无偏差);φ>0 时红线沉到蓝线下(周频偏低),φ<0 时红线浮到上方(周频偏高)。这就是频率偏差的全景图。

关键节点(蒙特卡洛平均):

φ(日收益自相关)日频年化SR周频年化SR偏差
−0.200.4980.586+17.7%
−0.100.5740.623+8.5%
0.000.6120.610−0.3%
+0.100.6920.638−7.7%
+0.200.7800.664−14.8%

注意 φ=0 那行(iid 检查):日频 0.612 vs 周频 0.610,几乎相等——证明我们的聚合与年化口径自洽,偏差完全来自自相关。

四、偏差百分比:方向由自相关符号决定#

把偏差画成百分比更直观:

bias_pct = (np.array(weekly_means) - np.array(daily_means)) / np.abs(daily_means) * 100
python

频率偏差百分比: 正自相关抬高、负自相关压低周频夏普

图 2:红=周频高于日频(负自相关区),蓝=周频低于日频(正自相关区)。偏差关于 φ=0 反对称,且随 |φ| 线性放大。在 ±0.2 的温和自相关下,偏差已超 ±15%——这绝不是可以无视的小数字。

五、单点精确演示 + 蒙特卡洛散布#

取两个代表性 φ,各跑 200 次蒙特卡洛,把每个模拟的(日频SR,周频SR)画成散点:

for phi in [0.20, -0.20]:
    sd_l, sw_l = [], []
    for _ in range(N_MC):
        r = gen_ar1(phi)
        sd_l.append(ann_sharpe_daily(r)); sw_l.append(ann_sharpe_weekly(r))
    # 散点 + 对角线 (两频一致时落在对角线上)
python

φ=+0.20 与 φ=-0.20 的蒙特卡洛散布: 点分别落在对角线下/上方

图 3:对角线代表「两频一致」。左图 φ=+0.20(动量),点整体落在对角线下方——周频夏普系统性低于日频;右图 φ=−0.20(回复),点整体落在对角线上方——周频系统性高于日频。偏移方向与理论完全一致。

具体数字(单次演示):

  • φ=+0.15:日频 0.640 vs 周频 0.555(周频低 0.085)
  • φ=−0.15:日频 0.114 vs 周频 0.144(周频高 0.030)

六、真实市场里这偏差有多大#

别以为 φ=0.2 是极端值。真实资产的日收益自相关虽然小,但策略的主动收益常常带显著自相关:

  • 动量/趋势策略:主动收益正自相关(连涨连跌),φ 可达 +0.1~+0.3 → 周频/月频夏普显著低于日频。你的日频回测很漂亮,一上实盘(按周调仓)就「失灵」,很可能不是策略坏,是频率偏差在作怪。
  • 均值回复/反转策略:主动收益负自相关(涨后跌、跌后涨),φ 可达 −0.1~−0.3 → 周频/月频夏普虚高。日频回测平平,切到月频反而「变好」,这是假象。
  • 截面多空组合:个股特异性波动被分散,组合日收益自相关更接近 0 → 频率偏差小,日频周频夏普接近。

还有一个隐蔽来源:非交易日的收益归属。周五收盘到周一开盘的跳空,在日频里被拆成 3 天(周末),在周频里被塞进 1 根周收益——这种「周末效应」本身带自相关结构,会污染两频对比。

七、五类真实陷阱#

  1. 用周频夏普「验证」日频策略:日频回测夏普 0.78,你拿周频复跑得 0.66,以为「策略不稳健」。错——若是动量策略,周频偏低是频率偏差的必然,不是策略弱点。应先估计策略主动收益的自相关,预判偏差方向,再决定信哪个。
  2. 忽略自相关直接年化 √(252/h):标准年化公式假设 iid。一旦有自相关,正确年化要用「方差和」公式(含交叉项),盲目用 √(252/h) 会把偏差当成真实夏普。本文周频函数已正确用 √(252/5) 配合聚合方差,但前提是你知道真实 φ。
  3. 幸存者/前视填充污染自相关:用含退市股票的指数、或用未来数据填缺失,会人为制造或抹除自相关,让偏差方向反转。自相关估计本身必须先干净。
  4. 把频率偏差当「过拟合信号」:有人看到日频周频夏普差很多,就断言策略过拟合。其实纯频率偏差也能造成 ±15% 差异,与过拟合无关。正确诊断:先算主动收益自相关,若 |φ| 大,偏差可解释;若 φ≈0 仍差异大,才怀疑过拟合。
  5. 调仓频率 ≠ 采样频率混淆:本文说的是回测时用的收益聚合频率。你实盘按周调仓,就该用周频回测(且接受它的夏普),而不是拿日频夏普当目标——否则你的「目标」和「实盘口径」根本不是一回事。

八、结论#

采样频率偏差不是学术边角,是回测的隐形口径税:

  • 根因:聚合收益时,日收益的一阶自相关被「显影」成波动率偏差,而夏普 = 均值/波动,于是夏普随频率漂移。
  • 方向:φ>0(动量)→ 周频夏普偏低;φ<0(回复)→ 周频夏普偏高;φ=0 → 两频一致(已用 iid 检查验证)。
  • 量级:±0.2 的温和自相关下,偏差已超 ±15%——足够让一个「通过」的策略变「不通过」。
  • 蒙特卡洛实跑(φ=+0.2 日频 0.78 / 周频 0.66;φ=−0.2 日频 0.50 / 周频 0.59)与理论完美吻合。

实操铁律:回测频率必须对齐你的实盘调仓频率;跨频率比较夏普前,先算主动收益自相关,预判偏差方向。别让一个看不见的频率,替你的策略改了答案。


本文数据均为自洽合成(AR(1) 日收益,精准控制自相关 φ),仅用于演示方法。真实落地时:先对策略主动收益做自相关检验(Ljung-Box)、用含交叉项的方差公式正确年化、回测频率对齐实盘调仓、并警惕幸存者/前视填充对自相关的污染。代码已全部跑通,数字即输出。

采样频率偏差:日频 vs 周频回测为何给出不同夏普
https://blog.halo26812.eu.org/blog/sampling-frequency-bias
Author halo
Published at 2026年7月18日
版权声明 CC BY-NC-SA 4.0
Comment seems to stuck. Try to refresh?✨