回測中最危險的時間錯誤,即使時間戳稽核完美無缺也可能躲過檢查。兩個事件都標記為 10:00:00.000,實際發生順序仍可能和模擬器猜測的不同。
只要策略會對已完成的 K 棒以外的事件做出反應,這點就很重要:報價更新、成交、資金費率通知、交易所狀態變更,或是你自己的訂單確認。時間戳告訴你事件被標記為何時發生,但不一定能說明你的策略何時才能據此採取行動。
事件排序會帶來什麼差異?
想像一個策略:當最佳賣價跌破 $100.00 時買進。同一毫秒內,資料流記錄了賣價更新至 $99.99,以及一筆成交價為 $99.99 的交易。如果回測先處理成交、再處理報價,策略就會看到新的賣價並送出訂單。若先處理報價,結果也可能合理,前提是該事件當時確實已可取得。但如果成交在你的訂單抵達前就消耗了顯示出的流動性,那麼以 $99.99 成交就只是虛構。
只按時間戳排序,會讓模擬器自行決定時間相同事件的順序。檔案順序、商品代號順序,或資料庫的查詢計畫,都可能意外成為執行規則。即使底層資料完全沒變,權益曲線仍可能不同。
有個方法能看出這種排序有多隨意:把時間相同的事件按商品代號排序,而非按抵達順序排序。如此一來,多資產策略的表現可能只因某個代號排在另一個之前就有所不同。
回測應保留哪些時鐘?
市場資料和訂單處理往往涉及幾種不同的時間。保留資料來源提供的欄位,並精確說明各欄位代表的意義。許多資料流同時提供交易所時間戳和本機接收時間,兩者都很有用;但沒有一種時間能普遍代表所有參與者看到事件的時刻。
| 時鐘 | 記錄內容 | 單靠它無法證明的事 |
|---|---|---|
| 交易所事件時間 | 交易場所表示事件發生的時間 | 其他資料流或你的程式觀察到事件的順序 |
| 接收時間 | 你的資料收集器收到訊息的時間 | 策略完成處理訊息的時間 |
| 決策時間 | 程式評估訊號的時間 | 報價中的價格當時仍可成交 |
| 訂單抵達時間 | 交易場所能對訂單採取行動的時間 | 成交,除非撮合規則和流動性能支持成交 |
若歷史資料沒有接收時間,就明確說明你的假設。回測可以依序處理交易所事件,並假設從決策到訂單抵達需要固定 5 ms。這是模型假設,不是還原出的歷史紀錄。如果沒有相同交易所時間戳事件的序號,平手時採用的排序規則也是一種假設。
如何建模時間相同的事件?
首先,保留來源提供的序號。相較於時間戳,序號能更可靠地排列同一資料流中的事件;不過,不同頻道或商品可能各自使用不同的序號範圍。
接著,明確訂定模擬器的處理規則。對每個事件,都要決定它是否能更新策略掌握的資訊、改變可用流動性、觸發訂單,或確認訂單。這些是不同的動作;把它們全都簡化成「處理一列資料」,就會讓不可能的成交悄悄混進來。
- 只套用策略做決策時已抵達的市場資訊。
- 產生訂單,再將時間推進至模型設定的訂單抵達交易所時間。
- 訂單抵達後,才允許依照該訂單類型的成交假設,與符合條件的流動性撮合。
- 記錄每筆模擬成交所用的輸入資料、事件順序和延遲。
對以 K 棒為基礎的策略來說,這些處理可能超出問題所需。如果訊號使用已完成的 1-minute K 棒,並在下一根 K 棒開盤時成交,且採用保守的成本模型,那麼毫秒以下的事件排序可能不會改變研究結論。重點是,時間細節要符合回測所要支持的主張。
沒有抵達時間資料,回測還可信嗎?
仍然可以使用,但要清楚說明它的適用範圍。如果策略交易速度慢、風險限額寬鬆,幾毫秒的差異可能無關緊要。如果策略會對轉瞬即逝的報價做出反應、爭取佇列位置,或依賴跨交易所的領先落後訊號,缺少抵達時間就可能攸關結果。
批評者指出,精確的事件時間可能製造出虛假的精確感,這點沒錯。歷史資料流並不完整,時鐘會漂移,而交易所時間戳也無法揭露每一段網路傳輸。即使模擬器使用奈秒欄位,成交假設仍可能很粗略。
因此,與其宣稱確定,不如測試結果對假設的敏感度:使用合理的同時事件排序方式和訂單延遲進行重播,再比較交易筆數、成交價格,以及哪些訊號仍然有效。如果結果取決於資料無法確認的事件順序,就應在研究報告中說明這項依賴。時鐘不完美,回測依然有用;只要誠實交代它實際掌握了哪些時間資訊。
← 所有文章


