掃 200 組參數,最好那組的 p 值是 0.008。這個數字能信嗎?先算一筆帳:就算 200 組彼此獨立、底層全部是雜訊,「至少出現一個 p ≤ 0.008」的機率大約是八成。你手上這個看起來很顯著的數字,是雜訊的正常產出,不是訊號的證據。
多重檢定的麻煩不在於沒人知道要校正。麻煩在於多數人只認識 Bonferroni 校正這一種工具,而 Bonferroni 在策略回測的場景裡,經常是錯誤的工具:不是嚴到把真訊號一起殺光,就是它假設的錯誤結構根本不是你在乎的那種。多重檢定校正是一組把「試了幾次」折算回顯著性判斷的統計程序,它是一整個工具家族,每一種控制的錯誤率不同,回答的問題也不同。用錯工具算出來的 p 值,跟沒校正的 p 值一樣沒有意義。
這篇把四條校正路線實際跑一遍:Bonferroni 與 Holm 怎麼算、Benjamini-Hochberg 的 FDR 程序怎麼跑、White’s Reality Check 與 Hansen SPA 的 bootstrap 檢定怎麼做,最後給一個「什麼情境用哪一條」的決策框架,以及五種會讓校正整組失效的用法。
至於為什麼掃越多越容易撈到假訊號、選擇偏誤從哪六個入口滲進回測,選擇偏誤與多重測試那篇已經把機制拆完了。這篇處理的是下一步:知道要校正之後,實際上怎麼算、怎麼選、怎麼判讀。
校正之前先選題:你要控制哪一種錯誤率
沒校正的 p 值控制的是「單次比較錯誤率」:每做一次檢定,容許 5% 的機率誤判。這個保證在單一檢定裡成立,一放進批量掃描就失效。20 次檢定,期望 1 個假陽性;200 次,期望 10 個。你從裡面挑最好的那個出來,挑到的幾乎就是假陽性本人。
校正工具做的事,是把保證的對象從「單次檢定」換成別的東西。換成什麼,決定你該用哪一族:
FWER(族系錯誤率):控制「整批檢定裡至少出現一個假陽性」的機率。保證最強,代價是檢定力最低,次數一多就幾乎什麼都選不出來。
FDR(偽發現率):控制「你挑出來的那批裡,假陽性佔的期望比例」。容許少量誤判,換回可用的檢定力。
複合虛無假設(資料窺探檢定):直接對「整個搜尋空間裡最好那支,是否真的贏過基準」做推論。它不逐支檢定,它檢定的對象就是「冠軍」這個被選擇過的結果。
三族對應三種代價結構。錯殺一個真訊號的成本高,還是誤放一個假訊號的成本高,這件事在你按下計算之前就要想清楚。工具是跟著問題走的,不是跟著習慣走的。
FWER 路線:Bonferroni 是鈍刀,Holm 是同價的利刀
Bonferroni 的算法一行就講完:把顯著門檻 α 除以檢定次數 N。20 個因子、α = 0.05,單支門檻就是 0.0025。它靠聯集上界成立,對檢定之間的相關結構不做任何假設,怎麼用都不會低估錯誤率。
問題是它一視同仁地嚴。Holm 校正提供完全相同的 FWER 保證、同樣不需要任何獨立性假設,但檢定力一律不輸 Bonferroni,做法只是把門檻改成逐步下降:p 值由小到大排序,第 1 名跟 α/N 比,第 2 名跟 α/(N−1) 比,第 k 名跟 α/(N−k+1) 比,遇到第一個沒過的就停,之後全部拒絕。
拿一組具體數字跑一遍。你掃了 20 個鏈上因子,p 值最小的前六名如下:
| 排序 | p 值 | Bonferroni 門檻 | Holm 門檻 | Bonferroni 判決 | Holm 判決 |
|---|---|---|---|---|---|
| 1 | 0.0004 | 0.0025 | 0.0025 | 通過 | 通過 |
| 2 | 0.0026 | 0.0025 | 0.00263 | 淘汰 | 通過 |
| 3 | 0.0080 | 0.0025 | 0.00278 | 淘汰 | 淘汰,之後全停 |
| 4 | 0.0150 | 0.0025 | ‧ | 淘汰 | 淘汰 |
| 5 | 0.0240 | 0.0025 | ‧ | 淘汰 | 淘汰 |
| 6 | 0.0410 | 0.0025 | ‧ | 淘汰 | 淘汰 |
同一組資料,Bonferroni 留 1 支,Holm 留 2 支。第 2 名那支 0.0026 剛好卡在兩個門檻中間,這不是巧合設計出來的戲劇性,是 Holm 的逐步門檻在 N 大的時候常態性地多救回幾支真訊號。既然保證完全相同,實務上沒有理由用 Bonferroni 而不用 Holm。
FWER 路線的適用場景很窄但很明確:你要挑的是極少數、將投入重倉、錯不起的核心訊號。這時「一個都不能錯」的保證才值得付出檢定力的代價。
FDR 路線:Benjamini-Hochberg 的實作與正確判讀
批量篩因子的時候,FWER 的邏輯不合理。你掃 20 個因子是預期裡面有幾個真的有效,容許混進少量假陽性、後面再用第二道驗證清掉,比在第一關就殺光合算。這就是 Benjamini-Hochberg 程序(BH)做 FDR 控制的邏輯。
算法同樣是排序後比門檻,方向相反:由大往小找。p 值由小到大排序,第 k 名的門檻是 (k/N)×q,q 是你容許的偽發現率。從最大的 k 往回找,找到第一個滿足 p(k) ≤ (k/N)×q 的位置,第 1 到第 k 名全部保留。
延續上面那 20 個因子,設 q = 0.10:
| 排序 | p 值 | BH 門檻 (k/20)×0.10 | 判決 |
|---|---|---|---|
| 1 | 0.0004 | 0.0050 | 保留 |
| 2 | 0.0026 | 0.0100 | 保留 |
| 3 | 0.0080 | 0.0150 | 保留 |
| 4 | 0.0150 | 0.0200 | 保留 |
| 5 | 0.0240 | 0.0250 | 保留(最大的達標位置) |
| 6 | 0.0410 | 0.0300 | 淘汰 |
Holm 留 2 支,BH 留 5 支。代價寫在 q 裡:這 5 支裡,期望最多有 0.5 支是假的。
判讀上有一個常被弄錯的點。FDR 是批次層級的陳述,不是對單支的保證。你可以說「這批 5 支平均而言至多一成是假的」,不能說「這 5 支裡每一支有 90% 機率是真的」。決定資金配置時,這兩句話的差別是實質的:BH 篩出來的名單是候選池,不是投產名單。
還有一個前提要交代。BH 的保證在檢定彼此獨立或正相關時成立;相關結構亂七八糟時,理論上該用 Benjamini-Yekutieli 修正,門檻再除以一個調和級數和,N = 20 時大約再嚴 3.6 倍。實務上 BY 嚴到接近 FWER,多數人寧可用 BH 然後靠第二道樣本外驗證兜底。這是一個工程取捨,但你至少要知道自己做了這個取捨。
p 值校正的共同盲點:策略之間不是獨立的
上面兩條路線共用一個結構性弱點:它們把 N 當成 N 個獨立的問題。策略回測不是。你的 200 組參數是同一個訊號的 200 個變體,彼此的報酬序列相關性可能高達 0.9。名目上 200 次檢定,有效的獨立檢定數可能只有十幾次。
這會往兩個方向壞事。用名目 N 去做 Bonferroni 或 Holm,等於用 200 的懲罰去打一個實際只有 15 的搜尋,過罰,真訊號被冤殺。反過來,如果你憑感覺把 N 砍成 15,這個數字沒有任何可辯護的依據,審視你研究的人只會當你在給自己放水。
有效檢定數沒有乾淨的公式可以猜。出路是換一個思路:不去修 p 值的門檻,改用 bootstrap 把策略之間的相關結構原封不動帶進推論裡。這就是資料窺探檢定那條路線。
我們在 Lab 社群拿會員的實際掃描結果跑過這個對比:同一批 300 組動能變體,Holm 校正後全軍覆沒,SPA 檢定卻在 5% 水準下拒絕了「冠軍純靠運氣」。差別就在相關結構有沒有被算進去。想把自己的掃描結果丟進來跑的,Lab 裡有現成的程式與討論。
資料窺探檢定:White’s Reality Check 的五個步驟
White 的 Reality Check(2000)檢定的虛無假設是:搜尋空間裡最好的那支策略,期望表現沒有贏過基準。它把「你挑了冠軍」這件事直接寫進統計量裡,所以選擇偏誤不再是污染,而是被檢定的對象本身。
實作是五個步驟:
- 定義相對績效序列。 對每支策略 k,逐期算出它相對基準的超額報酬 f(k, t)。基準要誠實:買進持有、50/50,不是零。
- 算觀察統計量。 每支取平均後乘上 √T,取全體的最大值 V。這就是「冠軍的成績」。
- Bootstrap 重抽時間軸。 用平穩區塊 bootstrap(stationary bootstrap)對 T 個時間索引重抽,保留報酬的自相關與策略間的橫斷面相關。日線資料的平均區塊長度通常設 10 到 20 天,並對這個參數做敏感度檢查。
- 重算再定心。 每一次重抽 b,對每支策略算出重抽後的平均,減去原始平均後乘 √T,再取最大值,得到 V*(b)。定心這一步是在模擬「虛無假設為真的世界裡,冠軍能靠運氣考幾分」。
- 算 p 值。 跑 B 次(至少 1000 次),p 值就是 V*(b) ≥ V 的比例。
判讀方式跟單支檢定的 p 值完全不同。Reality Check 的 p = 0.03 讀作:把我整個搜尋空間的相關結構、全部 200 支變體都算進去之後,純雜訊生出「冠軍這種成績」的機率只有 3%。這句話裡的搜尋成本已經付清了。
Hansen SPA 修掉 Reality Check 的兩個毛病
Reality Check 有兩個已知缺陷。它的統計量沒有標準化,高波動策略會主導最大值,安靜但穩定的真訊號反而被淹沒。它對「深度輸家」也沒有防禦:往宇宙裡塞一堆明顯賠錢的垃圾策略,虛無分布會被拉寬,檢定越變越保守,真訊號跟著陪葬。
Hansen 的 SPA 檢定(2005)修這兩件事:統計量除以各策略自己的標準誤,讓不同波動的策略站上同一把尺;再用一個門檻規則,把表現明顯劣於基準的策略從虛無分布的定心裡剔除,垃圾進場不再稀釋檢定力。
SPA 會輸出三個 p 值:下界、一致、上界。實務判讀以一致版(SPA_c)為主,上下界當區間看。三個值如果差距很大,本身就是訊號:你的宇宙裡塞了大量深度輸家,該回頭檢查掃描空間是不是根本沒設計過。
挑工具的決策框架
四條路線各管一種問題,對照表收攏:
| 你的情境 | 工具 | 你得到的陳述 |
|---|---|---|
| 挑極少數重倉核心訊號,錯不起 | Holm(FWER) | 這批入選者連一個假陽性都出現的機率 ≤ α |
| 大批因子初篩,後面還有第二道驗證 | Benjamini-Hochberg(FDR) | 入選批次裡假陽性的期望比例 ≤ q |
| 掃描空間裡選出的冠軍,要對基準宣稱 edge | Hansen SPA | 冠軍的成績純靠運氣的機率 = p |
| 評估指標就是 Sharpe,要把試驗次數折進顯著性 | Deflated Sharpe Ratio / PBO | 折算搜尋成本後 Sharpe 仍大於零的信心 |
Sharpe 專用那條路的完整公式與實算,Deflated Sharpe Ratio 那篇有單獨拆解,這裡不重複。
四條路線共用同一個前提:你餵進去的 N 和策略宇宙必須是真的。試驗次數低報一個數量級,任何校正都算不回來。
加密市場還要多加一層心理準備。歷史短、有效樣本少,檢定力天生偏低,嚴格校正之下「什麼都不顯著」是常態而不是故障。正確的回應不是放寬門檻,是縮小搜尋空間:先寫下經濟假設再碰資料,讓事前理由替你付掉一部分多重檢定的懲罰。搜尋空間從 1000 縮到 20,Holm 的門檻就從 0.00005 鬆回 0.0025,這比任何統計技巧都有效。
五種讓多重檢定校正失效的用法
工具本身很少出錯,出錯的幾乎都是餵法。五種最常見的:
餵進去的宇宙是事後篩過的。 掃了 2000 組,先憑肉眼刪到剩 20 組「有潛力的」,再把這 20 組交給 SPA。檢定看到的搜尋空間是 20,實際是 2000,輸出的 p 值從根上就是假的。宇宙必須是你碰過的全部,包括看一眼就丟的。
試驗次數靠事後回憶。 研究做完才來數 N,人會系統性少記自己丟掉的東西,低報一到兩個數量級是常態。計數器要在第一次碰資料之前打開,這條紀律在量化交易系統的建構框架裡屬於研究流程層,不是統計層。
工具購物。 Holm 沒過改跑 BH,BH 沒過改跑 SPA,直到某個檢定放行為止。每換一次工具就是多一次檢定,這行為本身就是一層沒被校正的多重檢定。工具要在看到結果之前選定,理由寫下來。
IID bootstrap 用在有記憶的報酬上。 報酬序列有自相關與波動聚集,逐點獨立重抽會把這些結構打散,虛無分布失真。要用區塊 bootstrap,而且區塊長度要做敏感度檢查:結論如果隨區塊長度翻面,那就不是結論。
把通過當成證明。 SPA 的 p = 0.03 只說明資料不支持「冠軍純靠運氣」,它管不到 regime 依賴、交易成本、容量限制、資料品質這些檢定之外的死法。統計校正是回測過擬合九種死法裡的一道牆,不是整座城。
結論:校正不是儀式,是把「怎麼選的」寫進數學
收攏成五句話:
- 校正工具是跟著錯誤率走的:FWER 管「一個都不能錯」,FDR 管「錯的比例」,資料窺探檢定管「冠軍是不是運氣」。先選問題,再選工具。
- 同樣的保證下 Holm 一律優於 Bonferroni,沒有理由再用後者。
- BH 給的是批次陳述,篩出來的是候選池,不是投產名單。
- 策略之間高度相關時,p 值校正會系統性過罰,Reality Check 與 SPA 用 bootstrap 把相關結構帶進推論,是回測場景裡更誠實的預設。
- 所有校正共用一個前提:宇宙完整、N 誠實、工具事前選定。餵法錯了,算法再對也是假的。
多重檢定校正真正校正的不是 p 值,是你的敘事權:它強迫「我試了幾次、怎麼選的」這件事離開記憶、進入數學。一支策略在付清全部搜尋成本之後還顯著,才輪得到討論投產。
我每週會把這類驗證框架與實際市場數據的交叉檢驗寫進電子報,包括流動性、衍生品結構與鏈上籌碼的例行審視。想讓自己的研究流程多一層濾網的,可以訂閱追蹤。
Meta Elements
Meta Title: 多重檢定校正怎麼做:Bonferroni、FDR 到 SPA 的選擇與判讀
Meta Description: 掃 200 組參數,純雜訊也有八成機率生出 p 值 0.008 的「顯著」。本文實作 Bonferroni、Holm、BH 到 SPA 四條多重檢定校正路線,附實算數字與選用判讀框架。
Primary Keyword: 多重檢定校正
Secondary Keywords: 多重檢定, Bonferroni 校正, FDR 控制, Benjamini-Hochberg, White's Reality Check, SPA 檢定, 資料窺探
URL Slug: /blog/multiple-testing-correction
Internal Links: /blog/selection-bias-multiple-testing, /blog/deflated-sharpe-ratio, /blog/quant-trading-system, /blog/backtest-overfitting, /#lab-benefits, adtrader.beehiiv.com
External Links: Benjamini & Hochberg 1995 (doi.org), White 2000 Reality Check (doi.org), Hansen 2005 SPA (doi.org)
Word Count: 約 3,400 字(中文字元)




