隨機搜尋 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.