2026年十一月3日 · 執行

我們在模擬盤做了基差交易。只成交了 1 腿。

我們在模擬盤做了基差交易。只成交了 1 腿。

函式名叫 enter_pack。這本來就該是警訊。一個研究 agent 寫了一套 BTC 現貨持有套利:永續比現貨貴超過 8 bps 時,買現貨、放空永續,然後坐著不動。資金費率與基差會把剩下的做完。回測在同一毫秒、以中間價再讓 1 檔作為禮貌,把兩腿都成交了。權益曲線是一道階梯。沒人會說它刺激。這正是賣點。

某個週一,我們把它推上模擬盤。

週一:永遠會成交的那筆組合

第一個訊號在 11:17 UTC 出現。螢幕上的基差是 9.4 bps,永續偏貴。回測裡,enter_pack 回傳 2 筆成交,殘差為 0。模擬盤上回傳的是現貨在賣價成交 0.40 BTC,以及一張掛在簿上、沒成交的永續空單。

現貨付了 4 bp 的 taker 手續費,外加大約 1 bp 的價差。我們要的永續價格本來還在訂單簿上,然後就沒了。20 秒後,報價基差變成 5 bps,因為我們剛吃了現貨。40 秒後永續成交,已經是行情走完之後。我們配齊了。我們配齊時的基差,已經不夠支付進出場成本。

回測會記上一筆「+9.4 bps 持有收益,殘差 0。」成交紀錄上是 4 bps 的現貨 taker 成本、40 秒未對沖的多頭,以及大約 5 的進場缺口。我只有 1 筆樣本,卻仍對那道階梯太有信心。

週二:我們打開那個函式

enter_pack 接收一份腿清單與一個目標中間價。它迴圈,把每條腿在 mid * (1 ± slip) 成交,然後寫下 1 列投資組合紀錄。沒有第二個時間戳。沒有第二腿不存在的分支。單元測試斷言 residual == 0。

那種測試會讓你覺得自己像個大人。它永遠不會失敗。

我們把組合拆成 2 張各有自己狀態的訂單:已送出、部分成交、已成交、已取消。未完成變成一等物件。歷史回放還是沒有真實訂單簿,所以我們作弊。把第二筆成交延遲一個從週一等待時間抽出的樣本(平均 26 秒,尾部我不喜歡),價格再隨該時段現貨走勢漂移。粗糙,但午餐前階梯就長出刻痕:有的組合以 3 bps 進場,有的組合始終沒能成為組合。

週三:3 秒,然後平掉

如果第二腿沒在 3 秒內到位,就把第一腿平掉。我們本來就該從這裡開始。聽起來很保守,直到你把中止的成本算清楚。平倉意味著你吃現貨進場,再吃現貨出場。2 筆 taker 手續費、2 段價差,沒有持有收益,沒有資金費率。在重寫後的回放裡,這些中止並不罕見。它們聚集在基差看起來最「真實」的那些 K 棒上,而那通常也是已有東西正在現貨裡流動的那些 K 棒。

到週三晚上,我們有 17 筆模擬訊號可以爭論。

174 天內的模擬訊號
7兩腿都成交的組合
18 bps殘留多頭後來的逆向波動
回測,週一早上模擬盤,到週三
進場兩腿都以中間價、1 個時間戳現貨在賣價成交;永續晚 5–40 秒,或永遠不成交
殘差永遠是 017 筆訊號中有 10 筆未對沖
在手交易的手續費2 筆 taker2 筆 taker,中止則是 4 筆
PnL 驅動因子基差 + 資金費率等待期間現貨怎麼走
組合在 2 張單都成交時才算完成,否則就是一筆你沒按方向性部位去設規模的方向單。殘差存在的整段時間,都要對即時訂單簿計價。你若無法計價,就不能跑這套策略。

一位同事還留著一份筆記本,把組合當成上市商品,BTC_CARRY,外加固定 2 bp 的「執行稅」。我喜歡那份筆記本。它產出的階梯跟 agent 的一樣。稅是一個均值。孤兒單是一個分布。均值不會在流動性稀薄的一小時被輾過;0.40 BTC 的殘留現貨會。

週四:殘留,然後咖啡

一旦還得排隊,3 秒幾乎把所有單都中止了。我們把模擬盤放寬到 15 秒。週四 02:11 UTC,現貨成交了,永續沒有。我還停在「它會掛著,它會被吃掉」的哀傷階段,人已經去泡咖啡。

02:11:08 成交 BTCUSDT 0.40 買
02:11:08 已送出 BTCUSDT-PERP 0.40 賣,post-only
02:11:41 仍在掛單
02:26:00 殘差計價 −18.1 bps

BTC 在一段安靜的時段跌了 18 bps。殘差就是整筆交易。資金費率結算時,入帳的是我們並沒有的永續部位。現貨就只是坐在那裡當多頭。原始回測的隔夜路徑裡從來沒有單腿部位,所以它從沒問過我們對其他每本帳都會問的問題:這筆殘留最壞能打出哪一根 K 棒,以及一筆我們本無意持有的部位,停損該設在哪?

那 7 筆完整組合也不是英雄。等第二腿成交時,我們自己吃現貨已經壓到指數,進場基差比觸發訊號的快照差了 3–5 bps。那個 8 bps 門檻,只是螢幕上的一個數字。

下次我們會跳過的事

我們不會把多腿策略當成單一成交函式上線。同樣的規則適用於永續與現貨套利、跨期價差,或是 agent 掛 2 張限價單、然後在兩邊都在中間價「成交」時開始慶祝的買權垂直價差。

  1. 逐腿訂單狀態,含部分成交。把組合當成 2 張單的母單。
  2. 真正會觸發的最長孤兒單計時器,以及出場要付 2 段價差的平倉路徑。
  3. 對殘差做盤口計價,停損規模按殘留部位來設。配齊後的淨額是錯的名目本金。
  4. 兩腿都到位之前,不計入持有收益,不累計資金費率。未完成就是未完成。
  5. 凡是有 2 張單的東西,拒絕把中間價對中間價當成預設。若必須猜,薄的那一腿往更差猜,第二筆成交往更晚猜。

我們也不會讓 test_pack_is_atomic 進 repo。原子性是撮合引擎的性質,不是輔助函式的性質。BTC 現貨與 BTC 永續是 2 本有時押韻的訂單簿。模擬盤是它們不再押韻的地方,而那也是這道階梯曾經有趣的唯一理由。

回測現貨持有套利執行模擬交易加密期貨
← 所有文章