星期一我們做了該做的事。Agent 在一檔中型市值 USDT-M 永續合約上跑動量策略,每筆下 25,000 USDT;第一次沒加成交量濾網的回測,把每筆訊號都當成委託簿跟 BTC 一樣深來成交。於是我們加上教科書式的門檻:連續二十根 1 分鐘 K 線的美元成交量必須超過單筆的二十倍,訂單才能送出。二十分鐘,五十萬美元的成交紀錄。這檔幣忙碌的一天大約印出 $40 million。濾網留下大部分訊號。權益曲線沒那麼鋸齒。我們送去模擬盤。
十一小時後,一筆 25,000 USDT 買單吃掉 8,400 的買盤就停了。那一分鐘的二十根 K 線成交量是 $1.14 million。濾網說可以。
星期一:讓我們覺得自己很誠實的濾網
Agent 在 pull request 上的註記是「已加入容量檢查,20× 名目本金。」我核准了。這句話我核准過。這種規則,是有人秀出一檔 $4,000-OI 的幣、卻用 $50,000 單筆在回測裡成交,全場做一個表情之後,你加成交量倍數,好讓這種事不能再發生。
星期一,這條規則在回測裡做了它一貫會做的事。它丟掉冷清時段。它留下交易所自己的成交量數字看起來很吵的時段。週轉大約少了三分之一。平均成交金額仍是 25,000,因為成交模型是個膽小鬼:門檻一開,它就用最新價再加幾個 bps 把整筆吃完。沒人去問委託簿上到底有沒有坐著 25,000。
只要看到一檔幣的 24h 成交量是個整數、旁邊未平倉量卻很薄,我還是會縮一下。那是 2021 留下來的後遺症:當時 Discord「造市」機器人就是兩個子帳戶互敲,再把成交量截圖貼到 #brag。成交紀錄看起來像派對。委託簿是紙板。我告訴自己,在 1 分鐘 K 線上設 20× 濾網,就是長大、擺脫那套的方法。不是。那只是把紙板平均成一個比較平滑的數字。
星期二:模擬盤,然後一筆殘單
模擬盤一開始還算客氣。前五筆沿賣盤往下跳 2–4 檔就成交了。難看,但成交了。接著 14:07 UTC,一筆做多訊號,25,000 USDT,委託簿最佳價 1,100,下一檔 2,400,再來是空氣。我們以 taker 成交 8,400,剩下 16,600 掛著。四十秒後,殘量因我們自己的 time-in-force 被取消。策略以為自己做多了完整一筆。帳戶只做多了三分之一筆。
可是濾網說可以。我把那根 K 線拉出來。截至 14:07 這二十分鐘的美元成交量是 $1.14 million,穩穩超過 $500k。那 $1.14 million 裡大約 $380k 是成對的成交:同一價格、同一數量、相反的 aggressor 旗標,相差 2–8 毫秒,而且該價格的買賣數量沒動。那些成交在互付手續費。它們沒有給我們一個 25,000 USDT 的洞。
星期三:把成交紀錄對上委託簿
星期三是慢的一天,下次我會把時間預算加倍的那種。我們拿同一檔永續的五個工作日成交與 L2 快照,100ms 一張委託簿照片,把每筆成交對上前一張與後一張快照來分類。
- 若該成交價上的數量大約減少了成交量那麼多,它碰到了委託簿。計入。
- 若一買一賣、數量相同、印在同一價格,委託簿沒變,就叫它洗量,從任何容量數字裡剔除。
- 若一筆成交走過好幾檔,且那些價位消失了,那是真正的 taker。計入,也別假裝你還能吃那筆流動性;已經有人吃過了。
- 若成交被標成強平,那是真實數量,也是你最不該拿來證明 你 能下 25,000 的數量。那筆強制單在跟你搶。
快照會撒一點謊。任何在 100ms 內成交又補回來的,看起來像幽靈,而有些真正的造市商 cancel-replace 就是那麼快。我們後來抽了幾分鐘的 10ms 委託簿,洗量佔比只動了幾個百分點,不是變成兩倍。幾個百分點我可以接受。把交易所成交量 ticker 當流動性普查,我不能接受。
AggTrades 已經把同一個價格上一個 taker 打到多個 maker 的成交摺疊起來。它們不會摺疊兩個子帳戶互洗。如果你的「乾淨」資料源是聚合成交,你還是有這個問題。只是列數比較少。
而 ticker API 上的 24h 成交量是同一筆髒加總,只是延遲了,這就是研究 agent 愛它的原因。一個欄位。永遠在。看起來像特徵。它是剛好出現在行情 protobuf 裡的行銷統計。
星期四:一張表看完這一週
五個交易時段,同一筆單量、同一條 20× 規則、回測裡同一個成交模型。模擬盤成交比是該時段我們實際送出訂單的成交名目本金除以意圖名目本金。星期一的模擬盤是空白,因為我們還在回測。
| 時段 | 交易所成交 | 推動委託簿 | 類洗量 | 強平成交 | 濾網放行 | 模擬盤成交 |
|---|---|---|---|---|---|---|
| 週一 | $38.4m | $22.6m | $13.5m | $2.3m | 41 / 48 筆訊號 | n/a |
| 週二 | $41.1m | $24.2m | $15.2m | $1.7m | 36 / 40 | 0.61 |
| 週三 | $29.6m | $20.1m | $8.1m | $1.4m | 22 / 31 | 0.77 |
| 週四 | $44.8m | $25.6m | $17.4m | $1.8m | 39 / 44 | 0.54 |
| 週五 | $33.2m | $22.3m | $9.4m | $1.5m | 28 / 35 | 0.71 |
類洗量成交佔全週成交紀錄的 34%。它們不是均勻散開。星期四,原始濾網最喜歡的那個時段,最髒。這才是我在意的失效模式。這道門檻不只是平均高估流動性。洗量機器人開工的日子,它開得更寬,因為那些日子原始數字看起來最健康。
我們只用推動委託簿的成交量、同一個 20× 倍數重跑回測。訊號從全週 198 筆降到 121 筆。被丟掉的很多落在那種星期四式的時段:成交紀錄很吵,委託簿最佳價卻只有 1,100 USDT。原來的 Sharpe 用了 198 筆完整成交。我不會把新的那個報出來,假裝那是策略的發現。那是成交模型的發現:一旦你不再把委託簿沒有的價格當成 25,000 USDT 全成交,一塊「優勢」其實只是本來會變成殘單、卻被當成完成的訂單。
星期五:我們真正上線的,以及我下次會跳過的
我們留下的門檻很無聊。滾動的推動委託簿名目本金,只計算從價位上拿走數量的成交,必須達到單筆的 20×,而且我們量的是決策 K 線之前的那些 K 線,好讓當前這一分鐘的洗量沒有投票權。強平成交另設上限:若近期推動委託簿成交量有超過四分之一是強平,策略就停手。強制單流是真實數量,而且在跟你搶。
衝擊模型吃同一套減肥餐。舊模型用交易所成交量與我們的單筆去推 Kyle lambda。餵它洗量,lambda 就下降,因為市場看起來很深。餵它推動委託簿的成交量,同一筆單就佔了真正改變委託簿的更大比例。接下來幾個時段的模擬盤滑點,比較靠近那個比較醜的數字。靠近,不是相同。我們仍然看不到佇列,而 100ms 的照片仍會漏掉一些真實數量。
下次我會整段跳過的,是第一個星期一。不要從 ticker 開始,不要從 24h 成交量開始,不要讓 agent 把原始美元成交量放進特徵庫、又放進門檻,假裝那是兩個想法。它們是同一條髒序列,用了兩次。先做出與委託簿一致的成交紀錄,哪怕這代表你在有標的池之前,得在單一中型市值上研究兩天。用洗量過濾出來的標的池,是一份擅長看起來很忙的幣清單。
另一個要跳過的:任何把通過成交量檢查當成成交的成交模型。星期二那筆殘單才是策略本身。濾網只能回答「有沒有人在交易。」它不能回答「你的 25,000 會掛著還是會消失。」第二個問題需要委託簿、殘量,以及 time-in-force,那是另一篇日誌,而且是我們該在這篇之前寫的那一篇。
← 所有文章


