随机搜索 vs 智能搜索:交叉点在评估成本,而非算法本身
"无幻觉的回测"系列文章之一。
在超参数优化领域,有一条广为流传的常识:随机搜索只是你迟早会超越的基线。Bergstra 与 Bengio 的经典结果(2012)确立了随机搜索胜过网格搜索;此后,贝叶斯优化、TPE、CMA-ES 以及 Hyperband/ASHA 这类多保真度方法,理应依次胜过随机搜索。因此,当我们坐下来为自己的交易引擎评测各种参数搜索方法时,我们预期看到熟悉的阶梯:随机垫底,智能采样器在顶端。
我们得到的结果恰恰相反——然后又得到了教科书式的答案。同样的策略,同样的参数空间,同样的目标函数,同样的机器。我们唯一改变的是单次回测的开销,而搜索方法的排名却翻转了。当每次评估很便宜时,一个简单的打乱 Sobol 序列碾压了所有"智能"采样器。当我们让每次评估变得昂贵时,智能方法反超,并找到了唯一能在样本外存活下来的配置。
这个教训并不是"随机搜索被低估了"或"贝叶斯方法被高估了"。而是**随机搜索与智能搜索之间的交叉点由评估成本决定,而非算法本身的巧妙程度。**应当根据单次回测的成本来选择优化器,而不是根据它的名声。本文精确测量了交叉点位于何处、为何位于该处,以及一个前提条件——保真度——它决定了昂贵情形下的技巧(提前停止、多保真度剪枝)是否真的安全可用。
以下内容全部来自我们回测器中的两个脚本:bench_search.py(v4,commit ee092f1)用于便宜的单时间框架情形,以及 bench_search_multitf.py(commit 102853c)用于昂贵的多时间框架情形。两者都是无泄漏的——在第 i 根 K 线收盘时做出决策,在 open[i+1] 成交——并且两者都在同一个多折滚动 walk-forward 目标上为每种方法打分,其中包含一个搜索过程从未见过的留出测试窗口。
问题:拼吞吐量,还是拼样本效率?

每种搜索方法都把墙钟预算花在两件事上:决定下一步在哪里采样(采样器自身的计算)和评估该样本(运行回测)。前者称为 ask/tell 成本,后者称为 评估成本。在固定墙钟预算下,一种方法的有效搜索能力大致为:
其最终质量,则是这个点数乘以每个点被安放得多好。两个旋钮相互拉扯:
- 吞吐量——每秒的点数。简单采样器(随机、打乱的 Sobol/QMC)的 ask/tell 成本几乎为零:它们生成一个低差异点然后继续前进。它们最大化点数。
- 样本效率——每个点的质量。智能采样器(TPE、CMA-ES、ASHA)花费真实算力去建模目标函数,从而更好地安放每一个点。它们以牺牲吞吐量为代价,最大化布置质量。
哪个旋钮胜出,完全取决于分母。当评估成本很小时,ask/tell 成本主导分母,因此任何拉高它的东西——一个代理模型、一个核密度估计、一次协方差更新——都会直接压缩你能探索的点数。当评估成本很大时,ask/tell 成本只是个舍入误差,因此"智能"实际上是免费的,你应当尽可能多地购买它。
这就是整篇文章的核心论点,一句话概括:**ask/tell 税是固定的,但它的重要性取决于你用来做分母的评估成本。**现在让我们来看看它实际发生的过程。
便宜情形:简单的 Sobol 靠吞吐量取胜

我们的单时间框架策略是一个 7 参数空间上的无泄漏 HMA/HMA3 分离规则,由进程内的 numba eval_batch 评估,它对各配置运行 prange,没有跨进程开销。在这个引擎上,单次回测几乎是免费的——原始内核评估配置的速度大约为每秒 3–4 千个。这就是便宜情形,也是交易与大多数 HPO 民间智慧所源自的深度学习场景截然不同之处:我们的"目标函数"不是一次 6 小时的 GPU 训练,而是一次 0.3 毫秒的数组运算。
我们给每种方法相同的预算——1,500 次评估——并记录了各自花费这些评估所需的墙钟时间,以及找到的留出测试目标值。由于评估预算是固定的,墙钟时间这一列直接反映了每个采样器的开销:
| 方法 | 评估次数 | 墙钟时间 | 吞吐量 | 留出 TEST |
|---|---|---|---|---|
| sobol (QMC) | 1,500 | 0.53 秒 | ~2,830 cfg/s | −259 |
| random | 1,500 | 0.85 秒 | ~1,770 cfg/s | −27 |
| sobol→cmaes | 1,500 | 1.38 秒 | ~1,085 cfg/s | −367 |
| cmaes | 1,500 | 1.76 秒 | ~850 cfg/s | −85 |
| tpe | 1,500 | 9.76 秒 | ~154 cfg/s | −161 |
| tpe-mv+sobol | 1,500 | 12.15 秒 | ~123 cfg/s | −151 |
| asha (folds) | 1,500 | 15.79 秒 | ~95 cfg/s | −165 |
TEST 是留出窗口上的 walk-forward 目标值(按活跃时间年化的 PnL 乘以交易次数置信度),搜索过程从未接触过这个窗口;数值越高越好。
有两个事实特别突出。第一,看吞吐量列。打乱的 Sobol 运行速度约为 2,830 cfg/s——接近引擎的上限。TPE 的运行速度约为 154 cfg/s,ASHA 约为 95。这意味着为了做出完全相同数量的评估,速度慢了 18–30 倍。智能采样器并没有多评估任何东西;它们只是把那些时间花在了自己的 ask/tell 机制内部。
第二——这是让整个故事保持诚实的部分——没有任何方法找到了正的样本外结果。每一个 TEST 值都是负的。在单时间框架情形下,我们的策略根本没有持久的样本外优势,所以"哪种方法胜出"并不是关于最终利润的问题;而是关于搜索效率的问题。而在固定评估预算下的搜索效率上,简单方法完胜:Sobol 和 random 达到了与智能采样器相同甚至更好的留出数值,却只花费了 1/20 的墙钟时间。
现在按照从业者实际体验的方式来反转比较——**固定墙钟时间,而非评估次数。**如果给每种方法 ASHA 完成 1,500 次评估所需的 15.8 秒,Sobol 不会停在 1,500 次。它会一直继续,达到大约 45,000 次配置。在便宜情形下,问题从来都不是"哪个采样器把 1,500 个点安放得最好"——而是"当每个点几乎免费时,你更愿意拥有 1,500 个精心安放的点,还是 45,000 个打乱的点?"在评估近乎免费的情况下,广度取胜。对一个 7 维空间做 30 倍的覆盖,胜过对它建立一个更好的模型。
ask/tell 税
这 20 倍的时间去哪儿了?不是花在回测本身——那在各方法之间是相同的。它花在了采样器逐点的账本记录上,用 Python 运行,在循环里:
- TPE 在每次
ask时都拟合一对核密度估计(好试验与坏试验),且成本随试验历史增长。多元 TPE 会跨维度联合拟合它们——建模更多,Python 也更多。 - CMA-ES 在每一代都更新并从协方差矩阵中采样。这里比 TPE 便宜(运行速度约为 850 cfg/s),但仍比生成一个 Sobol 点高出一个数量级的开销。
- ASHA 既要支付剪枝器晋级/梯级记录的开销,又要在我们以折数作为保真度的设计中,在能剪枝任何东西之前先支付固定的指标预计算开销——所以它"节省"的评估次数比账面上看起来的要少。
这些都不是对算法本身的贬低。而正是问题的关键所在:**ask/tell 成本大致是每个点固定的若干毫秒,而当它所包裹的评估同样只有几毫秒时,这个固定成本会突然占据你预算的 90%。**智能采样器把十分之九的墙钟时间花在思考该往哪看,只有十分之一真正用于观察。而打乱的 Sobol 序列把全部时间都用于观察。当观察很便宜时,观察胜出。
我们特意没有在此评测完整的高斯过程贝叶斯优化器,原因相同:GP 代理模型相对于试验次数是 的。面对一次只需几毫秒的评估,拟合代理模型会在评估到空间中有意义的一部分之前就耗尽整个搜索预算。在便宜情形下,GP-BO 从算术上就被淘汰了。
昂贵情形:交叉点翻转

现在我们让单次回测变得昂贵。多时间框架策略叠加了一个高、一个中、一个低时间框架(三重时间框架),每个都贡献一次指标计算和自己的阈值,全部在同一个多折 walk-forward 上打分。单次评估现在花费大约 0.1–0.5 秒,而不是 0.3 毫秒——跳跃了三个数量级。评估成本已经从我们分母中的舍入误差项,变成了主导项。按照这个论点,ask/tell 税应当不再重要,而"智能"应当开始带来回报。事实确实如此。
我们在三重时间框架问题(一个 18 参数空间)上,让每种方法在固定约 150 秒的墙钟时间预算下运行,让每种方法按照其采样器的规则自行分配这一预算,并在一个留出测试窗口上评估它返回的单个最佳配置:
| 方法(三重时间框架,150 秒) | 评估次数 | 留出 TEST | 结论 |
|---|---|---|---|
| sobol (QMC) | 349 | −673 | 落败 |
| cascade (sobol²×64) | 20,864 | −585 | 落败 |
| asha (folds) | 292 有效 | −239 | 落败 |
| tpe-mv+sobol | 455 | −43 | 落败 |
| sobol→cmaes | 15,239 | +226 | 唯一样本外为正 |
TEST 与之前相同,都是 walk-forward 目标值。只有一种方法跨过了零线。
在便宜情形中占主导地位的简单 Sobol 基线,现在垫底,为 −673。对一个 18 维空间进行盲目的低差异采样,由于每次评估都很昂贵,只能花费 349 次评估,从未能对任何区域进行定位。智能方法 sobol→cmaes——将 30% 的预算用于 Sobol 以播种一个盆地,然后从最佳种子进行 CMA-ES 精炼——是**唯一产生了正的样本外结果的方法。**在最终未触碰过的留出集上,冠军配置返回了 +2.62%(19 笔交易,约 6.6% 的资金敞口),叠加在测试窗口返回的 +16.35%(46 笔交易,约 15.7% 敞口)之上。每一个竞争对手的冠军配置在样本外都是亏损的。
这就是交叉点,在同一个策略族、同一个目标函数、同一台机器上测量得到:**只改变单次评估的成本,什么都不改变,搜索方法的排名就翻转了。**在便宜情形下 Sobol 胜出,智能采样器是 20 倍的浪费;在昂贵情形下,智能采样器是唯一有效的东西,而 Sobol 才是浪费。
为什么"智能"在这里胜出——而且不仅仅是样本效率

这个故事的整洁版本是"昂贵的评估奖励样本效率,所以安放更少、更好的点的方法胜出。"这只说对了一半,数据迫使我们说出诚实、更有趣的另一半。
再看一遍评估次数。sobol→cmaes 并不是通过比盲目 Sobol 更少的评估次数取胜——它在同样的 150 秒内评估了 15,239 次,是 Sobol 的 349 次的四十倍还多。为什么?因为我们多时间框架的评估成本是有结构的,而非均匀的。这里有两根轴:一根是昂贵的指标轴(时间框架周期和 HMA 长度,每次计算 30–500 毫秒,因为它们要强制重新计算指标),另一根是便宜的阈值轴(入场/出场分离水平,在缓存信号上每次约 1–2 毫秒)。二者之间的差距是 30–100 倍。
盲目的 Sobol 忽略了这种结构。它抽取的每一个点都会扰动昂贵的指标轴,从而强制进行一次全新的重新计算——所以它在全部 349 次评估上都支付了全价。而 sobol→cmaes 一旦 CMA-ES 定位到一个有前景的区域,就倾向于让粗粒度的指标结构大致保持固定,转而扰动连续的阈值,这些阈值落在缓存信号上,几乎不产生成本。智能方法把同样的墙钟时间同时转化为更好安放的点以及多得多的点,因为在这里保持自适应意味着具备成本意识:在昂贵的轴被固定之后,停留在便宜的轴上。我们显式的 cascade(sobol²×64) 利用手法把这一点发挥到了极致——通过在缓存信号上批量处理便宜的阈值,进行了 20,864 次评估——虽然它在三重时间框架测试中落败,但在双时间框架变体中,它在测试窗口上以 +20.2% 的成绩直接获胜(之后在自己的留出集上失败——下文详述)。
所以对交叉点更精确的表述是:在昂贵情形下,ask/tell 税变得可以忽略不计,这释放了你去变得智能——而"智能"意味着适应目标函数的成本结构,而不仅仅是它的形状。盲目采样二者都做不到。这正是我们的自适应分辨率下钻引擎所要利用的双轴结构,也是为什么多保真度方法属于昂贵情形——前提是一个条件成立。
保真度:剪枝隐藏的前提条件
多保真度方法——Hyperband、ASHA,任何提前停止剪枝器——都建立在一个假设之上:便宜、部分的评估对配置的排名与昂贵、完整的评估所给出的排名相同。如果一个配置在某一个 walk-forward 折上看起来不错,在所有折上也倾向于看起来不错,那么你就可以提前淘汰输家,把幸存者的预算花在赢家身上。如果便宜保真度给出的排名是随机的,那么提前停止就只是靠抛硬币扔掉好的配置。
因此,在信任任何剪枝器之前,我们直接测量这个假设。我们的保真度是使用的 walk-forward 折数(便宜地在 r 折上评估,或者以全价在全部 K 折上评估),保真度门控计算便宜的 r 折目标值与全量目标值之间、在一批随机配置样本上的 Spearman 秩相关系数 ρ。ρ@1 是当你只依据单个折来判断时的相关系数——最激进、最便宜的保真度。以下是该门控在两种情形下报告的结果:
| 保真度(使用的折数) | 单时间框架 ρ | 多时间框架 ρ |
|---|---|---|
| ρ@1(1 折) | ~0.03 | 0.43 |
| ρ@2 | — | 0.67 |
| ρ@3 | — | 0.78 |
| ρ@4 | — | 0.82 |
| ρ@5 | — | 0.91 |
在单时间框架情形下,单折对配置排名的相关系数为 ~0.03——在统计上与随机无法区分。这并非巧合;它与"没有任何方法找到样本外优势"是同一个事实。当一个策略没有持久信号时,它逐折的表现主要是运气,所以任何单一的折都近似于一次随机抽取,低保真度剪枝会淘汰好的配置,提升幸运的配置。在这里的便宜情形下,多保真度是不安全的——不是因为方法本身不好,而是因为便宜信号就是噪声。(我们的门控会标记这一点,并拒绝进行激进剪枝。)
在多时间框架情形下,存在真实的优势,保真度图景随之改变:ρ@1 上升到 0.43,到第五折时 ρ 攀升至 0.91。此时单折就携带了真实的排名信息,而五折几乎携带了全部信息。提前停止变得安全——一个在前几折就落败的配置,确实很可能是个输家。这就是多保真度方法属于昂贵情形的第二个原因:不仅仅是昂贵的评估让剪枝值得,而且昂贵情形正是便宜保真度终于排名得像昂贵保真度一样的地方。
由此得到的规则简单明了、运行成本低廉:**在剪枝之前先测量 ρ。**保真度相关性只需在几百个随机配置上做两行代码的计算,而它正是多保真度搜索为你加速与多保真度搜索悄悄破坏你之间的分水岭。
赢得搜索不等于活下来
再说一句诚实的话,因为本系列文章正是关于会说谎的回测。我们的三重时间框架冠军 sobol→cmaes 是唯一发布了正留出结果的方法——+2.62%,叠加在测试窗口的 +16.35% 之上。这是好消息。但这里有一个警示:它没能在统计降级中存活下来。
这个冠军配置是在所有方法中尝试的数万个配置里的最佳者。在这么大量的多重检验之下,+2.62% 的留出结果并不能自动被认定为真实。我们运行了整个系列都依赖的过拟合门控——Deflated Sharpe Ratio,其有效 N 针对试验间的相关性做了修正,以及通过组合对称交叉验证得到的 PBO。这个冠军配置通过了 PBO 检验(0.12,舒适地低于 0.2 的阈值——它在 CSCV 各分割中的排名是稳定的),但它的deflated Sharpe 崩塌为零(门控要求 ≥ 0.95)。结论:未能存活。
请仔细体会这句话,因为它正是整个练习的核心。交叉点结果是真实的:在昂贵情形下,智能搜索确实赢得了搜索,赢得干脆利落,而 Sobol 输掉了搜索。但**赢得搜索是关于优化器的陈述,而不是关于策略的陈述。**一个好的优化器能从一个没有优势的空间中找到的最佳配置,仍然是没有优势的——降级检验告诉你的正是你手里拿着的是哪一种。选对搜索方法能让你高效地得到当前可得的最佳答案;它不会凭空制造出一个原本不存在的优势。优化器和过拟合门控是测量不同事物的不同仪器,你两者都需要。
一条你真正能应用的决策规则
你不需要重新运行我们的评测才能选出一个优化器。你只需要一个数字:**单次回测需要多长时间?**为你的目标函数计时一次完整的评估——一次完整的 walk-forward 过程,全部折数——然后读出所处的情形。
- **便宜的评估(≲ 约 10 毫秒/回测):购买吞吐量。**使用打乱的 Sobol/QMC 或随机搜索。TPE/CMA-ES/ASHA 的 ask/tell 税会让你的点数损失 10–30 倍,而这换来的布置质量在近乎免费的评估下并不划算。不要费心使用多保真度剪枝——如果你有这个冲动,先检查 ρ@1;在一个低优势的便宜情形中,它很可能接近零,这意味着剪枝就是在抛硬币。把省下来的工程时间用于拓宽搜索,而不是收窄它。
- **昂贵的评估(≳ 约 100 毫秒到数秒/回测):购买样本效率。**使用 CMA-ES、TPE,或 Sobol 播种的 CMA-ES 混合方法;采样器开销此时相对于评估已成为舍入误差。如果你的评估成本是有结构的(如多时间框架中的慢指标轴和快阈值轴),优先选择能利用这种结构的方法——级联、下钻,任何具备成本意识的方法——而不是把每个维度都当作同等昂贵来处理的方法。
- **介于两者之间,或不确定时:**Sobol 播种的混合方法(
sobol→cmaes)是稳健的默认选择。它早期表现得像广度优先的 Sobol(便宜,无需拟合模型),后期表现得像一个智能精炼器,因此无论你最终处于哪种情形,它都能优雅地降级——这正是它成为我们昂贵情形冠军的原因。 - **在使用任何剪枝器之前,先测量保真度。**在几百个随机配置上计算便宜保真度与完整目标值之间的 Spearman ρ。如果 ρ@1 很低,不要仅凭一折就剪枝;提高最小资源,直到 ρ 达到约 0.5 以上。这只需要两行代码,却能防止你的加速器悄悄丢弃你最好的配置。
- **无论哪个赢得了搜索,都要运行降级门控。**优化器的赢家是你一整周中最容易过拟合的产物。决定它是否可交易的是 DSR 和 PBO,而不是优化器给出的分数。
这与哪些内容相关联
这个结果处在本系列一直在牵引的几条线索的交汇处:
- 它以引擎本身是诚实的为前提。整个便宜情形下的优势之所以存在,正是因为我们进程内的 numba 引擎每秒能处理数千个配置且没有 IPC 开销——速度阶梯正是让你首先处于吞吐量取胜情形的原因。一个缓慢的、被框架拖累的引擎会默认把每个问题都推入昂贵情形,你将永远看不到这个交叉点。
- 昂贵情形下的利用手法,正是我们自适应分辨率下钻引擎所围绕设计的双轴成本结构:先在粗粒度、昂贵的轴上定位,再利用精细、便宜的轴。
- 这里的每一种方法之所以值得信赖,仅仅是因为引擎是无泄漏的。对数万次试验的搜索,是发现并利用前视偏差漏洞的最高效机器——"赢家"就会是那个最狠地依赖这个漏洞的配置。先修好时钟,再搜索。
- 而这位冠军的命运——赢得了搜索,却未能通过降级检验——正是把参数搜索与过拟合控制当作两个使用不同仪器的独立阶段来处理的全部论据所在。
学术背景与该领域一直不断回归的那个背景相同:Bergstra 与 Bengio(2012)关于随机搜索为何胜过网格搜索;Li 等人的 Hyperband(2018)以及后续的 ASHA(2020)关于多保真度;以及 Bailey 与 López de Prado(2014)关于为何任何大规模搜索的赢家在被相信之前都必须先被降级处理。它们都没有规定唯一的最佳优化器,因为根本不存在这样一个东西——存在的是一种情形,以及一个选择该情形的成本。
要点总结
- **随机搜索与智能搜索之间的交叉点由评估成本决定,而非算法本身。**我们只改变了单次回测的成本,就翻转了每一种方法的排名。
- **便宜的评估 → 简单的 Sobol 靠吞吐量取胜。**在我们的单时间框架引擎上(约 3–4 千 cfg/s),TPE 和 ASHA 在相同评估次数下运行得慢了 18–30 倍——约 95–154 cfg/s,相对于 Sobol 的约 2,830 cfg/s。在相同墙钟时间下,当每个点几乎免费时,广度胜过对空间建立更好的模型。
- **昂贵的评估 → 智能方法靠效率取胜。**在三重时间框架问题上,
sobol→cmaes是唯一找到正样本外结果的方法(测试 +16.35%,留出 +2.62%);盲目的 Sobol 垫底。 - **在昂贵情形下,"智能"意味着具备成本意识。**赢家利用了昂贵指标轴与便宜阈值轴之间 30–100 倍的差距——它既做了更多次评估,又把它们安放得更好,方法是在昂贵轴被固定之后,停留在便宜轴上。
- **保真度是剪枝的前提条件。**单折排名相关性从 ρ@1 ≈ 0.03(单时间框架,基本随机)上升到 0.43(多时间框架),到第五折时达到 0.91。多保真度/ASHA 只有在便宜保真度的排名表现得像昂贵保真度一样时才会带来回报——所以在剪枝之前先测量 ρ。
- **赢得搜索不等于活下来。**这位冠军通过了 PBO 检验,却未能通过 Deflated Sharpe 门控。根据评估成本选择优化器;用降级门控来决定可交易性。它们是不同的仪器,两者都需要。
根据单次回测的成本来选择你的优化器。然后要记住:一个优化器在没有优势的空间中所能找到的最佳答案,仍然是没有优势的——让门控而非搜索本身,来告诉你手里拿着的到底是哪一种。
Authors
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.