← 所有文章

投資 · 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(放貸方的掛價)往上掃,掃到這批借款需求用完為止。所以同一批的成交價由低到高排開,最高那一階只佔一小部分。

示意圖:左邊是成交名目隨時間變化,每 20 分鐘一次的批次有集中的大量成交,批次之間只有零星成交;右邊是一批之內從最低的 ask 往上掃,下面幾階全部成交,最高一階的清算頂價只成交一小部分,再往上的 ask 沒掃到。 示意圖,長條高度不代表實際成交量。

舊策略我叫它 ladder:掛一段固定時間沒成交就撤掉、降一階再掛。

這個時間跟批次時鐘無關,超過一半被撤掉的單,一次批次都沒遇到就被降價了。

掛上去很快就碰到下一批的單,成交率大約是要等很久才輪到批次的三倍。

輪詢頻率本身沒有問題,出問題的是撤單節奏。

示意圖:上半是舊的 ladder 策略,掛單固定時間沒成交就撤單降一階,超過一半的撤單發生在兩次批次之間,一路降到 FRR 打折後的地板才成交;下半是 batch top,只在新的一批印出來後才重評報價,價差不夠大就不動。

至於 0.0003,我拿到的 6.6% 其實是 bot 自己的地板:ladder 一路降到底,就停在 FRR(過去一小時固定利率放貸的平均利率)打折後的價。

我看到的 0.0003 幾乎都是 120 天期的成交和 FRR 的顯示值,2 天期成交在那個價以上的量不到 1%。

排隊也不是問題,我們的成交幾乎都是被清算價直接穿過去的。

batch top:錢在尺,不在時鐘

新策略叫批次頂價尺(batch top)。它參考最近幾批的清算頂價打個折當主要報價,用近期成交的中位數當地板、長期 VWAP(成交量加權平均價)的倍數當上限。

只有新的一批印出來、這張單確實被那批測試過、新舊價差夠大時,才撤單重掛,天期固定 2 天。

批次用成交量偵測,不把時間寫死,哪天 Bitfinex 改了時間,看成交量的版本會自己跟上。具體的折數與門檻就不公開了。

示意圖:batch top 以近幾批的清算頂價打折作為主報價,下有近期成交的中位數當地板,上有長期 VWAP 的倍數當上限;右側列出撤單重掛的三個條件:新的一批印出來、這張單被那批測試過、新舊價差夠大,天期固定 2 天。

回測對現行策略的忠實版本,一年大約多一個百分點的年化,fUST 大約半個百分點,換成嚴格的成交模型數字也不變。

對照組一定要是現行策略的忠實版本。對照組不可信,算出來的 bp(基點,萬分之一)都沒有意義。

但跟最便宜的替代方案比(撤單時間拉長、固定掛在近期成交的高分位),差距只剩幾十個 bp。

唱反調那一輪沒有推翻結論,但把適用範圍縮小了不少:

  • 新策略實質上就是把掛價抬到近幾小時成交的頂端附近再打折。批次對齊本身對年化的貢獻大約是零,錢在尺,不在時鐘。
  • 有三到五成的成交落在地板價,最高那一階的曝險是舊策略的兩倍。
  • 所有 config 掛同一個價會疊在同一階互相搶,資金放大之後要加價格抖動或同價位的資金上限。

從「批次對齊很厲害」修正成「錢在尺」,直接決定了後續要優化什麼。

能做 A/B 的樣本太少,可偵測的最小效果跟要驗證的差距差不多大,所以驗收改成上線前後對照。

分三步上線,每步可回滾

第一步是 dark ship 資料層,程式先上線,但還沒有人用它的結果。

recorder 定期把公開的 candle 寫進 DB,只寫已經結算的分鐘,因為還沒結束的分鐘數字還會變。另一個 service 算出候選價位,資料不夠或批次結構看起來不對就熔斷、退回保守報價。

這個階段沒有任何程式讀候選價,現行報價一個 byte 都沒變。

第二步是開關,就是 config 上的一個欄位:

SQL
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 試跑。

#放貸策略#Bitfinex#回測

留言

載入留言中…

下一篇

工程

從 FastAPI 腳本到 Spring Boot SaaS:我的 Bitfinex 自動放貸平台架構演進

Bitfinex 自動放貸 side project 從「能跑就好」的 FastAPI 單人腳本,重寫成 Spring Boot + Next.js 多模組平台:冪等、對帳、斷路器與監控怎麼設計。