避免自我欺騙的回測
歷史模擬是研究工具,不是時光機,也不是實盤表現的承諾。

查看答案之前先寫下規則
回測將明確的決策規則應用於歷史數據,計算模型中的一系列交易本會產生甚麼結果。其價值在於用證據檢驗假設。如果每遇到虧損案例就修改規則,練習就變成描述過去,而非檢驗可重複的決策流程。
從交易品種範圍、觀察區間、入場條件、出場條件、倉位計算方法和成本模型開始。明確何時能獲得信息,以及訂單最早何時能成交。基於收盤價的策略,通常不能在缺乏進一步理由的情況下,假設自己提前知道最終收盤價,並恰好按同一價格成交。
警惕信息向過去洩漏
當模擬使用決策時尚不可得的信息,就發生了前視偏差。例如修訂後的經濟數據、之後的業績公告或未來的指數成分名單。歷史數據庫在今天可能完全準確,卻不適合重建某人在過去某日實際知道甚麼。
當測試範圍排除已消失的工具時,就會產生幸存者偏差。僅用仍然存續的公司測試策略,可能遺漏影響歷史機會集合的破產、退市及收購。失敗的加密代幣或已終止基金也會產生同樣問題。應記錄數據集如何處理消失的對象,而不是悄悄刪除難處理的記錄。
公司行動需要單獨核對。一次一拆二的拆股,會把每股四十美元的一百股變成每股約二十美元的兩百股,暫不考慮其他價格變化。拆股本身不會讓持倉價值減半。將還原權息價格與未調整股數混用,會憑空製造盈虧。如果收益序列已經包含股息再投資,再加一次現金股息也會重複計算。應分別說明訊號使用的價格、實際可交易價格和持倉記帳方法。
將執行建模,而不是假定市場會幫忙
蠟燭圖觸及限價,並不證明你的整筆訂單都會成交。排隊位置、可用數量和蠟燭圖內部價格路徑都很重要。如果同一根 K 線同時觸及止損和目標,僅憑該 K 線可能無法確定先後順序。應保守處理這類模糊情況,或使用能確定順序的數據。
納入價差、傭金、融資費用、適用時的借券成本,以及合理的滑點。稅務處理取決於司法管轄區和具體情況,因此通用模擬應說明結果是否為稅前,而不是編造一個通用稅率。比較多種成本假設下的結果。只有在免費且瞬時成交時才成功的方法是脆弱的。
區分發現與評估
嘗試數百種參數組合併展示最佳一種,會產生選擇問題。某種組合可能僅憑運氣就顯得極好。應保留未用於開發規則的數據,避免反覆查看這份留出數據,直到它變成另一個訓練樣本。前向紙面測試提供另一種檢驗,因為新觀察是在規則固定之後才到來的。
報告失敗的變體、樣本量、日期範圍和試驗次數,而不只是獲勝的圖表。考察相鄰參數選擇的表現是否相似,還是某個孤立設定貢獻了全部利潤。即使電子表格精確到多位小數,假設結果仍是假設結果。歷史算術無法完整再現流動性、情緒和操作問題。
保留數據版本和計算變更的研究日誌。修正拆股調整或新納入一個退市案例,都可能顯著改變結果,而這些修正應保持可見。可復現性意味著他人能根據所述輸入與規則重建同一答案。這不代表答案在經濟上有用,但卻是判斷其是否有用的必要步驟。
先還原一筆交易,再相信一千筆結果
挑選一筆代表性交易,重建完整時間線:資料標註日期、真正可獲得的時間、作出決定、訂單到達市場、各次成交以及收費。這些時間不能互換。週二收盤後發佈的公告,不能支持週二上午的決策。時區轉換和夏令時切換,也可能使一條看似合理的規則悄然使用未來資訊。
接著核對整個帳戶,而不只是已平倉交易清單。期初現金、外部資金流、已實現盈虧和未平倉部位的市值,應能解釋期末權益。只統計已平倉結果,可能讓已兌現利潤顯眼,卻把巨額浮虧留在報告之外。多個同時出現的訊號也不能各自花掉同一筆可用現金。模擬器必須規定訂單爭用資金、購買力不足及樣本結束時仍有持倉的處理方法。
用結果已知的小型人工資料測試程式。沒有費用且價格恆定時,交易不應創造利潤;純粹拆股在股數正確調整後應保持財富不變。固定交易清單後提高傭金,淨利潤應恰好減少新增費用。缺失價格必須觸發有記錄的處理規則,而不是悄悄按零成交,或無限期沿用過時報價。
最後,選擇真正回答研究問題的比較基準。只做多股票的規則可能僅僅因為市場上漲而盈利。應在相同日期,與明確定義的被動曝險比較,並一致處理股息和現金。部分時間空倉也改變風險曝險及機會成本。期末餘額更高是需要解釋的證據,不是擇時能力存在的自動證明。