投資 · 2026.09.11 · 5 min · 更新於 2026.10.26
Bitfinex 放貸的隱藏時鐘:每 20 分鐘一次的批次拍賣
Bitfinex 2 天期放貸其實是每 20 分鐘撮合一次的批次拍賣,這篇整理我怎麼從資料看出這個結構、新報價策略回測後真正賺在哪裡,以及分三步上線時踩到的坑。
閱讀設定
我的 Bitfinex 放貸 bot 拿到的利率比盤面上看到的低,原因跟撮合方式有關:2 天期放貸其實是批次拍賣,每 20 分鐘撮合一批、時間固定,官方文件沒有寫。
bot 利率偏低,一半是撤單節奏跟這個時鐘對不上,一半是它自己設的地板。
照這個發現重寫的報價策略,回測一年大約多一個百分點。但唱反調那一輪證明,錢賺在「把掛價抬到近期頂價附近」,批次對齊本身幾乎沒有貢獻。
新策略分資料層、開關、預設三步上線,每一步都能單獨回滾。
盤面上的高利率,bot 拿不到
有一陣子我在成交紀錄上看到日利率 0.0003(年化約 11%)的成交,bot 同一段時間拿到的大約是年化 6.6%。
我猜過兩件事:高利率的單有排隊機制我排不到,或是 bot 輪詢太頻繁,單子還沒等到成交就被自己撤掉。
為了用資料回答,我用 Claude 的多 agent workflow 跑了三輪研究,最後一輪專門唱反調。
市場資料是 Bitfinex 公開的 1 分鐘 funding candle,往回翻一年。成交模型用 bot 自己真實的訂單校準。利息按借款實際存續的時間算,因為 2 天期的借款常常幾小時就被還掉。
兩個對不上的時鐘
fUSD(美元放貸市場)的 2 天期,絕大部分成交名目都集中在這些每 20 分鐘一次的批次裡,一年裡每個月都一樣,fUST(USDT 放貸市場)也是。
每一批從最低的 ask(放貸方的掛價)往上掃,掃到這批借款需求用完為止。所以同一批的成交價由低到高排開,最高那一階只佔一小部分。
示意圖,長條高度不代表實際成交量。
舊策略我叫它 ladder:掛一段固定時間沒成交就撤掉、降一階再掛。
這個時間跟批次時鐘無關,超過一半被撤掉的單,一次批次都沒遇到就被降價了。
掛上去很快就碰到下一批的單,成交率大約是要等很久才輪到批次的三倍。
輪詢頻率本身沒有問題,出問題的是撤單節奏。

至於 0.0003,我拿到的 6.6% 其實是 bot 自己的地板:ladder 一路降到底,就停在 FRR(過去一小時固定利率放貸的平均利率)打折後的價。
我看到的 0.0003 幾乎都是 120 天期的成交和 FRR 的顯示值,2 天期成交在那個價以上的量不到 1%。
排隊也不是問題,我們的成交幾乎都是被清算價直接穿過去的。
batch top:錢在尺,不在時鐘
新策略叫批次頂價尺(batch top)。它參考最近幾批的清算頂價打個折當主要報價,用近期成交的中位數當地板、長期 VWAP(成交量加權平均價)的倍數當上限。
只有新的一批印出來、這張單確實被那批測試過、新舊價差夠大時,才撤單重掛,天期固定 2 天。
批次用成交量偵測,不把時間寫死,哪天 Bitfinex 改了時間,看成交量的版本會自己跟上。具體的折數與門檻就不公開了。

回測對現行策略的忠實版本,一年大約多一個百分點的年化,fUST 大約半個百分點,換成嚴格的成交模型數字也不變。
對照組一定要是現行策略的忠實版本。對照組不可信,算出來的 bp(基點,萬分之一)都沒有意義。
但跟最便宜的替代方案比(撤單時間拉長、固定掛在近期成交的高分位),差距只剩幾十個 bp。
唱反調那一輪沒有推翻結論,但把適用範圍縮小了不少:
- 新策略實質上就是把掛價抬到近幾小時成交的頂端附近再打折。批次對齊本身對年化的貢獻大約是零,錢在尺,不在時鐘。
- 有三到五成的成交落在地板價,最高那一階的曝險是舊策略的兩倍。
- 所有 config 掛同一個價會疊在同一階互相搶,資金放大之後要加價格抖動或同價位的資金上限。
從「批次對齊很厲害」修正成「錢在尺」,直接決定了後續要優化什麼。
能做 A/B 的樣本太少,可偵測的最小效果跟要驗證的差距差不多大,所以驗收改成上線前後對照。
分三步上線,每步可回滾
第一步是 dark ship 資料層,程式先上線,但還沒有人用它的結果。
recorder 定期把公開的 candle 寫進 DB,只寫已經結算的分鐘,因為還沒結束的分鐘數字還會變。另一個 service 算出候選價位,資料不夠或批次結構看起來不對就熔斷、退回保守報價。
這個階段沒有任何程式讀候選價,現行報價一個 byte 都沒變。
第二步是開關,就是 config 上的一個欄位:
UPDATE lending_configs SET quote_mode = 'batch_top' WHERE id = :config_id;
欄位預設是 ladder,本身就是開關。我沒有再加環境變數當總開關,多一個 env var 只是多一個會漏同步的地方。
這一步的 code review 抓到的 major 裡,最值得記的是批次後重評的邏輯誤管到 120 天的單。新策略只該管自己的單,但「哪些單是我的」很容易寫得太寬。
第三步是改成預設,上線隔天我就把所有 config 切過去。
使用者少、資金規模小,實測比等待更快拿到答案,最壞的情況也被資金上限框住,要切回去仍然只是一句 SQL。
切換當晚,Grafana 的定價圖整條消失。
那幾條 gauge 只在 ladder 定價路徑的最後才發,batch_top 在入口就分流,永遠走不到那一行。舊路徑的指標不會報錯,只會停在最後一個值,重啟後變成 No data。
修法是把 batch_top 的報價尺疊到同一張圖,再補熔斷原因的圖。加策略分支時,要一起盤點 dashboard 用到的 metric 會不會斷掉。
回頭看,最大的收穫是一個只能從資料看出來的結構:先問市場實際上怎麼撮合,再談怎麼報價。
batch_top 只做 2 天期,那長天期呢?Bitfinex 長天期放貸的回測寫我怎麼回測 7 天、30 天與 120 天的放貸,以及最後留下哪兩條 lane 試跑。

工程
從 FastAPI 腳本到 Spring Boot SaaS:我的 Bitfinex 自動放貸平台架構演進
Bitfinex 自動放貸 side project 從「能跑就好」的 FastAPI 單人腳本,重寫成 Spring Boot + Next.js 多模組平台:冪等、對帳、斷路器與監控怎麼設計。
留言
載入留言中…