回測中的樣本內與樣本外測試|Traseq 部落格研究方法回測中的樣本內與樣本外測試
如何把加密貨幣歷史切成樣本內與樣本外期間、為什麼只在樣本內好看的策略多半過度擬合,以及如何在 Traseq 執行這個切分。
樣本內與樣本外測試,是區分「經過研究的策略」與「曲線擬合的策略」最簡單的紀律。您在一段歷史(樣本內)上建立並調整規則,再用一段建立時從未看過的後續歷史(樣本外)來驗證。如果策略只在您拿來調整的資料上好看,那您找到的不是優勢,而只是把過去背了下來。
這是一篇實務取向的方法論文章:用 BTC/USDT 歷史做一個切分的具體範例、如何在 Traseq 透過定版一個版本並跨不同日期範圍執行來做這個切分,以及一段關於樣本外測試能證明什麼、不能證明什麼的誠實提醒。
Traseq 是研究工作區,不是實盤交易或交易所執行平台。它不會下單、不會連結交易所帳戶,也不保證績效。
這兩個詞描述的是:在您建立策略的過程中,某一段歷史是如何被使用的。
把一個構想轉成可測試的版本。
從無程式的加密貨幣現貨策略開始,鎖定版本、執行回測,並讓結果保持可追溯以供比較。
- 樣本內(In-Sample,IS) 是您在建立與調整過程中看得到的資料。您調整的每一個參數——
SMA(200) 的週期、RSI 的門檻、停損幅度——都是在看著這段資料的情況下選定的。
- 樣本外(Out-of-Sample,OOS) 是您刻意留起來、在規則定案前都不去看的資料。它是保留期,是策略最終要交易的「未來」的替身。
這個邏輯借自任何一種誠實的模型評估。如果您用設計時所用的同一批資料來替策略打分數,分數一定是灌水的,因為那批資料早已引導了您的選擇。樣本外是策略連暗地裡都沒被訓練過的第一個測試。
它要防的陷阱就是過度擬合:把規則調得太貼合過去的雜訊,結果描述的是某一段特定歷史,而不是可重複的型態。關於這個失敗模式,請參閱 回測中的過度擬合。
假設您有兩年的 BTC/USDT 1d 歷史,大約是 2024-01-01 到 2025-12-31。一個乾淨的切分長這樣:
| 期間 | 日期範圍 | 角色 | 在這裡可以做的事 |
|---|
| 樣本內 | 2024-01-01 → 2025-06-30 | 建立與調整 | 調整移動平均週期、停損幅度、門檻;反覆執行多次 |
| 樣本外 | 2025-07-01 → 2025-12-31 | 僅供驗證 | 把定版的版本只跑一次;不要為它做調整 |
- 只用樣本內範圍來建立策略並調整每一個參數。
- 滿意之後,把規則凍結——不再做任何更動。
- 在您從未碰過的樣本外範圍上,執行這個凍結的版本。
- 比較。如果樣本內看起來很強、樣本外卻整個崩掉,那樣本內的結果多半是過度擬合。
合理的結果是出現一些衰退:樣本外幾乎總是比樣本內差一點,因為部分的樣本內擬合本來就是運氣。健康的結果,是策略仍維持可辨識的行為(方向相近、回撤型態相當),而不是反轉成虧損。
有一條紀律最重要:一旦您看過樣本外的結果,那批資料就「用掉了」。如果您回頭去重新調整來修飾樣本外的數字,這個保留期就不再是保留期,您只是隔了一層,又在做過度擬合而已。
Traseq 沒有專門的「切分」按鈕,也不需要。版本可追溯的工作流,讓您能用手動方式得到同樣的紀律:
- 用 Sentence 模式、Canvas 模式、模板或可重用 block 建立策略。看著樣本內日期範圍自由反覆調整。
- 停止調整後,把版本定版。定版的版本會被鎖定,規則不會在您不知情時悄悄漂移。
- 在樣本內日期範圍上執行回測。這是您的基準執行。
- 把同一個定版的版本,在樣本外日期範圍上再跑一次。同樣的交易對、同樣的時間框架、同樣的手續費與滑點,只更動日期。
- 把兩次執行都加入比較組,並排檢視。
因為兩次執行都指回同一個定版的版本,您可以證明它們用的是完全相同的邏輯——唯一不同的只是那一段歷史的範圍。這種可追溯性正是重點;關於為什麼定版的版本能讓這件事值得信任,請參閱 研究可追溯性與策略版本控制。
在比較組裡,看報酬、最大回撤、勝率與獲利因子能不能在兩段期間都撐住,還是策略只是被樣本內期間給扛起來而已。比較的判讀方式,請參閱 如何比較回測結果 與 比較指南。
Learn 上免註冊的互動 Demo,把三個系統模板跑在真實的 BTC/USDT 1h K 棒上(2024-11-03 到 2024-12-31)——這是一段在大漲之後、短暫且震盪的橫盤偏跌局面。在這單一期間裡,SMA(200) 趨勢過濾報酬為 -6.89%、Donchian 突破為 -10.27%,只有 RSI 均值回歸勉強以 +1.74% 接近損益兩平。
這兩個月的期間本身就是一種樣本外的提醒:策略在趨勢段看起來沒問題,到了震盪段卻可能淨虧損。這個 Demo 是固定的單一期間,不是「建立—驗證」的切分——但它正好說明了:單一一段好看的期間,永遠不足以當成證據。誠實的結果是回測的目的,不是需要藏起來的難堪。
單一的 IS/OOS 切分有一個弱點:您只得到一次樣本外的裁決,而它取決於您剛好挑到哪一段期間。前進測試(walk-forward testing)把這個概念延伸——讓切分沿著歷史往前滾動:在第 1 段調整、在第 2 段驗證,接著把兩段一起往前推、再重複。最後您得到的是一連串的樣本外結果,而不是只有一個。
在 Traseq 目前也能近似前進測試:把版本定版,讓它跑過數個連續的日期範圍,再把所有執行放進同一個比較組比較。這比專用工具更手動,但紀律——先凍結規則,再用沒拿來調整的資料測試——是一模一樣的。
樣本外測試是更強的測試,而不是保證。請對它的限制保持誠實:
- 它不預測未來。 保留期仍然是歷史資料。通過它,代表規則在那一段期間上一般化了,而不是代表它會繼續有效。
- 它可能被悄悄汙染。 您每偷看一次保留期、再去重新調整,就侵蝕它一次。請把它當成只能用一次。
- 它對您挑的期間很敏感。 趨勢市裡的單一 OOS 期間,對盤整環境幾乎什麼都沒告訴您。這正是前進測試存在的理由。
- 它修不了爛輸入。 樣本外測試的前提是乾淨、貼近現實的資料。它對前視偏誤或倖存者偏誤毫無作用——請參閱 前視偏誤與倖存者偏誤。
樣本外能給您的,是一個策略並非為了討好而設計出來的結果。比起只看樣本內的數字,這是明顯更高的門檻;在您願意對一個策略有任何信任之前,認真的研究都該先跨過它。
想親手試試這個切分嗎?先 執行互動 Demo,接著建立一個版本、把它定版,然後在 Traseq 跨兩段期間測試看看。
樣本內與樣本外測試有什麼差別?
樣本內是您在建立與調整策略時所用的歷史資料;樣本外是您留起來、等規則定案後才拿來測試的資料。樣本外是未來的替身,因此能在那裡有好表現的策略,並不是為了那段期間量身打造的。
為什麼只看樣本內的回測會誤導人?
當您拿替策略打分數的同一批資料來調整每一個參數時,結果會灌水,因為您的選擇早已被那批資料引導。策略可能在樣本內完美貼合過去的雜訊,卻在沒看過的資料上崩掉,這正是過度擬合的典型徵兆。
我要怎麼在 Traseq 執行樣本外回測?
先在樣本內日期範圍上建立並調整策略,把版本定版讓規則鎖定,再把同一個定版的版本跑在一段較後、未曾觸碰的樣本外日期範圍上。把兩次執行都加入比較組,看結果能否跨期間撐住。
什麼是前進測試?
前進測試讓樣本內/樣本外的切分沿著歷史往前滾動:在某一段調整、在下一段驗證,再把兩段一起往前推、重複進行。它產生的是一連串的樣本外結果,而不是單一裁決,因而減少對單一一段所挑期間的依賴。
通過樣本外測試,是不是就代表我的策略有效?
不是。樣本外測試是更強的測試,而不是保證。保留期仍然是歷史資料,它對您挑的期間很敏感,也修不了前視偏誤或倖存者偏誤——所以請把它當成證據,而不是證明。
回測指標|勝率、獲利因子、夏普比率:該先看哪一個?