2026年十月6日 · 研究

為什麼我的回測成交價是市場從未出現過的價格?

為什麼我的回測成交價是市場從未出現過的價格?

回測可能會顯示成交價是市場從未出現過的價格。通常是模擬器根據不完整資料,推算出看似合理的成交:K 棒的最高價與最低價、中間價,或被一筆交易觸及的限價。這會讓交易紀錄看起來精確,卻掩蓋市場實際提供的條件。

先問問你的委託可能與哪個價格互動。最新成交價 K 棒能回答某個區間內成交過哪些價格,但無法告訴你委託送達時的買價與賣價、當時有多少流動性,或你的委託能否排到隊伍前面。

為什麼我的回測顯示成交價超出市場價格?

首先,要明確「超出」的意思。買進成交價低於 K 棒最低價,或賣出成交價高於最高價,顯然是帳務或時間上的錯誤。即使成交價落在最高價與最低價之間,也可能是虛構的:價格可能在委託送出前就成交了,也可能出現在價差的另一側,或成交量太小,不足以成交你的委託。

假設有一根 1 分鐘 K 棒,開盤價為 100.00、最低價為 99.80、收盤價為 100.10。你的策略看到完整 K 棒後送出買單,模擬器卻以 99.80 成交。這個低點可能出現在該分鐘剛開始時,比訊號早了 50 秒。K 棒無法證明做出決策後還能以 99.80 買到。

你有的資料能證明什麼無法證明什麼
OHLCV K 棒某個區間內觀察到的成交價範圍與成交量價格順序、買價與賣價,或委託送達時的可成交量
逐筆成交資料附有時間戳記與價格的回報成交紀錄掛單流動性或你在委託隊列中的位置
最佳買賣報價取樣時點的最佳掛牌買價與賣價最佳價位以外的深度,或報價在取樣間隔期間是否持續有效
委託簿事件掛牌深度變化與隊列事件,視資料流涵蓋範圍而定隱藏流動性、交易場所存取權,或保證的優先順序

另一個常見原因,是把中間價和可執行價格混為一談。如果報價是買價 99.99、賣價 100.01,以中間價 100.00 買進,在報表上看起來很整齊。但可立即成交的買單通常得付賣價,委託量較大時還會有市場衝擊。把中間價當成成交價,等於悄悄抹去一半價差。

市場觸及限價,就代表限價單一定會成交嗎?

價格被觸及,表示有交易以該限價成交,但不能證明你的掛單也會成交。如果其他委託排在你前面,該價格的成交量可能不足以輪到你的隊列位置。這筆成交也可能來自另一個交易場所,而你的委託則掛在別處。

假設你的買進限價是 50.00,而你掛單後市場以該價格成交了 200 股。以觸價判定成交的模擬器會讓 500 股全數成交。較謹慎的模型會先計算委託送達後,以 50.00 或更好的價格成交了多少,再估算前方隊列的數量。若沒有委託層級的委託簿資料,隊列狀況就只能靠假設。這項假設應該清楚呈現在結果中,而不是被藏起來當成確定事實。

對小型研究系統,我寧可明確列出這項假設並測試一段範圍,也不會假裝 K 線資料能揭示隊列優先順序。適用範圍取決於交易場所、委託量,以及策略的交易頻率。開盤時交易清淡的股票,和 UTC 03:00 時流動性稀薄的加密貨幣合約,面對的是不同的執行問題。

該如何為 K 棒資料選擇成交模型?

模型要同時符合資料內容與策略所做的主張。以 K 棒為基礎的回測仍可用於較慢的策略,但成交條件必須遵循 K 棒實際能揭示的資訊。

  1. 設定決策與委託送達時間。如果訊號使用 K 棒收盤價,就在收盤後送出委託。請以後續可用的區間或報價模擬成交,而不是採用完整 K 棒中更早出現的最低價。
  2. 使用價差正確的一側。可立即成交的買單以賣價為起點,賣單則以買價為起點。如果只有成交價 K 棒,就從其他來源估算價差,或明確說明模型未納入價差。
  3. 依合理的流動性限制成交量。根據觀察到的成交量設定參與率上限,並計入手續費與市場衝擊。K 棒的總成交量不代表你選定的價格有足夠數量可供成交。
  4. 對假設進行壓力測試。比較下一根 K 棒開盤成交與保守滑價,並測試結果能否承受更差的執行條件。不要為了讓策略獲利而調整成交模型。

這些都是建模選擇,無法從不完整資料中還原唯一且真實的成交價。如果策略仰賴捕捉幾個基點,K 棒資料可能不足以支持這項主張。

如何找出不可能的成交價是從哪裡進入回測的?

從訊號到帳本,追查一筆可疑交易。把決策時間戳記、委託送出時間戳記、模擬送達時間、選用的市場觀察值、成交價、成交量與手續費分開記錄。接著依序檢查:

如果無法從交易紀錄回答這些問題,代表回測缺少執行證據。補上這些欄位,對照原始資料手動重播幾筆交易,並確認回報的成交價符合你預期的模型。乾淨的權益曲線,抓不出只存在於模擬器裡的價格。

回測市場資料執行資料工程
← 所有文章