回測入門:驗證策略的科學方法
「這個策略很厲害,我看圖看出來的!」這是台股討論區最常出現的句子。但「看出來」和「統計驗證」之間,有一道深深的鴻溝。人類的大腦極擅長在雜訊中找到「規律」,即使那個規律根本不存在——心理學家稱之為模式識別偏差(Pattern Recognition Bias)。
回測(Backtesting) 就是為了解決這個問題而存在的。它的核心思想非常簡單:用過去的歷史資料,模擬你的策略如果在當時被執行,結果會是如何。如果策略在過去有效,那麼(在一定假設下)它在未來也可能有效;反之,如果策略在過去就表現欠佳,那麼拿真錢去賭它,大概率是賠錢的。
然而,回測並不是萬靈丹。許多投資人做了回測,卻因為方法不當、陷入各種統計陷阱,最終得出誤導性的結論。本文將帶你從零開始理解回測的正確做法,以及那些你必須避開的致命坑洞,讓你的策略驗證過程真正有意義。
回測的基本流程
一個嚴謹的回測過程包含以下六個步驟:
步驟一:明確定義策略規則
在開始任何回測之前,你必須把策略「完全書面化」,也就是用清晰、無歧義的語言或程式碼描述每一個決策點:
- 進場條件:什麼時候買進?(例如:5 日均線向上穿越 20 日均線,且成交量為前五日均量的 1.5 倍以上)
- 出場條件(停利):什麼時候獲利了結?(例如:股價上漲 8% 後出場)
- 出場條件(停損):什麼時候認輸出場?(例如:股價下跌 4% 後出場)
- 部位規模:每次買多少股?固定金額還是固定比例?
- 同時持有股數上限:最多持有幾支股票?
- 是否考慮除息日、停牌日等特殊情況?
關鍵原則:規則必須在回測開始前就全部定義好,不能在看到回測結果後再回頭修改。這是最常見的「事後偏差」來源。
步驟二:準備乾淨的歷史資料
資料品質直接決定回測結果的可信度。台股回測常用的資料來源包括:
| 資料來源 | 特色 | 適用情境 |
|---|---|---|
| 台灣證券交易所(TWSE)官網 | 免費,有日 K 資料 | 初階回測 |
| Yahoo Finance Taiwan | 免費,Python 可直接抓取 | 個人研究 |
| 財報狗、CMoney API | 付費,資料較完整 | 進階回測 |
| TEJ 台灣經濟新報 | 學術級資料,最完整 | 機構/學術研究 |
資料清洗要點:
- 處理股票分割、配股除息的還原(調整後收盤價)
- 排除已下市股票(避免倖存者偏差,詳見後文)
- 確認節假日、停牌日的處理方式
步驟三:選擇適當的回測期間
回測期間的選擇至關重要。太短的回測期間樣本數不足,統計意義低;太長的期間可能包含市場結構已根本改變的時代。
建議:
- 至少涵蓋 一個完整的多空循環(台股大約 3-7 年)
- 盡量包含至少一次大幅修正行情(例如 2008 金融海嘯、2020 新冠急跌、2022 熊市)
- 若策略是日線操作,至少需要 3-5 年資料,取得 100 筆以上有效交易
步驟四:執行回測並記錄每筆交易
回測工具的選擇因技術能力而異:
- Excel / Google Sheets:手動計算,適合簡單策略,耗時但直觀
- Python(backtrader, zipline, vectorbt):自動化回測,靈活強大,需要程式基礎
- TradingView Pine Script:在圖表上直接回測,視覺化效果好
- 專業平台(如 MetaTrader、QuantConnect):功能完整,學習曲線較高
每筆交易記錄應包含:進場日期、進場價格、出場日期、出場價格、獲利/虧損金額、獲利/虧損百分比、持有天數。
步驟五:分析回測績效指標
單看「總報酬率」是不夠的,必須評估多個面向:
| 指標 | 說明 | 參考標準 |
|---|---|---|
| 年化報酬率 | 平均每年報酬 | >15% 算良好 |
| 勝率 | 獲利交易佔比 | 因策略而異,不是越高越好 |
| 盈虧比 | 平均獲利/平均虧損 | >1.5 為佳 |
| 最大回撤(MDD) | 峰值到谷底的最大跌幅 | <20% 為佳 |
| 夏普比率 | 超額報酬/波動度 | >1.0 算合理 |
| 卡爾瑪比率 | 年化報酬/最大回撤 | >1.0 算合理 |
| 交易筆數 | 足夠的樣本數 | 至少 50-100 筆 |
步驟六:進行樣本外驗證
這是最關鍵也最常被忽略的步驟。將歷史資料分成兩段:
- 樣本內資料(In-Sample):用來開發和優化策略(例如 2015-2020 年的資料)
- 樣本外資料(Out-of-Sample):保留起來,等策略定稿後才用來驗證(例如 2021-2024 年的資料)
如果策略在樣本外資料上仍然表現良好,可信度大幅提升;若樣本外表現遠遜於樣本內,則很可能是過度最佳化(詳見後文的「過擬合」問題)。
台股回測實例:20 日均線穿越策略
讓我們用一個具體例子走過完整回測流程。
策略定義:
- 標的池:台灣 50 成分股
- 進場:5 日均線向上穿越 20 日均線(黃金交叉),且當日成交量 > 10 日均量
- 停利:股價上漲 10%
- 停損:股價下跌 5%
- 部位規模:每筆投入資金 5%(20 等分)
- 同時最多持有 5 支股票
回測期間:2018 年 1 月 ~ 2023 年 12 月(含 2020 年新冠崩盤、2022 年熊市)
假設回測結果如下:
| 指標 | 結果 |
|---|---|
| 總交易筆數 | 187 筆 |
| 勝率 | 43% |
| 平均獲利 | +9.2% |
| 平均虧損 | −5.1% |
| 期望值/筆 | +1.04% |
| 年化報酬率 | 14.7% |
| 最大回撤 | −18.3%(2022 年) |
| 夏普比率 | 0.93 |
這個策略整體表現合格——勝率不高但期望值為正,最大回撤在可接受範圍,年化報酬超過大盤長期平均。但在下結論之前,我們還需要進行樣本外驗證,並且仔細檢查是否存在以下常見陷阱。
回測常見陷阱:讓你的結論失真的六大元凶
陷阱一:前視偏差(Look-Ahead Bias)
定義:在回測中使用了「當時不可能知道」的未來資訊。
台股常見範例:
- 用「當日收盤價」決定當日進場,但實際上收盤才知道收盤價,無法在收盤時同時成交
- 用「當日最高價」或「當日最低價」決定停損,但日內無法精確在最高/最低點操作
- 財報數據在公告後才能使用,但回測卻用了「公告前」就已知道的財報數字
修正方式:使用「下一日開盤價」進出場,模擬「看到訊號後隔天才能執行」的真實情境。
陷阱二:倖存者偏差(Survivorship Bias)
定義:只用「現在還存在」的股票做回測,忽略了在回測期間已經下市、合併或重組的股票。
影響:現在還存在的股票,往往是表現較好的股票。如果只對這些股票回測,會人為地拉高策略的勝率和報酬,因為你排除了所有最終消滅的輸家。
台股現實:台灣每年都有若干股票下市(財務危機、主動申請下市、SPAC 合併等)。2015 年台灣上市公司家數約 860 家,如果只用 2024 年現有的 970 家公司去做 2015 年的回測,就已經排除了那些在這 9 年間倒閉的公司。
修正方式:使用包含已下市股票的完整歷史股票池,或者至少只對大型績優股(倒閉風險較低)進行回測,並在解讀結果時承認此限制。
陷阱三:滑價與交易成本未計入
定義:真實交易中,進出場的實際成交價通常與你預期的「訊號觸發價」有所差距(稱為滑價),加上手續費和交易稅,實際報酬低於回測結果。
台股交易成本(以日線交易為例):
- 買進手續費:約 0.1425%(券商可打折至 0.05% 左右)
- 賣出手續費:約 0.1425%
- 證券交易稅(賣出時):0.3%
- 單次來回總成本:約 0.6%(含折扣手續費)
如果你的策略每筆平均獲利只有 2%,交易成本就佔了 30%,實際獲利大幅縮水。短線策略(幾天就進出一次)受交易成本影響最大。
修正方式:在回測程式中明確加入交易成本,包括手續費、交易稅,以及每筆設定 0.1-0.3% 的滑價假設。
陷阱四:流動性假設問題
定義:回測中假設你能在任何時間以任何數量成交,但現實中小型股的流動性有限,大量買進會推高股價,大量賣出會壓低股價。
台股情境:某支市值 10 億元的小型股,日成交量只有 500 萬元。如果你的策略要投入 200 萬元買這支股票,相當於買進該股四成的日成交量,市場衝擊成本極高,回測中的「漂亮進場價」根本無法在現實中實現。
修正方式:限制策略只交易流動性足夠的股票(例如每日成交金額 > 5,000 萬元),或者設定每筆投入金額不超過標的股日均成交量的 10%。
陷阱五:過度配適歷史(Over-fitting,過擬合)
這是最嚴重也最常見的問題,重要性足以單獨成文(本系列下一篇將詳述),在此簡要介紹:
當你對策略參數反覆調整,讓它完美「符合」歷史資料,你可能只是在「描述過去」而不是「預測未來」。例如,你不斷嘗試各種均線組合(3/15、5/20、8/21、10/30……),直到找到在歷史資料上表現最好的那組,但這組參數可能只是巧合地「記住」了歷史,在未來的新資料上效果可能很差。
陷阱六:心理執行差距(Implementation Gap)
即使回測完美,真實交易中你還面臨一個無法在電腦上模擬的挑戰:你的心理狀態。
回測中的「停損」是自動執行的,但真實交易中,當你看著股票跌到停損點時,「再等一下」的念頭會無比強烈。這種差異會讓真實交易的平均虧損遠大於回測中的數字,嚴重侵蝕期望值。
如何進行有效的前向驗證(Walk-Forward Testing)
比單純的樣本外測試更嚴謹的做法是滾動式前向驗證(Walk-Forward Optimization):
- 取前 3 年資料(樣本內)優化策略參數,找出最佳設定
- 用接下來 1 年資料(樣本外)驗證這組參數的真實表現
- 滾動往前一年,重複步驟 1-2
- 比較每段樣本外期間的表現,評估策略的穩健性
這個方法能更真實地模擬「邊學邊用」的真實投資過程,也能發現策略是否只在特定市場環境(如大多頭)才有效。
台股回測的實用工具推薦
免費工具
- TradingView(免費版):圖表回測,Pine Script 可寫自動策略,適合技術分析策略
- Python + yfinance + pandas:免費抓取台股歷史資料,程式化回測
- FinLab(台灣,有免費方案):專為台股設計的回測平台,內建財報資料
付費工具
- Tejwin(台灣經濟新報):學術級資料,含已下市股、財報資料,適合嚴謹研究
- FinMind(台灣開源,部分付費):API 形式提供台股資料,CP 值高
- CMoney:散戶常用,有視覺化回測功能,資料較完整
結語:回測是起點,不是終點
回測是把交易從「憑感覺」提升到「有依據」的重要工具,但它永遠只是決策的參考,而不是保證獲利的保證書。
一個好的回測告訴你:「在過去的歷史條件下,這個策略大概能賺多少、風險大約多大。」但未來的市場環境永遠和過去不完全相同——新的監管政策、市場結構變化、流動性條件改變,都可能讓一個「完美」的回測策略在現實中失靈。
因此,正確的態度是:用嚴謹的回測排除明顯不可行的策略,再以小部位真實驗證,觀察實際績效是否接近回測預期。只有當模擬與現實相符,才算是真正通過考驗、值得加大規模的策略。在台股市場中,這份嚴謹的態度,是散戶投資人與專業機構之間最核心的差距之一。