跳至主要内容

Bitfinex 放貸機器人開發心得(一):不想付訂閱費,乾脆自己寫

· 閱讀時間約 7 分鐘

這隻 Bitfinex 放貸機器人的第一個 commit 是 2025 年 9 月 15 日,一次就加了 9,533 行。到現在大約一年、1,400 多個 commit,時間有點久了,所以這個系列是照 git 紀錄回頭整理的,挑幾個真正改變做法的地方來寫。這篇先寫怎麼開始,還有第一個月踩到的 Bitfinex 坑。

起初是因為在公司的專案使用了 Cursor,裡面的 Claude 模型還蠻好用的,後來就想說是否可以用 AI 來寫個好玩的東西。

為什麼會選擇做放貸機器人?其實 Bitfinex 放貸這個系統我是 2024 年滑到某個 YouTuber 在推廣的,那時講得天花亂墜好像多好賺,忽然話鋒一轉開始推薦他自己寫的放貸機器人,但那時候也沒有特別想要嘗試。因為我就不想付那個機器人的訂閱費,但現在我有 vibe coding 的經驗了,寫來玩玩並當作另一個投資的標的好像也不錯。約 2025 年 8 月的時候,看了看 MacBook Air M4,覺得 CP 值蠻高的,雖然我非常非常討厭瀏海。最後就還是買了一台專門用來寫 code(現在電腦漲價得很誇張,結果現在反而還後悔沒有買更高規格的)。

開始之前:先拿別人的專案來跑​

一開始沒有直接寫,因為我光是申請 Bitfinex 的 KYC 就卡了一個月。

後來好不容易開通放貸權限了,第一步就是先在 GitHub 找了幾個放貸機器人的專案下載來跑看看,邊跑邊改。

當時參考的專案大多都是年代久遠(7~8 年),我也懶得自架環境,反正讓 AI 讀了一遍,它就都幫我設定好並上線了。

大概懂了放貸的流程之後,重新規劃架構和 UI 重寫一遍。重寫是用 Claude Code 寫的,第一個 commit 上就掛著 Claude 的 co-author(現在的 Claude Code 實力明顯比去年強非常多,訂閱制可用的額度也高很多)。

當時開發文件記錄選用 Go 的理由:

  • 單一執行檔,部署簡單
  • goroutine 可以同時處理多個幣別
  • 編譯型語言,強型別,比較少執行時才爆的錯
  • 記憶體用量低,文件寫「比 Node.js 低 70%」(這個數字我沒量過,應該是 AI 自己寫的)
  • 有官方的 Go client 可以參考(後來發現它 2021 年之後就沒再更新功能,最後沒用)

選 Go 還有一點私心:以前就常聽說 Go 效能好,很多博弈業的系統也是用 Go 寫的。結果實際跑起來,效能根本用不到:現在 bot 在樹莓派上跑 6 個排程器加網頁,記憶體大約 50MB、CPU 0.08%。真正吃到好處的反而是部署,在 Mac 上 15 秒就能編出樹莓派能跑的執行檔。

第一版的野心很大,多用戶、execution pool、circuit breaker 全都有,結果隔天就把這三塊刪掉,一共 1,231 行(當時只有自己一個人在用)。那時候 bot 跑在筆電上,9 月 23 日還為了「筆電外出時網路斷線」加了離線容錯。上 Docker、搬到樹莓派是隔年 1 月的事。

788,221% 的年化​

9 月 26 日,掛出去的單全部被 Bitfinex 退回:

Invalid rate: Please put an offer lower than 7% a day

當天 commit 紀錄裡算出來的年化是 788,221%。

原因是兩種利率單位混在一起用。Bitfinex API 收的是日利率小數,例如 0.000238 代表每天 0.0238%;網頁和 App 上看的是年化百分比,例如 8.715%。換算錯一次就差 36,500 倍(365 天 × 100)。

修的過程:

  1. 9/26:修了定價和策略兩個檔案的換算(有效)
  2. 10/2:又被退一次,這次是 228,365%。另一個產生長天期高利單的函式,直接把年化的 10.0 當成日利率塞進去,那天整個「沒有單借出」(無效:上次只修了出事的那兩個地方)
  3. 10/3:所有地方改用同一組換算函式 DailyDecimalToAnnualPercent、AnnualPercentToDailyDecimal(有效)
  4. 10/4:加了一個 RateValidator,日利率大於 0.2 就當成格式錯誤(無效:寫好之後到今天都沒有任何地方呼叫它)

還好錯的方向是放大,被每天 7% 的上限擋了下來,代價是錢閒著沒借出去。

追到的 11% 急單,其實是別人的掛單​

10 月 3 日做了「高利急單」:盤口出現 9.5% 以上、30 天以上的單,就立刻跟著掛。測試紀錄寫著偵測到 11%、120 天,也真的掛出去了。

隔天凌晨發現看錯邊。Bitfinex funding book 的 API 用正負號分兩邊:

  • 負數是 BID:借款人願意付的利率
  • 正數是 OFFER:其他放貸人掛出來的利率

程式看的是正數,所以那筆 11% 是別的放貸人掛的價,不是有人要用 11% 借錢。改成看負數之後,當下最好的 BID 只有 7.1%,根本沒到門檻。那張 11% 的單最後有沒有成交,我已經忘了。

然後又改過頭。10/4 把所有地方都改成只看 BID,但要決定自己掛多少、會排在第幾名,看的其實是 OFFER 那邊的競爭對手。11 月刪掉那套舊策略時,commit 寫的理由就是 "Analyzed BID orders instead of ASK"。找機會看 BID,定價看 OFFER,兩邊都要看。

UST 不是那個 UST​

10 月 9 日晚上看到前端同時在查 USD、UST、USDT,以為 UST 是 2022 年崩盤的 TerraUSD,就把它拿掉了。7 個半小時後才發現,Bitfinex 的錢包 API 就是用 UST 代表 USDT(Tether),前端查 USDT 反而什麼都查不到,USDT 的餘額一直顯示不出來。

最低 150 美元​

Bitfinex 的 USD 放貸,一筆最少 150 美元。預備金、拆單、金字塔分配都會切出不到 150 的零頭,零頭掛不出去就變成閒置,commit 紀錄裡有一次閒置到 39.8%。9 月底到 10 月初陸續把零頭合併進主單,最後閒置降到 4.2%。

10 月 9 日試過把下限改成 50,API 直接回:

minimum is 150.0 dollar or equivalent in USD

1 分鐘後改回來。這也不是第一次,隔天寫的 BUSINESS_RULES.md 裡記著「Claude 曾多次嘗試將 min_amount 改為 50.0 以『提高資金利用率』」,所以乾脆把 150 列成「絕對不可修改」的鐵則(AI 看到閒置資金就想動下限)。這條到現在還寫在專案的 CLAUDE.md(給 AI 看的專案說明)裡。

log 寫 follow_trade,跑的是另一套​

9 月 20 日的重構在 scheduler 裡留了一段 FORCED OVERRIDE,不管設定選什麼,一律跑 IntelligentStrategy。9 月 28 日新增 follow_trade(照市場實際成交價掛單),設定也切過去了,但強制覆蓋還在,所以紀錄上的策略名稱是 follow_trade,實際跑的是 Intelligent。follow_trade 本身的成交分析也是寫死的假資料,永遠回 6.99%。當時完全沒發現,是後來才發現對不上,兩個問題到 10 月 3 日才一起拆掉。

現在看來,很多 bug 的產生都是對放貸的業務規則不熟,還有一些曖昧不清的符號,記得當時明明查清楚了,但是 AI 會自作聰明地把它認為是另一個東西,就繼續出 bug。不過機器人總算跑起來的感覺,真的是蠻有趣的。