AI 策略代理可能產出有效的回測,卻使用了在預定交易時點尚不存在的資訊。程式能執行,權益曲線看起來也合理,訊號甚至可能合情合理。但一個時間戳、一筆資料連接,或一個經修訂的資料欄位,都可能悄悄讓它提前知道明天的答案。
解決方法是把資料可用時間納入研究規範。每項輸入都必須清楚回答兩個問題:這個值描述的是什麼時點?策略最早何時能得知這個值?
AI 生成的策略會如何出現前視偏誤?
最明顯的情況,是用同一根 K 線的收盤價計算訊號,接著又以該收盤價成交。如果策略需要收盤價才能做決策,就不可能同時在那個價格交易。但代理在合併資料來源或選用方便的預設值時,常會產生更隱蔽的情況。
假設模型在每分鐘收盤時計算 20 根 K 線的移動平均,並在收盤價穿越均線時建立部位。如果回測以同一個收盤價成交,就等於在策略取得該筆交易資訊之前,先用了這根 K 線的最後一筆成交價。把委託移到下一根 K 線開盤成交,或許是合理的近似方式,但市價單仍須計入手續費與價格衝擊。
再把特徵換成每日股票基本面資料,或加密貨幣未平倉量快照。資料列的日期可能標示為星期一,但數值可能在星期一收盤後才發布,或日後才經過修正。日期不等於資料可用時間戳。
策略輸入的時間戳應該怎麼記錄?
只要來源資料允許,至少保留 3 種時間:數值描述的期間、發布者公布數值的時間,以及系統收到數值的時間。策略在決策時點的資訊集合,只能包含當時已可取得的數值。
| 欄位 | 代表的問題 | 常見陷阱 |
|---|---|---|
| 事件時間 | 市場事件何時發生? | 在 K 線尚未完成前使用其收盤價 |
| 發布時間 | 來源何時發布這個數值? | 把日終標記誤當成開盤時發布 |
| 匯入時間 | 研究系統何時能讀取這筆資料? | 忽略供應商或資料管線的延遲 |
| 修訂時間 | 這個版本何時被記錄或修正? | 把修訂後的歷史資料回填,當成原始資料使用 |
對 1 分鐘策略來說,延遲 1 秒不代表一定無傷大雅。影響大小取決於決策時間,以及訊號使用的資料。如果輸入是已完成的每小時統計值,影響可能微乎其微;如果輸入是在下單前後擷取的委託簿失衡值,則可能讓交易方向完全反轉。
特定時間點資料庫能防止資訊洩漏嗎?
可以,但前提是「特定時間點」代表你能查出歷史決策時點已知的數值,包括當時版本的修訂內容。只有歷史日期的資料表,仍可能包含今天才修正、但日期標示為過去的數值。
每筆紀錄都要保留有效期間與可用時間戳,並保留各次修訂,而不是直接覆寫。接著明確指定歷史查詢條件:回傳模擬決策時點以前可取得的最新版本。這對基本面資料、指數成分、經濟數據發布,以及經供應商清理的資料集尤其重要。
還有個不起眼的實務問題:即使發布時間完美無缺,若資料匯入工作晚了 20 分鐘才執行,也毫無用處。如果歷史資料庫沒有記錄匯入時間,就採用保守的延遲假設並清楚說明。來源從未記錄的精確度,只是裝飾。
哪些檢查能在模擬交易前抓出前視偏誤?
要求研究代理在回測之外,另外產出特徵與委託的時間軸。每次決策都要記錄每項特徵來源的最新可用時間、決策時間、委託時間,以及模擬成交時間。只要輸入晚於決策時間才到,就拒絕該筆資料。
- 把訊號往後移 1 根 K 線,再比較結果。如果績效大幅下滑,可能表示策略依賴收盤到收盤的時序,但這只是診斷方式,不能證明存在資訊洩漏。
- 將所有來源資料截斷在歷史截止時間,重新執行資料管線,再把產出的特徵與已儲存的歷史特徵比較。
- 把疑似有問題的特徵替換成常數。如果績效幾乎不變,就檢查程式是否真的使用了預期的資料序列。
- 把一個刻意設計成不可能的未來特徵送進資料管線。只要其可用時間晚於決策時間,驗證就應明確報錯。
這些檢查無法替策略背書,但能讓特定的時序假設清楚可見,並抓出常見的假設違反情況。
模擬交易能證明回測沒有資訊洩漏嗎?
不能。模擬交易可能會揭露即時資料管線延遲、缺漏,或與歷史資料對齊方式不同的問題,但無法證明舊的訓練特徵反映了當時已知的資訊。模型也可能只是因為不再看得到它意外取得的未來資料,而失去資訊洩漏帶來的好處。
把模擬交易當成一致性檢查:比較即時特徵值、決策時間戳、委託產生方式,以及模擬成交結果是否符合回測定義。如果有差異,就追查具體輸入與時鐘。能說明每次決策所用資訊集合的代理團隊,才是在做有用的研究。只能拿出一條平滑曲線的代理團隊,則跳過了最難的一項稽核。
← 所有文章


