回測勝率92%、實盤三個月歸零:一張對帳單,揭開竹工程師的「過度最佳化」陷阱
程式交易最危險的不是市場,是那條漂亮到不真實的回測曲線。
假設有一位在竹科工作的工程師,我們姑且叫他阿哲。月薪12萬、年薪加上分紅超過200萬,寫了十年C++,去年決定把職業技能帶進期貨市場:用Python串接永豐金證券的Shioaji API,透過Telegram Bot接收部位警示與停損通知,自動下單台指期。三個月後,帳戶淨值歸零。
問題不在程式。他的程式碼乾淨、邏輯嚴謹、斷線重連都處理好了。問題在那張回測報告:三年資料、勝率92%、最大回撤不到8%、夏普比率逼近4。
這種數字,在量化圈有個通俗的說法——太漂亮了,漂亮到像是在考試前看過考卷。
關鍵一:92%勝率,是「挑參數挑出來的」
阿哲用的是常見的開源回測框架Backtrader,策略本身不複雜:均線交叉加RSI過濾,進出場規則明確。真正的災難發生在最佳化階段。他把均線週期從5天掃到60天、RSI門檻從20掃到40,每個組合跑一次回測,最後挑出表現最好的那一組參數。
這在統計上叫多重比較問題。假設你測試了500組參數,就算策略本身毫無預測能力,純靠運氣也會出現幾組「看起來很賺」的組合。Backtrader內建的參數掃描功能讓這件事變得太容易——工具沒有錯,錯的是把「歷史資料上的最佳解」直接當成「未來的最佳解」。
業內普遍的做法是樣本外測試:用2019到2021年的資料挑參數,再用2022到2023年、策略從沒「見過」的資料驗證。阿哲跳過了這一步,因為Telegram頻道上的分享文也多半跳過這一步。
關鍵二:倖存者偏差,藏在每一行精心篩選過的資料裡
第二個坑更隱微:look-ahead bias(前視偏差)。台指期某種過濾條件用到「當日收盤價」,但收盤價在盤中根本還沒發生——回測引擎老實地照做,於是策略在歷史資料裡像是能預知未來。這類bug不會報錯,只會讓績效變好,所以特別難抓。
還有一個台灣散戶程式交易特有的坑:交易成本。台指期一口的手續費加交易稅,換算成點數大約是來回5、6點。短週期策略一天進出數次,成本會以一種回測報告上看不太出來的方式侵蝕獲利。阿哲的回測設了滑價,但設得太樂觀。
關鍵三:歸零的不是策略,是槓桿
期貨的原始保證金制度,讓12萬本金可以操作名目價值超過百萬的部位。回測裡8%的回撤,在實盤加了槓桿、遇到一次台指期單日波動超過2%的日子,就是斷頭的距離。加上程式停損設在固定點數、沒有隨波動度調整,三月那一週的連續跳空,把三個月的帳面獲利連同本金一次收回。
數學上這叫路徑依賴:回測報酬率是路徑的加總,但帳戶存活取決於路徑上最深的那一個坑。
解方不神祟,但沒人想做
走樣本外測試、用Walk-forward Analysis讓參數定期滾動重估、把參數從「一個最佳解」改成「一個平坦區間」(如果參數稍微偏移績效就崩掉,那組參數本身就是脆弱的)、回測成本抓實盤的兩倍——這些都是量化圈的常識,也都很無聊。它們不會讓勝率變成92%,只會讓勝率回到55%附近,然後讓你有機會真的活在市場裡。
阿哲的故事是假設的,但歸零的帳戶每天都在真實發生。開源工具把門檻降到了工程師的一個週末,卻沒有把風險知識一起打包進pip install。
下一個打開Backtrader、覺得自己回測曲線漂亮到可以辭職的人,會不會就是你?
🛠️ CULTIVATE Recommended Tools | 精選工具推薦
- Codecademy: Learn Python and Data Science interactively from scratch.
Disclosure: CULTIVATE may earn a commission if you purchase through these links.