2026年十一月7日 · 微觀結構

回測讀對了價格,卻讀錯了市場

回測讀對了價格,卻讀錯了市場

UTC 10:14,一個簡單的突破策略在價格突破 20 分鐘高點後買進加密貨幣永續合約。回測顯示成交價為 $64,210。這個數字確實出現在資料中,訊號的時間戳記也正確,模擬訂單則在下一根 K 棒送達。我們差點就把這結果當成漂亮的成果。

接著,我們核對了商品 ID。訊號來自 BTCUSDT 永續合約,成交價卻來自 BTCUSD 反向合約。兩者的交易價格都接近 $64,210,流動性也都充足,但它們是不同的訂單簿,價格、跳動點大小、深度和費率都不同。這份回測把兩個市場拼在一起,創造出交易者根本無法接觸的市場。

策略本身很普通:收盤價高於移動區間高點時進場,收盤價低於移動區間低點時出場,每筆部位都設定固定的美元風險。問題只有在我們提出比「BTC 值多少?」更精確的問題後才浮現。我們問的是:「在那個時間點,這筆訂單在這個特定合約裡實際能買到什麼?」

策略執行前,圖表就已經是綜合行情

我們的研究資料源讓跨交易所比較變得很容易。它會統一商品代碼,並顯示整合後的價格序列。用來觀察市場很方便,拿來當作執行依據就不合適。綜合行情可能顯示多家交易所中的最佳價格,但策略實際上只能在一家交易所送出訂單。

突破發生時,整合行情的 K 棒最高價是 $64,205。所選合約的最新成交價早已來到 $64,218。與此同時,反向合約的快取報價仍顯示賣價為 $64,210。模擬器拿一個序列的突破訊號,搭配另一個序列看起來更優惠的賣價。每個數字都是真的,但拼在一起卻是虛構的。

輸入資料回測使用的資料訂單所需資料
突破高點整合後的 BTC 價格所選合約的價格歷史
進場參考價快取的反向合約賣價交易商品的最新賣價
成交數量預計部位大小各價格檔位的可交易數量

市場資料表中的一列看起來可能很完整,但欄位描述的其實是不同市場。商品代碼別名不能證明兩個商品共用同一本訂單簿。產生訊號到執行訂單的整個流程,都必須一併帶上合約 ID、交易所、報價幣別和時間戳記。

我們用訂單簿重播了這筆訂單

我們改用所選永續合約本身的最佳賣價,以及決策當下可取得的訂單簿更新,重新模擬這筆進場。報價是最新的,但最優價格檔位只有 0.18 BTC。我們的模擬訂單是 0.50 BTC,剩下的 0.32 BTC 得以更高的賣價成交。

$64,218訂單送達時的最佳賣價
0.18 BTC該賣價可成交的數量
$64,231重播後的成交量加權價格

調整後的進場價格每 BTC 比回測列出的成交價高 $21,且尚未計入費用。單筆交易的差距不大,但在整段測試中,策略大部分的毛利都來自少數幾次快速突破。用正確的訂單簿重播這些進場後,毛利結果減少了 31%;再計入 taker 費用與市場衝擊後,結果更低。

我們也找到兩筆案例,最佳買賣報價是在訊號決策時間之後才送達。若回測以最接近的時間戳記合併資料,就可能悄悄選到未來的更新。我們現在改為向前查找:報價必須在訂單送出前已經觀測到,並記錄報價的時效。如果最新可用報價太舊,模擬器就會將訂單標記為無法成交,或套用明確的過時資料規則。

什麼樣的價格才可交易

K 棒收盤價適合用來計算訊號,但它無法證明某筆特定訂單能以該價格成交。要判斷是否可成交,價格必須屬於完全相同的商品與交易所、在訂單抵達時已經可用,而且對手方數量必須足以滿足預定下單量。如果資料無法回答這些問題,誠實的結果應該是提供一個範圍,或標記為未成交,而不是捏造一個精確價格。

我們保留整合行情供觀察市場,但不再讓它參與交易執行。現在訊號會參照所選合約自己的歷史價格;訂單則依據該合約的訂單簿重播,並在計算成交後納入費用與下單量。要多接一些資料流程,但權益曲線也就沒那麼好看了。

那次突破確實發生了。只是回測給了它一個比策略所選市場更好的交易環境。

加密貨幣期貨訂單簿市場資料回測執行
← 所有文章