先講結論:複雜度本身不構成問題,透支才是。
一支有 12 個自由度的策略可以是安全的,一支只有 3 個的可以是危險的。差別不在數字大小,在這份樣本付不付得起。多數人討論「這支策略是不是太複雜」時,用的是美感和直覺,講完誰也說服不了誰。自由度預算做的事情,是把這場品味之爭換成一筆三分鐘能算完的帳。
過度優化:量化交易策略的隱形殺手那篇把自由度預算列為六項事前紀律之一,但只用了一段帶過。這篇把它拆完整:預算上限怎麼定、為什麼不同自由度的價格不一樣、名額怎麼分配、超支之後有哪四種買法(其中一種是假的),以及這套帳擋不住什麼。
讀完你會有一張可以在上線前填完的表。填出來的數字通常不好看,但它比實盤帳單便宜。
自由度預算是什麼:把複雜度從美學問題換成會計問題
自由度預算是一筆對照:把這份樣本撐得起的自由度數量,跟策略實際用掉的數量放在一起比,差額決定你還能不能再加規則。定義兩件事就夠了。
預算上限是這份樣本能支撐的自由度數量。它由你的有效證據量決定,跟你的策略想有多聰明無關。
已花費是你實際用掉的自由度。每一個可調參數、每一條規則的存在與否、每一次看著回測結果做的決定,都在花同一份有限的統計證據。
把兩個數字放在一起,策略複雜度就有了單位。超支率等於已花費除以預算上限,大於 1 就是刷爆。這件事的價值不在精確,在於它讓「要不要再加一個濾網」這種問題有了答案的形狀:加得起就加,加不起就得先刪一個。
沒有預算的研究,加規則是免費的。感覺上只是多寫三行程式,帳面上樣本內績效還變好了。成本要到實盤才會出現,而那時候你已經分不清是哪一行造成的。
第一步:算出預算上限,分母是交易次數不是 K 線數
自由度預算的上限算法很粗:有效交易數除以每個自由度需要的交易數。
Pardo 在 The Evaluation and Optimization of Trading Strategies 給的實務量級是每個自由度數十筆獨立交易。抓 30 到 50 這個區間,得到一張很直白的表:
| 有效交易數 | 保守預算(÷50) | 寬鬆預算(÷30) |
|---|---|---|
| 100 | 2 | 3 |
| 300 | 6 | 10 |
| 1,000 | 20 | 33 |
| 3,000 | 60 | 100 |
麻煩的地方在分子。能當證據的是交易次數而不是 K 線根數,這個換算多數人做過一次。真正會出錯的是下一層:交易次數本身也不能直接拿來除,它要先過兩道折扣,而多數人一道都沒扣。
第一道是群聚。交易在時間上會擠在一起,同一段行情裡連續觸發的五筆,提供的獨立資訊遠不到五筆。折算可以粗一點:看交易的時間分佈,如果七成集中在佔樣本一成的高波動時段,就按平均連續串長往下折。
第二道是市場狀態的數量。樣本裡有 800 筆交易,但全部落在同一段趨勢行情裡,你其實只觀察到一種環境下的表現。可用的作法是把預算再打對折,直到樣本至少涵蓋兩種明顯不同的市場結構。
阿凱的例子是標準情況。一支 BTC 四小時趨勢策略,三年樣本,420 筆交易,帳面自由度 10 個,420 除以 10 等於 42,看起來安全過關。攤開時間分佈之後,交易明顯群聚,折算下來有效交易數大約 260。預算上限用寬鬆的除數是 8 到 9 個。
這時候他的策略還是 10 個自由度,剛好卡在線上。真正的問題出在下一步:那 10 個自由度不等價。
第二步:自由度不是等價的,記帳要按價格
同樣叫「一個自由度」,統計代價差很多。這件事在傳統的計數法裡被抹平了,而抹平的方向對你不利。
過度優化的五個可觀測警訊那篇把所有自由度一起記,理由寫得很清楚:保守起見,反正誤差方向對你不利。那個作法拿來體檢剛好,因為體檢只需要否決。要編預算就不夠用,預算要決定的是刪哪一個,而刪哪一個取決於價格。
一個事前寫定、有經濟理由、而且十支策略共用的停損倍數,跟一個看著回測結果從 1.8 調到 2.3 的閾值,不該記同一筆。前者的取值不是從這份資料長出來的,後者是。
我用的加權表長這樣:
| 自由度類型 | 記幾單位 | 為什麼 |
|---|---|---|
| 事前寫定、有經濟理由、跨策略共用 | 0.5 | 取值不來自這份資料,搜尋空間受限 |
| 一般連續參數(有掃描格點) | 1 | 基準 |
| 二元開關(規則加不加、濾網要不要) | 1.5 | 離散跳躍,沒有鄰域可以檢查是不是平原 |
| 看了結果才定的資料決定(起訖點、標的、異常值處理) | 2 | 這是在最佳化整份樣本,而且通常不留紀錄 |
| 每個標的各調一組參數 | 乘以標的數 | 參數沒共用,證據也就沒共用 |
表裡最貴的那兩列有正式名稱。統計學上叫研究者自由度,指的不是策略的參數,是研究者在分析過程裡做的選擇。它們貴的原因是同時吃兩份資源:既進了模型,又幾乎不留紀錄。
先把這張表的地位講清楚:這些權重不是估計出來的常數,是排序工具。 1.5 和 2 沒有理論推導,換成 1.3 和 2.5 結論不會反過來。它唯一的功能,是讓便宜的自由度和貴的自由度在同一張表上不再長得一樣。
回到阿凱。他的 10 個自由度攤開來是:5 個掃描出來的連續參數(記 5)、3 個規則開關(記 4.5)、資料起點選在 2023 年因為「FTX 之後市場結構才正常」(記 2)、標的只做 BTC 因為其他標的試過都不行(記 2)。加權後是 13.5,不是 10。
預算上限 8 到 9,已花費 13.5,超支率 1.5 到 1.7。這支策略的回測 Sharpe 是 1.9,數字漂亮,但它的漂亮有一半以上沒有樣本支撐。
從 42 到 1.6 這中間隔了兩次計算,一次是交易群聚折算,一次是自由度加權。兩次都不需要新工具,只需要願意誠實填表。
第三步:分配,每個自由度要競爭那個名額
預算上限固定之後,管理規則只有一條:想加一個,先刪一個。
這條規則的作用不在數字本身,在於它逼每個自由度去競爭存在的資格。沒有這條規則,新想法永遠是淨增加,策略只會單調長胖。
去留的判準用樣本外的邊際貢獻。逐條把規則拿掉,重跑樣本外,看績效掉多少。掉很少的那些,扛的是樣本內的裝飾,不是 edge。
老徐的策略是這個流程的好例子。一支 BTC 永續合約的資金費率策略,14 個自由度,樣本 900 筆交易,樣本外 Sharpe 1.40,他自己也覺得規則太多,但每一條都有故事,砍不下手。
我們做了一輪 ablation 測試:逐條拿掉,各自重跑樣本外。結果是 6 條濾網合計只貢獻 0.15 的 Sharpe,其中兩條的貢獻是負的。砍到 7 個自由度之後,樣本外 Sharpe 落在 1.31,Walk-Forward Efficiency 從 0.42 升到 0.68,各段之間的離散度明顯收斂。
績效幾乎沒掉,穩定度大幅改善。這是預算管理最常見的結果形狀:你砍掉的東西,本來就只在樣本內存在。
老徐後來說了一句話我覺得很準:那六條規則不是為了賺錢加的,是為了讓權益曲線看起來順眼加的。這種動機在當下完全感覺不出來。
這一輪 ablation 加上自由度加權記帳,一支策略大概要跑半天。我們在 Lab 社群裡會拿成員自己的策略把這套表逐格填完,想知道手上那支的超支率是多少的,那裡是合適的地方。
第四步:超支了怎麼辦,四種買預算的方法
超支不代表策略必死,代表你要嘛降低花費,要嘛去買更多預算。買法有四種,前三種是真的。
拉長樣本。 最直覺,也有上限。往前接的資料,市場結構可能已經不同,2019 年的 BTC 和現在不是同一個東西。加進來的樣本換到的預算要打折,而且你很難知道折幾成。這是加密市場先天的限制,可用歷史就是這麼短。
橫向擴充標的,參數共用。 這是四種裡效率最高的。同一組參數跑 10 個標的,自由度數量不變,樣本量往上跳。前提是標的之間的相關性夠低,否則帳面樣本增加 10 倍,有效樣本可能只增加 2 倍。加密市場的相關性在恐慌時會集體衝到 0.9 以上,所以這個折扣要抓得保守,加密回測的選擇偏誤那篇有把相關性換算成有效獨立數的算式。López de Prado 在 Advances in Financial Machine Learning 裡對樣本重疊與有效樣本量的處理,值得拿來校準這個折扣。
用先驗把參數釘死。 把可調參數變成常數,花費直接下降。條件很嚴:釘死的理由不能來自這份資料。停損設在 2 倍 ATR,因為這是你所有策略統一的風控標準,這是真的省。因為掃出來 2.1 表現最好、然後四捨五入成 2,這是把優化包裝成先驗,一分錢都沒省到。
把自由度藏進前處理。 這是假的。把濾網搬進特徵工程、把停損搬進「風控模組」、把標的篩選搬進「universe 定義」,策略檔案裡的參數變少了,帳面複雜度下降,真實花費完全沒變。判別法只有一條:那個決定是不是看著這份資料的結果定的。是的話,不管它寫在哪個檔案裡,都要記帳。
第四種之所以危險,是因為它有效。策略看起來變乾淨了,超支率的數字也真的下降,而你並沒有主觀上想騙誰。這類自己騙自己的路徑還有幾條,過度優化隱形機制那篇拆過四種。
二階效應:預算表和嘗試次數是兩本不同的帳
量化回測要記的帳有兩本。自由度預算管的是模型多大,嘗試次數管的是你找了多久,兩本都要記,而且不能互相替代。
一支只有 2 個參數的策略,如果你在這 2 個參數上掃了 500 組組合,預算表會全綠,過擬合機率照樣可以很高。反過來,一支 15 個自由度、但只跑過一次回測的策略,嘗試次數是 1,超支率卻爆表。兩種都會賠錢,賠的機制不一樣。
兩本帳在下游會合流。Deflated Sharpe Ratio 和 PBO 這類修正工具吃的是嘗試次數,但自由度越多,同樣的掃描次數搜過的空間就越大,每次嘗試帶來的資訊含量越低。Bailey 等人在 The Probability of Backtest Overfitting 裡的核心結論可以借過來用:模型的彈性和搜尋的強度是同一個問題的兩個面向。
實務上的順序建議是先壓自由度,再算修正。反過來做的話,你是在替一個超支的模型計算精確的顯著性,精確度用錯地方,比不算更容易產生信心。
這套預算表擋不住什麼
四條邊界,說誠實一點。
記帳永遠是低估值。 你記不得所有丟掉的嘗試、所有腦內否決的想法、所有看了圖之後才收窄的參數範圍。這張表的用途是排序和否決,不是精算。看到超支率 1.6 就別再爭論它到底是 1.5 還是 1.7。
門檻不是常數。 30 到 50 來自實務經驗,不是定理。策略的訊號噪音比、交易的獨立程度、報酬分佈的厚尾程度都會影響真正該用的數字。這個門檻的功能是排序,不是通關標準。
低自由度不等於安全。 前面那個掃 500 次的例子就是。預算表全綠只代表一件事:你的模型大小和樣本相稱。它不保證你沒有把雜訊當訊號。
資料層的錯誤跟複雜度無關。 未來函數、幸存者偏誤、錯誤的時間對齊,會生出一支自由度只有 3、預算表漂亮、但績效在資料層就是假的策略。這一類要靠獨立的資料稽核。Bailey 等人在 Pseudo-Mathematics and Financial Charlatanism 裡的批評對這種情況同樣成立:形式上的嚴謹擋不住輸入端的錯誤。
還有一條更基本的:預算管的是統計風險,不管經濟合理性。一支自由度只有 2、樣本充足、但假設本身就錯的策略,這張表不會有任何反應。
上線前把這張表填完
六格,填完再決定要不要上線。
| 欄位 | 怎麼填 |
|---|---|
| 有效交易數 | 總交易數,按群聚與市場狀態數折算 |
| 預算上限 | 有效交易數 ÷ 30 到 50,狀態單一再打對折 |
| 加權已花費 | 按價格表逐項記,含丟掉的嘗試 |
| 超支率 | 已花費 ÷ 預算上限 |
| 最貴的三個自由度 | 通常是資料決定和二元開關 |
| 下一個要刪的候選 | 樣本外邊際貢獻最小的那個 |
最後一欄是這張表最有用的地方。它讓「策略要不要簡化」不再是一個需要下決心的問題,而是一個已經有答案的問題,答案就寫在那裡,等你哪天想再加一條規則的時候用。
結論:先算付得起幾個,再談要哪幾個
自由度預算的五個重點:
- 複雜度要有單位才能討論。 預算上限、加權已花費、超支率,三個數字就夠,剩下的都是感覺。
- 分母是有效交易數。 K 線根數不是證據,交易次數才是,而且要按群聚和市場狀態折算。
- 自由度不等價,要定價。 事前寫定的參數便宜,看著結果做的資料決定最貴,二元開關比連續參數貴。
- 加一個先刪一個。 這條規則的價值在於逼每個自由度競爭名額,而不在預算數字本身。
- 超支有四種買法,第四種是假的。 把自由度藏進前處理不會降低成本,只會降低你的警覺。
這套帳最誠實的地方,是它不告訴你策略會不會賺錢。它只告訴你,你的回測數字裡有多少比例是樣本撐得起的。這個問題比績效問題無聊,但它決定了績效問題值不值得問。
我每週會把這類研究紀律與市場數據的交叉檢驗寫進電子報,包括流動性、衍生品結構與鏈上籌碼的例行審視。想讓自己的研究流程多一層濾網的,可以訂閱追蹤。




