回測過擬合機率(PBO):你的搜尋跑贏拋硬幣了嗎?
"回測無幻覺"系列文章。
📄 本文成長為了一篇研究論文。 以下每一個數字都來自同一個確定性指令碼,它構建了受控的真實基準——零優勢搜尋、植入優勢搜尋,以及一個在隨機遊走上的真實移動平均線參數網格——然後對其執行組合對稱交叉驗證(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 唯一需要的輸入。
現在看構造過程,分四步:
- 把時間切成
S = 16個等長的互不重疊區塊(每塊T/S行)。區塊保留了區域性時間結構——一旦收益存在記憶性,這個設計選擇就很關鍵。 - 窮舉每一種用一半區塊訓練、另一半測試的方式。 當
S = 16時,從 16 個區塊中選 8 個作訓練集,共有C(16, 8) = 12,870種取法;其餘 8 個作測試集。"組合對稱"這個名字正是由此而來:每一次切分都有一個映象(把訓練和測試互換),所以這套方案對稱地使用你的資料,而不是像單次 walk-forward 那樣只給你一個被特權化的"過去→未來"切點。 - 在每一次切分上,按樣本內夏普比率給全部 200 個參數組合排名,選出贏家
n*。 然後找出同一個參數組合n*在留出的 8 個區塊上,樣本外排名落在哪裡。 - 記錄贏家的相對樣本外排名,把它換算成 logit。PBO 就是 12,870 次切分中,該 logit ≤ 0 的那部分所佔的比例。
寫出這套列舉只需要幾行程式碼:
from itertools import combinations
combos = list(combinations(range(S), S // 2)) # C(16, 8) = 12,870 splits
對每一次切分,令 為樣本內贏家在 個參數組合中的樣本外排名(排名 1 = 最差, = 最佳)。把它歸一化為相對排名 ,取其 logit ,再對所有切分積分:
logit 只是一把方便的尺子。 意味著贏家落在了樣本外的前一半(相對排名高於 ½)——樣本內/樣本外一致,是好事。 意味著它落在樣本外中位數或以下——在這次切分上,樣本內的選擇沒有泛化。PBO 就是樣本內贏家未能跑贏樣本外中位數的那部分切分所佔的比例。 整個矩陣決定了這個數:給定 M 和 S,PBO 是確定性的——沒有重取樣種子,全部 12,870 次切分都被窮盡列舉。
寫成程式碼,一旦你算出了每次切分上每個參數組合的樣本內和樣本外夏普比率(矩陣 R_tr 和 R_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 在第一個上不落在 0.5 附近,在第二個上不落在 0 附近,它就毫無價值。
零假設端點。 用 200 列相互獨立、零漂移、零優勢的正態噪聲構造 M——每個參數組合的真實夏普比率恰好為 0——然後跑 CSCV。在 60 個這樣的矩陣上取平均。被選中(樣本內最佳)的策略,平均報出樣本內年化夏普比率 1.98。這不是個小數字;它正是 DSR 那篇文章測出的同一種選擇虛高——200 列噪聲裡最好的那一列,看起來就像一個能拿到資金的策略。在樣本外,同一個贏家交出的年化夏普比率是 0.06。它基本上把之前賺到的全吐了回去。而對這個流程的判決是:
這就是被測量出來的拋硬幣。在 12,870 次切分中,樣本內贏家落在樣本外中位數以下和以上的可能性幾乎相等——0.476,比 ½ 略低一絲,在蒙特卡洛的波動範圍內和 0.5 無法區分。配套的診斷指標也印證了這一點:所選策略樣本外夏普比率為負的機率是 0.475——從純噪聲裡挑出樣本內最佳,它在樣本外大約有一半的時候會虧錢。這次選擇裡沒有技巧,因為根本沒有技巧可找,而 PBO 恰恰報出了這一點:0.5 是過擬合線,純噪聲就坐在這條線上。
為什麼是 0.5 而不是 1?因為在真正的零假設下,全部 200 列都是可交換的——都是同一個噪聲過程在統計上可互換的抽取結果。樣本內贏家只在樣本內特殊;到了樣本外,它不過是另一列,排到哪個位置的可能性都相等。所以它的相對樣本外排名 在 上是均勻分佈的,logit 圍繞 0 對稱, 所佔的比例收斂到 ½。PBO 為 1 會比拋硬幣更糟——那意味著樣本內的成功能可靠地預測樣本外的失敗,這需要一種主動的反持續性機制,而不僅僅是沒有優勢(詳見誠實說明)。
優勢端點。 現在構造一個場,其中 200 個參數組合裡有 20 個攜帶真實的、被植入的優勢——單次觀測夏普比率 0.15,年化後為 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 不會從 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 幕——真實世界的陷阱:一份被認證為毫無價值的漂亮回測

獨立同分布噪聲這個零假設是誠實的,但很容易被打發掉——"我的策略又不是隨機正態列"。所以這裡給出的,是從業者實際會踩進去的那種陷阱形狀。拿移動平均線交叉來說,這是全世界被回測得最多的規則:快線上穿慢線時做多,否則空倉。給它做網格——10 種快線長度 17 種慢線長度,只保留快線小於慢線的有效組合,共 K = 170 個參數組合。現在在一個可證明零優勢的序列上跑這個網格:一條純隨機遊走。這裡沒有任何東西可找。交叉規則無法預測隨機遊走。我們已經知道答案是"沒有策略"。
網格並不知道這一點。它會交給你一個贏家,而這個贏家非常誘人:
| 診斷指標(一個具有代表性的隨機遊走矩陣,種子 3000,K = 170,S = 16) | 數值 |
|---|---|
| 最佳樣本內夏普比率(年化) | 2.33 |
| PBO | 0.573 |
| 樣本外夏普比率中位數(年化) | −0.22 |
| 樣本外虧損的機率 | 0.63 |
| 樣本外相對樣本內的退化斜率 | −0.92 |
| logit 中位數 | −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 的相對樣本外排名上(推算:)——大約是 170 個裡的第 75 名(推算:),剛好落在它本該領跑的那個候選集中段以下。這個贏家的樣本外夏普比率中位數是 −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 和 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 給流程定價。兩個都要跑。

這一切背後有一種幾何直覺,也是最值得帶走的東西。真實優勢是一片高原;過擬合是一根尖峰。 當一個真實效應驅動你的網格時,表現好的參數組合會聚集在一起——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 是確定性的;隨機的只有矩陣本身。 對於固定的
M和S = 16,全部C(16, 8) = 12,870次切分都被窮盡列舉——沒有自助法種子,PBO 本身也沒有采樣方差。我們報告的波動範圍(零假設上 ±0.137,移動平均線網格上 ±0.223)是60 個蒙特卡洛矩陣之間的方差,不是估計量內部的方差。每一側的夏普比率是在大約 500 次觀測上估計出來的——經過 CSCV 區塊截斷後是 496 次,因為T = 1000分成 16 個等長區塊後剩下 992 行可用,再對半分成兩個 496 的部分;因為夏普比率與順序無關,訓練集或測試集內部的行順序不影響結果(對於像收益/回撤比這樣的路徑依賴型指標,順序就會有影響)。
要點總結
- PBO 給選擇流程打分,而不是給贏家打分——而且它的零假設值是 0.5。 它是這樣一個機率:你在樣本內挑出的最佳參數組合,在樣本外落入後一半的機率。PBO ≈ 0.5 等同於拋硬幣(徹底過擬合);PBO ≈ 0 是值得信賴的選擇。你想要的是接近零,而且必須把這句話大聲說出來,因為在沒經過訓練的眼睛看來 0.5 讀起來像"安全",而實際意思恰恰相反。
- 校準證明了它有效。 在 200 個獨立同分布零優勢策略上,最佳樣本內年化夏普比率 1.98 在樣本外坍縮到 0.06,PBO = 0.476——噪聲坐在拋硬幣線上,樣本外有 47.5% 的時候在虧錢。植入一個真實優勢(年化夏普比率 2.38),樣本內的 3.73 在樣本外保住 2.34,同時 PBO 降到 0.001。兩個端點,一個校準好的診斷工具。
- 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)。它測量的是你離拋硬幣有多近,而不只是一個是非判斷。
- 真實世界的陷阱才是整篇文章的重點。 一個 170 參數組合的移動平均線網格架在純隨機遊走上,平均所選樣本內夏普比率只有 0.97,衰減到 0.04,PBO 為 0.463——在統計上和零假設無法區分,一次無優勢搜尋讀起來就跟零假設一樣。在一個具有代表性的矩陣上,這場海市蜃樓十分鮮明:最佳樣本內夏普比率 2.33(一個路演材料級別的數字),樣本外夏普比率中位數 −0.22,樣本外虧損機率 63%,PBO 0.573,退化斜率陡峭為 −0.92。一份漂亮的回測,樣本外期望卻是負的,贏家旁邊打印出的每一項統計量都看不出破綻,只有給流程打分才能看見。
- 把 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
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.