← 返回文章列表
July 2, 2026
5 分钟阅读

回测过拟合概率(PBO):你的搜索跑赢抛硬币了吗?

回测过拟合概率(PBO):你的搜索跑赢抛硬币了吗?
#算法交易
#回测
#过拟合
#交叉验证
#PBO
#夏普比率
#验证
🎯
Part 5 of 7 · Collection
Backtesting Without Fooling Yourself

"回测无幻觉"系列文章。

📄 本文成长为了一篇研究论文。 以下每一个数字都来自同一个确定性脚本,它构建了受控的真实基准——零优势搜索、植入优势搜索,以及一个在随机游走上的真实移动平均线参数网格——然后对其运行组合对称交叉验证(CSCV)来估计回测过拟合概率,直接测量选择流程的泛化能力。可在线阅读论文(交互版 + PDF):pbo-search.marketmaker.cc,代码与数据见 github.com/suenot/pbo-search

Deflated Sharpe Ratio 把你的赢家送上了审判席:既然你搜索过 N 个参数组合,眼前这个夏普比率是不是超出了运气所能给的?本文审判的是另一件事——挑选这个动作本身。你跑了一次网格搜索,留下了最好的格子,然后继续前进。但这次挑选本身值得信赖吗?如果你换一种方式重新做一遍整个样本内/样本外的切分,还会是同一个参数组合胜出吗——还是说你只是给一百枚硬币里最走运的那一枚戴上了王冠?

回测过拟合概率(Probability of Backtest Overfitting,PBO),由 Bailey、Borwein、López de Prado 与 Zhu(2017)提出,回答的正是这个问题,而它给出答案的方式,恰恰是大多数人一眼看去就会读错的一个数字。这是本文最重要的一句话,请读两遍:

PBO 的零假设值是 0.5,不是 1。 一次没有任何样本外技巧的搜索,PBO 得分 ≈ 0.5。一半不是"半过拟合"——一半是彻底过拟合,如同抛硬币。你想要的是接近的 PBO。

这一点绊倒了所有人。我们习惯了把概率读成相对于"什么都没有"的零假设,而对过拟合这件事,直觉告诉我们"无罪"的读数应该是 0。并不是。PBO 是这样一个概率:你在样本内挑出的最佳参数组合,在样本外落入整个候选集后一半的概率。如果你的搜索确实没有学到任何能泛化的东西,那么样本内的赢家在样本外出现在排名任何位置的可能性都是均等的——于是它大约有一半的时候会落入后一半。PBO ≈ 0.5 意味着你的选择流程等同于抛硬币。 PBO ≈ 0 意味着样本内的赢家在样本外依然稳定地是赢家——这次选择值得信赖。下文的一切,都是为了在一份我们已知真实基准的数据上,把这条校准事实坐实。

场景(200 个参数组合,T = 1000,S = 16) 是什么 赢家的样本内夏普比率 样本外夏普比率 PBO 结论
零优势场(200 个独立同分布噪声策略) 纯粹靠运气,哪里都没有优势 1.98 0.06 0.476 过拟合——如同抛硬币
植入优势(20 个参数组合携带年化夏普比率 2.38) 真实、稳健的技巧 3.73 2.34 0.001 值得信赖
纯随机游走上的移动平均线交叉网格(170 个参数组合) 一场诱人的海市蜃楼 0.97 0.04 0.463 过拟合——如同抛硬币

夏普比率按 ×√252 年化。三行都是把所选策略的夏普比率在 60 个蒙特卡洛矩阵上取平均——同一口径,所以过拟合网格和零假设、植入优势用的是完全相同的打分方式。在这个平均口径下,网格所选样本内夏普比率(0.97)实际上低于零假设那个被虚高的 1.98,它的样本外夏普比率只是略微为正的 0.04,它的 PBO(0.463)刚好落在 ½ 以下一点点——在统计上和零假设无法区分。那些戏剧性的单矩阵数字(网格内最佳样本内夏普比率 2.33 坍缩到样本外中位数 −0.22,PBO 0.573)属于某一个具有代表性的随机游走种子,会在第 4 幕中清楚标出。每一个数字都能追溯到结果文件。

三种场景,一个教训。无论噪声是独立同分布(PBO 0.476)还是打扮成一个真实的移动平均线网格(PBO 0.463),无优势搜索都恰好停在 0.5 这条抛硬币线上——两者在统计上无法区分,而且都是判决性的证据。真实优势能把 PBO 拉到 0.001。在各矩阵上取平均后,网格所选的赢家平平无奇——样本内夏普比率 0.97,低于零假设那个被虚高的 1.98——这本身就是诚实的诊断:一次无优势搜索读起来就跟零假设一样。戏剧性藏在尾部。在一个具有代表性的随机游走矩阵上(第 4 幕),网格的最佳格子报出样本内夏普比率 2.33——基本等同于植入优势的样本外 2.34,堪称平局——但在样本外,它落入后一半的次数和落入前一半的次数几乎一样多。一个漂亮的回测和一次毫无价值的选择之间的这道鸿沟,从赢家自己的夏普比率里根本看不出来,只有当你给流程打分时才会显形。这正是 PBO 做的事。

第 1 幕——受审的流程:CSCV 究竟做了什么

一张高耸的表现矩阵,一千行、两百个策略列,被水平切成十六个等长区块,其中八个区块被送入训练面板,另外八个送入测试面板,一列样本内最佳被高亮标出,一支箭头追踪同一列在样本外排名中落在何处

DSR 是参数化的:它对零假设下最大夏普比率的分布建模,并用解析方式折损赢家的显著性。CSCV 是对同一个选择偏差问题给出的非参数答案——它不对最大值建模,而是穷尽一切方式重采样训练/测试切分,然后凭经验观察样本内赢家是否始终获胜。没有分布假设,不用去数"有效试验数"。只问一件事:这次选择能不能泛化?

先看原材料。你在 T = 1000 次同步观测上回测了某个策略类别的 N = 200 个参数组合。把每个参数组合的收益序列堆成一列,就得到一个 T × N表现矩阵 M——1,000 行时间,200 列策略。这是 CSCV 唯一需要的输入。

现在看构造过程,分四步:

  1. 把时间切成 S = 16 个等长的互不重叠区块(每块 T/S 行)。区块保留了局部时间结构——一旦收益存在记忆性,这个设计选择就很关键。
  2. 穷举每一种用一半区块训练、另一半测试的方式。S = 16 时,从 16 个区块中选 8 个作训练集,共有 C(16, 8) = 12,870 种取法;其余 8 个作测试集。"组合对称"这个名字正是由此而来:每一次切分都有一个镜像(把训练和测试互换),所以这套方案对称地使用你的数据,而不是像单次 walk-forward 那样只给你一个被特权化的"过去→未来"切点。
  3. 在每一次切分上,按样本内夏普比率给全部 200 个参数组合排名,选出赢家 n* 然后找出同一个参数组合 n* 在留出的 8 个区块上,样本外排名落在哪里。
  4. 记录赢家的相对样本外排名,把它换算成 logit。PBO 就是 12,870 次切分中,该 logit ≤ 0 的那部分所占的比例。

写出这套枚举只需要几行代码:

from itertools import combinations

combos = list(combinations(range(S), S // 2))   # C(16, 8) = 12,870 splits

对每一次切分,令 rˉnc\bar r^{\,c}_{n^*} 为样本内赢家在 NN 个参数组合中的样本外排名(排名 1 = 最差,NN = 最佳)。把它归一化为相对排名 ωˉc(0,1)\bar\omega_c \in (0,1),取其 logit λc\lambda_c,再对所有切分积分:

ωˉc=rˉncN+1,λc=ln ⁣ωˉc1ωˉc,PBO=1#CScCS1{λc0}\bar\omega_c = \frac{\bar r^{\,c}_{n^*}}{N+1}, \qquad \lambda_c = \ln\!\frac{\bar\omega_c}{1 - \bar\omega_c}, \qquad \text{PBO} = \frac{1}{\#C_S}\sum_{c \,\in\, C_S} \mathbf{1}\{\lambda_c \le 0\}

logit 只是一把方便的尺子。λc>0\lambda_c > 0 意味着赢家落在了样本外的一半(相对排名高于 ½)——样本内/样本外一致,是好事。λc0\lambda_c \le 0 意味着它落在样本外中位数或以下——在这次切分上,样本内的选择没有泛化。PBO 就是样本内赢家未能跑赢样本外中位数的那部分切分所占的比例。 整个矩阵决定了这个数:给定 MS,PBO 是确定性的——没有重采样种子,全部 12,870 次切分都被穷尽枚举。

写成代码,一旦你算出了每次切分上每个参数组合的样本内和样本外夏普比率(矩阵 R_trR_te,各为 12,870 × 200),这个估计量的核心就是六行:

n_star  = R_tr.argmax(axis=1)                      # in-sample winner, per split
oos_sh  = R_te[rows, n_star]                        # that winner's OWN out-of-sample Sharpe
rank    = (R_te <= oos_sh[:, None]).sum(axis=1)     # its OOS rank among N configs, 1..N
omega   = np.clip(rank / (N + 1.0), 1e-6, 1 - 1e-6) # relative OOS rank in (0,1)
lambdas = np.log(omega / (1.0 - omega))             # logit

pbo = float(np.mean(lambdas <= 0.0))                # fraction of splits with lambda <= 0

注意这里没有什么:没有 p 值,没有对赢家夏普比率的阈值判断,没有对零假设分布的建模。PBO 从不问赢家好不好。它问的是挑选样本内最佳这个决定,能不能扛过和留出数据的接触。这是你的搜索的一种属性,而不是你的策略的属性——这正是为什么它能抓到赢家自身的统计量抓不到的东西。

第 2 幕——校准就是全部的论证:零假设是 0.5

一个水平的 PBO 刻度盘,从左侧的零延伸到右侧的一,正中间画着一条标注为过拟合线的醒目危险线,一枚硬币在这个中点上旋转保持平衡,一个零优势策略高耸的样本内夏普比率柱状条,在样本外坍缩成一根接近于零的扁平柱状条

一个无法校准的诊断工具,不过是传言。所以在把 PBO 用到任何真实数据之前,先在答案已知的数据上钉死两个端点:一个哪里都没有优势的场,和一个有真实优势的场。如果 PBO 在第一个上不落在 0.5 附近,在第二个上不落在 0 附近,它就毫无价值。

零假设端点。 用 200 列相互独立、零漂移、零优势的正态噪声构造 M——每个参数组合的真实夏普比率恰好为 0——然后跑 CSCV。在 60 个这样的矩阵上取平均。被选中(样本内最佳)的策略,平均报出样本内年化夏普比率 1.98。这不是个小数字;它正是 DSR 那篇文章测出的同一种选择虚高——200 列噪声里最好的那一列,看起来就像一个能拿到资金的策略。在样本外,同一个赢家交出的年化夏普比率是 0.06。它基本上把之前赚到的全吐了回去。而对这个流程的判决是:

PBOnull=0.476(±0.137)\text{PBO}_{\text{null}} = 0.476 \quad (\pm\, 0.137)

这就是被测量出来的抛硬币。在 12,870 次切分中,样本内赢家落在样本外中位数以下和以上的可能性几乎相等——0.476,比 ½ 略低一丝,在蒙特卡洛的波动范围内和 0.5 无法区分。配套的诊断指标也印证了这一点:所选策略样本外夏普比率为的概率是 0.475——从纯噪声里挑出样本内最佳,它在样本外大约有一半的时候会亏钱。这次选择里没有技巧,因为根本没有技巧可找,而 PBO 恰恰报出了这一点:0.5 是过拟合线,纯噪声就坐在这条线上。

为什么是 0.5 而不是 1?因为在真正的零假设下,全部 200 列都是可交换的——都是同一个噪声过程在统计上可互换的抽取结果。样本内赢家只在样本内特殊;到了样本外,它不过是另一列,排到哪个位置的可能性都相等。所以它的相对样本外排名 ωˉc\bar\omega_c(0,1)(0,1) 上是均匀分布的,logit λc\lambda_c 围绕 0 对称,λc0\lambda_c \le 0 所占的比例收敛到 ½。PBO 为 1 会比抛硬币更糟——那意味着样本内的成功能可靠地预测样本外的失败,这需要一种主动的反持续性机制,而不仅仅是没有优势(详见诚实说明)。

优势端点。 现在构造一个场,其中 200 个参数组合里有 20 个携带真实的、被植入的优势——单次观测夏普比率 0.15,年化后为 2.38(推算:0.15×2522.380.15 \times \sqrt{252} \approx 2.38)——其余 180 个仍是噪声。跑同样的 CSCV。故事完全反转了:

样本内夏普比率(年化) 样本外夏普比率(年化) PBO P(样本外亏损)
零假设(0 优势) 1.98 0.06 0.476 0.475
植入优势(夏普比率 2.38) 3.73 2.34 0.001 0.0006

植入优势的赢家报出样本内年化夏普比率 3.73——一如既往被选择效应虚高——但这一次它在样本外保住2.34,PBO 坍缩到 0.001。在全部 12,870 次切分中,样本内赢家几乎从不落入样本外的后一半。样本外亏损的概率降到 0.0006。这就是一个值得信赖的选择流程该有的样子:无论怎么切分训练集和测试集,胜出的都是同一类参数组合,因为那里确实存在一个真实、稳健的效应,供搜索去锁定。这两个端点——噪声上的 0.476,真实优势上的 0.001——就是校准本身。PBO 有效。

第 3 幕——一支连续的温度计,而不是是非判断

一条向下倾斜的温度计曲线,横轴是植入的真实优势强度,纵轴是 PBO,曲线从优势为零时约二分之一的位置平滑下降,随着优势增强逐渐趋向零,旁边一条镜像曲线展示所选策略的样本外夏普比率同步上升

两个端点证明了 PBO 能分辨噪声和优势。但更深层的性质是,它是平滑地做到这一点的。把植入的优势从无到强扫一遍,PBO 不会从 0.5 猛地跳到 0——它沿着一条单调的斜坡缓缓下滑,而所选策略的样本外夏普比率随之一步步同步上升:

植入的真实夏普比率(年化) PBO 所选策略的样本外夏普比率(年化)
0.00 0.52 −0.05
0.48 0.44 0.19
0.95 0.21 0.81
1.59 0.03 1.65
2.38 0.001 2.48
3.17 0.00 3.29

把这两列数据放在一起读。真实优势为零时,PBO 是 0.52,所选策略在样本外亏损 −0.05——又是抛硬币,而且赢家在亏钱。加上一丝优势(年化 0.48),PBO 微降到 0.44。到年化真实夏普比率 0.95——一个真实、温和、可信的优势——PBO 已经降到 0.21,样本外夏普比率爬升到 0.81。到 1.59 时是 0.03;到 2.38 时是 0.001;到 3.17 时,实际上是 0.00,所选策略在样本外报出 3.29。随着真实优势增强,PBO 单调下降,赢家的样本外表现同步上升——这是同一个事实的两面。

正是这个性质让 PBO 在实践中真正好用:它是一支连续的过拟合温度计,而不是一个二元报警器。PBO 为 0.21 并不只是说"没有过拟合"——它说的是你的选择拥有部分样本外技巧:样本内赢家有 79% 的时候能跑赢样本外中位数,但优势还薄到有五分之一的切分依然把它埋掉。当你强化信号、收紧候选池或者修剪网格时,你能看着这个数字移动,并知道哪个方向是诚实的。论文自己的经验法则——PBO 超过 0.05 就拒绝——正是从这条斜坡上自然得出的:年化夏普比率低于约 1.5 时搜索还没有过关;高于约 1.6 时就过关了。但这条斜坡本身比任何单一的截断值都更有信息量,因为它告诉你的不只是是否过拟合,还有你离抛硬币有多近

第 4 幕——真实世界的陷阱:一份被认证为毫无价值的漂亮回测

纯随机游走上一张发光的移动平均线交叉参数网格,其中一个诱人的明亮格子标着样本内夏普比率 2.33,旁边是同一个赢家的样本外结果散点图,中心落在零以下,一个 PBO 仪表钉在二分之一附近,配文写着认证为毫无价值

独立同分布噪声这个零假设是诚实的,但很容易被打发掉——"我的策略又不是随机正态列"。所以这里给出的,是从业者实际会踩进去的那种陷阱形状。拿移动平均线交叉来说,这是全世界被回测得最多的规则:快线上穿慢线时做多,否则空仓。给它做网格——10 种快线长度 ×\times 17 种慢线长度,只保留快线小于慢线的有效组合,共 K = 170 个参数组合。现在在一个可证明零优势的序列上跑这个网格:一条纯随机游走。这里没有任何东西可找。交叉规则无法预测随机游走。我们已经知道答案是"没有策略"。

网格并不知道这一点。它会交给你一个赢家,而这个赢家非常诱人

诊断指标(一个具有代表性的随机游走矩阵,种子 3000,K = 170,S = 16) 数值
最佳样本内夏普比率(年化) 2.33
PBO 0.573
样本外夏普比率中位数(年化) −0.22
样本外亏损的概率 0.63
样本外相对样本内的退化斜率 −0.92
logit 中位数 λ\lambda −0.25

这是一个指定种子的矩阵。在 60 个独立的随机游走矩阵上取平均,同样这些诊断指标读数为 PBO 0.463 ± 0.223,所选样本内夏普比率 0.97 衰减到 0.04,P(样本外亏损) 0.47——在统计上和零假设无法区分。种子 3000 的 0.573,只是 ~0.5 零假设区间中偏高一侧的一次抽样——是围绕抛硬币值的采样噪声,完全落在 ±0.223 的矩阵间波动范围之内——无论哪种情形,故事都是一样的。

移动平均线交叉在样本内报出年化夏普比率 2.33,这种结果正是那种会被写进路演材料的东西。它基本上等同于第 2 幕中我们真实植入优势的样本外夏普比率(2.34——堪称平局)。如果你在回测这一步就停下,你会给它注资。CSCV 拒绝了。PBO 在这里如同抛硬币:60 个矩阵平均 0.463,这一个矩阵上是 0.573——两者都说明这次搜索没有样本外技巧。 不要过度解读 0.573:它只比 ½ 高出 0.073,是围绕 0.5 零假设的采样噪声,完全落在 ±0.223 的矩阵间波动带以内;一个真正高于 0.5 的 PBO——样本内的成功会主动预测样本外的失败——需要一种反持续性或交易成本结构,而这条随机游走并不包含(见诚实说明)。在这个矩阵上,−0.25 的 logit 中位数,把样本内赢家的中位数放在了大约 0.44 的相对样本外排名上(推算:1/(1+e0.25)1/(1+e^{0.25}))——大约是 170 个里的第 75 名(推算:0.44×1710.44 \times 171),刚好落在它本该领跑的那个候选集中段以下。这个赢家的样本外夏普比率中位数是 −0.22——负数——而且它有 63% 的时候会出现样本外亏损。一个回测夏普比率 2.33、样本外期望却是亏损的策略:这就是海市蜃楼的定义。

−0.92 的退化斜率是第二把刀。把每次切分中所选赢家的样本外夏普比率,对其样本内夏普比率做回归;斜率陡峭为负——一个参数组合在样本内看起来越好,它在样本外表现就越差。这是在有记忆性的序列上过拟合的指纹:交叉规则咬住了训练区块里的瞬时模式,而这些模式作为随机游走的人为产物,会在样本外反转。有一个微妙之处值得说明,免得你过度解读这个斜率:负斜率本身并不是判决。即便第 2 幕里那个真实优势场景,退化斜率也是负的(−0.52)——均值回归总会把所选的最大值在样本外拉低一点。把海市蜃楼和真实优势区分开的,不是斜率是不是负的,而是赢家落在哪里:真实优势在给回去一点的同时,依然停留在顶部附近(PBO 0.001);海市蜃楼则坐在抛硬币线上(平均 PBO 0.463,这个种子上是 0.573),它的赢家高于样本外中位数和低于中位数的可能性半斤八两。读斜率是为了看收缩了多少;读 PBO 是为了看它是否依然泛化。海市蜃楼在这两项上都失败了。

这就是为什么 PBO 值得在原始回测旁边占据一席之地。样本内夏普比率 2.33 不是谎言——那个策略确实在样本内、在那条随机游走上赚到了它。这是选择,披着一条熟悉规则的外衣,架在一个看起来很真实的网格上,无论你怎么盯着资金曲线看都看不出破绽。只有给流程打分才能看出来。

第 5 幕——PBO 与 DSR:两个诚实的问题,一片高原

两件互补的测量仪器从不同角度对准同一次参数搜索,一件标着 PBO,问的是这次选择流程是否过拟合,读取的是整套训练-测试重采样;另一件标着 DSR,问的是这一个夏普比率是否超出了运气,折损的是单独一根获胜的柱子

PBO 和 Deflated Sharpe Ratio 是同一套诚实检验的两半,二者并不冗余——它们审问的是不同的对象:

Deflated Sharpe Ratio(DSR) 回测过拟合概率(PBO)
受审的对象 赢家 选择流程
问题 这个夏普比率是否超出了 N 次试验中运气所能买到的? 挑选样本内最佳能否泛化到样本外?
方法 参数化——折损显著性阈值 非参数——重采样全部 C(S, S/2) 次训练/测试切分
零假设值 DSR ≈ 0.5(赢家刚好打平噪声上限) PBO ≈ 0.5(赢家在样本外如同抛硬币)
你想要的 DSR 接近 1 PBO 接近 0
需要试验数 N 吗? 需要——而相关网格会让 N 变得含糊 不需要——切分重采样天然处理了依赖关系

它们甚至可能意见不合,而这种分歧本身就有诊断价值。DSR 会被相关网格骗得过度折损(这正是 DSR 那篇文章最后一幕整节讲的陷阱——640 个相关格子不是 640 次独立试验,直接喂进原始计数会把噪声上限抬得太高)。PBO 从不数试验次数;它重采样的是真实的收益矩阵,所以网格相关性天然就被烤进了切分里,不需要额外处理。反过来,PBO 只告诉你流程能否泛化,却不告诉你赢家是否跨过了某个门槛收益率——一次搜索可以有很低的 PBO,却依然选出了这样一个东西:它的样本外夏普比率虽然稳定高于候选集中位数,但小到不值得去交易。DSR 给赢家定价;PBO 给流程定价。两个都要跑。

两张三维参数网格曲面并排放置:左边是一片开阔平滑的高原,由表现优良的相邻参数组合组成,每一次训练-测试切分都对它意见一致,PBO 很低;右边是一根孤立的尖峰,周围被平坦的噪声包围,不同的切分对它意见不一,PBO 接近二分之一

这一切背后有一种几何直觉,也是最值得带走的东西。真实优势是一片高原;过拟合是一根尖峰。 当一个真实效应驱动你的网格时,表现好的参数组合会聚集在一起——fast=3/slow=55 有效,它的邻居们也有效,因为它们采样的都是同一个底层信号。这片高原对重采样是稳健的:无论你用 16 个区块里的哪 8 个来训练,样本内赢家都来自同一片开阔区域,而这片区域在样本外依然名列前茅。多数切分意见一致 → PBO 低。当过拟合驱动你的网格时,"赢家"是一根孤立的尖峰——恰好拟合了训练区块噪声的那一个格子,周围环绕着平庸的邻居。这根尖峰十分脆弱:换一种训练/测试切分,就会捧出另一根孤立的尖峰,没有一根能在测试集上存活下来。切分意见不一 → PBO ≈ 0.5。这和我们的高原分析研究从参数图那一侧得出的教训完全相同;PBO 实际上就是高原与尖峰之间的区别,同时在你数据的每一种对称重采样上被测量出来

这也解释了为什么 CSCV 胜过从业者默认使用的 walk-forward 切分。walk-forward 只给你一次过去→未来的切点和一个判决;CSCV 给你 12,870 个对称的切点,问的是赢家能否扛过全部。一根尖峰可以靠运气扛过一次随意的切点;它扛不过 12,870 次。(López de Prado 的组合净化交叉验证——Combinatorial Purged Cross-Validation,CPCV——用净化和禁运机制延伸了同样的想法,用来消灭朴素重采样在序列依赖下可能遭遇的标签泄漏,这是标签一旦重叠之后自然要爬的下一级台阶。)同一种结构性警示贯穿了整个系列:你所优化的指标暗中替你挑选了策略(目标函数设计),一根 K 线的泄漏能从噪声中凭空制造出夏普比率 15(前视偏差),一次多重检验搜索能从噪声中凭空制造出夏普比率 1.63(DSR)——而在这里,一个被重采样的选择流程凭空制造出一个毫无价值的赢家,而只有 PBO 能把它揭穿。

诚实说明

四条直白说出来的警示,因为一项受控研究只有讲清楚自己的局限,才配得上它给出的结论。

  • 数据生成过程是合成的——这是故意的。 零假设用独立同分布正态噪声,优势扫描用植入夏普比率的场,陷阱用纯随机游走上的移动平均线网格。这些都不是在宣称贴近真实市场;每一个都是为了受控的真实基准而选定的。我们只能通过生成一份我们确切知道答案的数据,才能证明 PBO 在"没有技巧"上读数为 0.5,在"真实技巧"上读数为 0。真实收益是肥尾的、自相关的、非平稳的;这里交付的是经过校准的诊断工具,而不是一个策略。
  • PBO 的零假设值是 0.5,这是一个特性,不是缺陷。 每次报告 PBO 时都要把这一点说清楚,否则你一半的读者会把 0.5 当成"半安全"。没有样本外技巧的搜索停在 0.5 上;真实优势会把它拉到 0。PBO ≈ 0.5 没有任何"无罪"的读法——它就是彻底过拟合的判决。
  • PBO > 0.5 是一个我们没有刻意制造出来的"反常"区域。 PBO 系统性地高于 0.5,意味着样本内的成功在主动预测样本外的失败——样本内最差的参数组合变成了样本外最好的。这需要一种反持续性或交易成本结构,而不仅仅是没有优势。我们的过拟合搜索都停留在 ≈ 0.5 附近(独立同分布噪声上是 0.476;移动平均线网格平均是 0.463;某个偏高种子上是 0.573,都落在 60 个矩阵蒙特卡洛波动的 ±0.14–0.22 区间内),这已经足以说明"没有样本外技巧"。我们没有人为制造反常区域;我们只是展示了过拟合会把你带抛硬币线,而这已经足够判决了。
  • 给定矩阵后 PBO 是确定性的;随机的只有矩阵本身。 对于固定的 MS = 16,全部 C(16, 8) = 12,870 次切分都被穷尽枚举——没有自助法种子,PBO 本身也没有采样方差。我们报告的波动范围(零假设上 ±0.137,移动平均线网格上 ±0.223)是60 个蒙特卡洛矩阵之间的方差,不是估计量内部的方差。每一侧的夏普比率是在大约 500 次观测上估计出来的——经过 CSCV 区块截断后是 496 次,因为 T = 1000 分成 16 个等长区块后剩下 992 行可用,再对半分成两个 496 的部分;因为夏普比率与顺序无关,训练集或测试集内部的行顺序不影响结果(对于像收益/回撤比这样的路径依赖型指标,顺序就会有影响)。

要点总结

  1. PBO 给选择流程打分,而不是给赢家打分——而且它的零假设值是 0.5。 它是这样一个概率:你在样本内挑出的最佳参数组合,在样本外落入后一半的概率。PBO ≈ 0.5 等同于抛硬币(彻底过拟合);PBO ≈ 0 是值得信赖的选择。你想要的是接近零,而且必须把这句话大声说出来,因为在没经过训练的眼睛看来 0.5 读起来像"安全",而实际意思恰恰相反。
  2. 校准证明了它有效。 在 200 个独立同分布零优势策略上,最佳样本内年化夏普比率 1.98 在样本外坍缩到 0.06,PBO = 0.476——噪声坐在抛硬币线上,样本外有 47.5% 的时候在亏钱。植入一个真实优势(年化夏普比率 2.38),样本内的 3.73 在样本外保住 2.34,同时 PBO 降到 0.001。两个端点,一个校准好的诊断工具。
  3. PBO 是一支连续的温度计。 扫描植入的优势,PBO 单调下降——在年化真实夏普比率 0.00 / 0.48 / 0.95 / 1.59 / 2.38 / 3.17 处分别是 0.52 → 0.44 → 0.21 → 0.03 → 0.001 → 0.00——所选策略的样本外夏普比率同步上升(从 −0.05 一路升到 3.29)。它测量的是你离抛硬币有多近,而不只是一个是非判断。
  4. 真实世界的陷阱才是整篇文章的重点。 一个 170 参数组合的移动平均线网格架在纯随机游走上,平均所选样本内夏普比率只有 0.97,衰减到 0.04,PBO 为 0.463——在统计上和零假设无法区分,一次无优势搜索读起来就跟零假设一样。在一个具有代表性的矩阵上,这场海市蜃楼十分鲜明:最佳样本内夏普比率 2.33(一个路演材料级别的数字),样本外夏普比率中位数 −0.22,样本外亏损概率 63%,PBO 0.573,退化斜率陡峭为 −0.92。一份漂亮的回测,样本外期望却是负的,赢家旁边打印出的每一项统计量都看不出破绽,只有给流程打分才能看见。
  5. 把 PBO 和 Deflated Sharpe Ratio 配对使用。 DSR 给赢家定价(在 N 次试验下,这个夏普比率是否超出了运气?);PBO 给流程定价(这次选择能否泛化?)。DSR 需要一个试验数,还会被相关网格骗到;PBO 重采样矩阵,从不数试验次数。真实优势是一片开阔的高原,多数切分对此意见一致(PBO 低);孤立的样本内尖峰就是过拟合(切分意见不一,PBO ≈ 0.5)。两个都要跑,然后去读那片高原。

搜索的赢家在被证明清白之前,都是有罪的——而 PBO 盘问的是搜索本身,而不是它递给你的那份不在场证明。它不管赢家在样本内看起来有多好,只问挑选它这个决定,能不能扛过被重新切分 12,870 种不同方式的考验。当它扛不住时——当你那个漂亮的 2.33 夏普比率,结果发现在样本外落入后一半的次数和落入前一半的次数差不多时——你并没有找到一个策略。你找到的是最走运的那枚硬币,而 PBO 就是抓住它翻转的那个数字。

完整的实验——零假设校准框架、植入优势的温度计扫描、随机游走网格陷阱,以及本文中每一个都能从同一个确定性脚本重新生成的数字——都收录在配套论文中,见 pbo-search.marketmaker.cc,代码与数据见 github.com/suenot/pbo-search

免责声明:本文提供的信息仅用于教育和参考目的,不构成财务、投资或交易建议。加密货币交易涉及重大损失风险。

Authors

Eugen Soloviov
Eugen Soloviov

Trading-systems engineer

Trading-systems engineer building bots since 2017: cross-exchange arbitrage (connected up to 30 venues), cointegration-based pairs arbitrage across spot and futures, scalping, news and sentiment-driven strategies, trend algorithms, and portfolio management and balancing algorithms. Also builds sub-millisecond order execution, big-data warehouses, backtesting engines, AI agents, and trading interfaces (incl. open-source profitmaker.cc). Stack: JS/TS, Python, Rust/Zig/Go, DevOps, backend, frontend, architecture.

Newsletter

紧跟市场步伐

订阅我们的时事通讯,获取独家 AI 交易见解、市场分析和平台更新。

我们尊重您的隐私。您可以随时退订。