<?xml version="1.0" encoding="utf-8"?><?xml-stylesheet type="text/xsl" href="rss.xsl"?>
<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/">
    <channel>
        <title>ttylab80387 · Bitfinex 放貸</title>
        <link>https://ttylab80387.com/lending/</link>
        <description>vibe coding 出來的 Bitfinex 自動放貸機器人</description>
        <lastBuildDate>Wed, 21 Oct 2026 00:00:00 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <language>zh-Hant</language>
        <item>
            <title><![CDATA[Bitfinex 放貸機器人開發心得（一）：不想付訂閱費，乾脆自己寫]]></title>
            <link>https://ttylab80387.com/lending/bot-dev-01-rewrite/</link>
            <guid>https://ttylab80387.com/lending/bot-dev-01-rewrite/</guid>
            <pubDate>Wed, 21 Oct 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[為什麼自己寫放貸機器人、先跑別人的專案再重寫，還有第一個月遇到的問題：788,221% 的年化、追到別人的掛單、UST 不是那個 UST、150 美元下限。]]></description>
            <content:encoded><![CDATA[<p>這隻 Bitfinex 放貸機器人的第一個 commit 是 2025 年 9 月 15 日，一次就加了 9,533 行。到現在大約一年、1,400 多個 commit，時間有點久了，所以這個系列是照 git 紀錄回頭整理的，挑幾個真正改變做法的地方來寫。這篇先寫怎麼開始，還有第一個月踩到的 Bitfinex 坑。</p>
<!-- -->
<p>起初是因為在公司的專案使用了 Cursor，裡面的 Claude 模型還蠻好用的，後來就想說是否可以用 AI 來寫個好玩的東西。</p>
<p>為什麼會選擇做放貸機器人？其實 Bitfinex 放貸這個系統我是 2024 年滑到某個 YouTuber 在推廣的，那時講得天花亂墜好像多好賺，忽然話鋒一轉開始推薦他自己寫的放貸機器人，但那時候也沒有特別想要嘗試。因為我就不想付那個機器人的訂閱費，但現在我有 vibe coding 的經驗了，寫來玩玩並當作另一個投資的標的好像也不錯。約 2025 年 8 月的時候，看了看 MacBook Air M4，覺得 CP 值蠻高的，雖然我非常非常討厭瀏海。最後就還是買了一台專門用來寫 code（現在電腦漲價得很誇張，結果現在反而還後悔沒有買更高規格的）。</p>
<h2 class="anchor anchorTargetStickyNavbar_Emow" id="開始之前先拿別人的專案來跑">開始之前：先拿別人的專案來跑<a href="https://ttylab80387.com/lending/bot-dev-01-rewrite/#%E9%96%8B%E5%A7%8B%E4%B9%8B%E5%89%8D%E5%85%88%E6%8B%BF%E5%88%A5%E4%BA%BA%E7%9A%84%E5%B0%88%E6%A1%88%E4%BE%86%E8%B7%91" class="hash-link" aria-label="開始之前：先拿別人的專案來跑的直接連結" title="開始之前：先拿別人的專案來跑的直接連結" translate="no">​</a></h2>
<p>一開始沒有直接寫，因為我光是申請 Bitfinex 的 KYC 就卡了一個月。</p>
<p>後來好不容易開通放貸權限了，第一步就是先在 GitHub 找了幾個放貸機器人的專案下載來跑看看，邊跑邊改。</p>
<p>當時參考的專案大多都是年代久遠（7～8 年），我也懶得自架環境，反正讓 AI 讀了一遍，它就都幫我設定好並上線了。</p>
<p>大概懂了放貸的流程之後，重新規劃架構和 UI 重寫一遍。重寫是用 Claude Code 寫的，第一個 commit 上就掛著 Claude 的 co-author（現在的 Claude Code 實力明顯比去年強非常多，訂閱制可用的額度也高很多）。</p>
<p>當時開發文件記錄選用 Go 的理由：</p>
<ul>
<li class="">單一執行檔，部署簡單</li>
<li class="">goroutine 可以同時處理多個幣別</li>
<li class="">編譯型語言，強型別，比較少執行時才爆的錯</li>
<li class="">記憶體用量低，文件寫「比 Node.js 低 70%」（這個數字我沒量過，應該是 AI 自己寫的）</li>
<li class="">有官方的 Go client 可以參考（後來發現它 2021 年之後就沒再更新功能，最後沒用）</li>
</ul>
<p>選 Go 還有一點私心：以前就常聽說 Go 效能好，很多博弈業的系統也是用 Go 寫的。結果實際跑起來，效能根本用不到：現在 bot 在樹莓派上跑 6 個排程器加網頁，記憶體大約 50MB、CPU 0.08%。真正吃到好處的反而是部署，在 Mac 上 15 秒就能編出樹莓派能跑的執行檔。</p>
<p>第一版的野心很大，多用戶、execution pool、circuit breaker 全都有，結果隔天就把這三塊刪掉，一共 1,231 行（當時只有自己一個人在用）。那時候 bot 跑在筆電上，9 月 23 日還為了「筆電外出時網路斷線」加了離線容錯。上 Docker、搬到樹莓派是隔年 1 月的事。</p>
<h2 class="anchor anchorTargetStickyNavbar_Emow" id="788221-的年化">788,221% 的年化<a href="https://ttylab80387.com/lending/bot-dev-01-rewrite/#788221-%E7%9A%84%E5%B9%B4%E5%8C%96" class="hash-link" aria-label="788,221% 的年化的直接連結" title="788,221% 的年化的直接連結" translate="no">​</a></h2>
<p>9 月 26 日，掛出去的單全部被 Bitfinex 退回：</p>
<div class="language-text codeBlockContainer_Ot__ theme-code-block" style="--prism-color:#9CDCFE;--prism-background-color:#1E1E1E"><div class="codeBlockContent_z6Hy"><pre tabindex="0" class="prism-code language-text codeBlock_Y5th thin-scrollbar" style="color:#9CDCFE;background-color:#1E1E1E"><code class="codeBlockLines_bbfM"><div class="token-line" style="color:#9CDCFE"><span class="token plain">Invalid rate: Please put an offer lower than 7% a day</span><br></div></code></pre></div></div>
<p>當天 commit 紀錄裡算出來的年化是 788,221%。</p>
<p>原因是兩種利率單位混在一起用。Bitfinex API 收的是日利率小數，例如 0.000238 代表每天 0.0238%；網頁和 App 上看的是年化百分比，例如 8.715%。換算錯一次就差 36,500 倍（365 天 × 100）。</p>
<p>修的過程：</p>
<ol>
<li class="">9/26：修了定價和策略兩個檔案的換算（有效）</li>
<li class="">10/2：又被退一次，這次是 228,365%。另一個產生長天期高利單的函式，直接把年化的 10.0 當成日利率塞進去，那天整個「沒有單借出」（無效：上次只修了出事的那兩個地方）</li>
<li class="">10/3：所有地方改用同一組換算函式 <code>DailyDecimalToAnnualPercent</code>、<code>AnnualPercentToDailyDecimal</code>（有效）</li>
<li class="">10/4：加了一個 <code>RateValidator</code>，日利率大於 0.2 就當成格式錯誤（無效：寫好之後到今天都沒有任何地方呼叫它）</li>
</ol>
<p>還好錯的方向是放大，被每天 7% 的上限擋了下來，代價是錢閒著沒借出去。</p>
<h2 class="anchor anchorTargetStickyNavbar_Emow" id="追到的-11-急單其實是別人的掛單">追到的 11% 急單，其實是別人的掛單<a href="https://ttylab80387.com/lending/bot-dev-01-rewrite/#%E8%BF%BD%E5%88%B0%E7%9A%84-11-%E6%80%A5%E5%96%AE%E5%85%B6%E5%AF%A6%E6%98%AF%E5%88%A5%E4%BA%BA%E7%9A%84%E6%8E%9B%E5%96%AE" class="hash-link" aria-label="追到的 11% 急單，其實是別人的掛單的直接連結" title="追到的 11% 急單，其實是別人的掛單的直接連結" translate="no">​</a></h2>
<p>10 月 3 日做了「高利急單」：盤口出現 9.5% 以上、30 天以上的單，就立刻跟著掛。測試紀錄寫著偵測到 11%、120 天，也真的掛出去了。</p>
<p>隔天凌晨發現看錯邊。Bitfinex funding book 的 API 用正負號分兩邊：</p>
<ul>
<li class="">負數是 BID：借款人願意付的利率</li>
<li class="">正數是 OFFER：其他放貸人掛出來的利率</li>
</ul>
<p>程式看的是正數，所以那筆 11% 是別的放貸人掛的價，不是有人要用 11% 借錢。改成看負數之後，當下最好的 BID 只有 7.1%，根本沒到門檻。那張 11% 的單最後有沒有成交，我已經忘了。</p>
<p>然後又改過頭。10/4 把所有地方都改成只看 BID，但要決定自己掛多少、會排在第幾名，看的其實是 OFFER 那邊的競爭對手。11 月刪掉那套舊策略時，commit 寫的理由就是 "Analyzed BID orders instead of ASK"。找機會看 BID，定價看 OFFER，兩邊都要看。</p>
<h2 class="anchor anchorTargetStickyNavbar_Emow" id="ust-不是那個-ust">UST 不是那個 UST<a href="https://ttylab80387.com/lending/bot-dev-01-rewrite/#ust-%E4%B8%8D%E6%98%AF%E9%82%A3%E5%80%8B-ust" class="hash-link" aria-label="UST 不是那個 UST的直接連結" title="UST 不是那個 UST的直接連結" translate="no">​</a></h2>
<p>10 月 9 日晚上看到前端同時在查 USD、UST、USDT，以為 UST 是 2022 年崩盤的 TerraUSD，就把它拿掉了。7 個半小時後才發現，Bitfinex 的錢包 API 就是用 UST 代表 USDT（Tether），前端查 USDT 反而什麼都查不到，USDT 的餘額一直顯示不出來。</p>
<h2 class="anchor anchorTargetStickyNavbar_Emow" id="最低-150-美元">最低 150 美元<a href="https://ttylab80387.com/lending/bot-dev-01-rewrite/#%E6%9C%80%E4%BD%8E-150-%E7%BE%8E%E5%85%83" class="hash-link" aria-label="最低 150 美元的直接連結" title="最低 150 美元的直接連結" translate="no">​</a></h2>
<p>Bitfinex 的 USD 放貸，一筆最少 150 美元。預備金、拆單、金字塔分配都會切出不到 150 的零頭，零頭掛不出去就變成閒置，commit 紀錄裡有一次閒置到 39.8%。9 月底到 10 月初陸續把零頭合併進主單，最後閒置降到 4.2%。</p>
<p>10 月 9 日試過把下限改成 50，API 直接回：</p>
<div class="language-text codeBlockContainer_Ot__ theme-code-block" style="--prism-color:#9CDCFE;--prism-background-color:#1E1E1E"><div class="codeBlockContent_z6Hy"><pre tabindex="0" class="prism-code language-text codeBlock_Y5th thin-scrollbar" style="color:#9CDCFE;background-color:#1E1E1E"><code class="codeBlockLines_bbfM"><div class="token-line" style="color:#9CDCFE"><span class="token plain">minimum is 150.0 dollar or equivalent in USD</span><br></div></code></pre></div></div>
<p>1 分鐘後改回來。這也不是第一次，隔天寫的 <code>BUSINESS_RULES.md</code> 裡記著「Claude 曾多次嘗試將 min_amount 改為 50.0 以『提高資金利用率』」，所以乾脆把 150 列成「絕對不可修改」的鐵則（AI 看到閒置資金就想動下限）。這條到現在還寫在專案的 <code>CLAUDE.md</code>（給 AI 看的專案說明）裡。</p>
<h2 class="anchor anchorTargetStickyNavbar_Emow" id="log-寫-follow_trade跑的是另一套">log 寫 follow_trade，跑的是另一套<a href="https://ttylab80387.com/lending/bot-dev-01-rewrite/#log-%E5%AF%AB-follow_trade%E8%B7%91%E7%9A%84%E6%98%AF%E5%8F%A6%E4%B8%80%E5%A5%97" class="hash-link" aria-label="log 寫 follow_trade，跑的是另一套的直接連結" title="log 寫 follow_trade，跑的是另一套的直接連結" translate="no">​</a></h2>
<p>9 月 20 日的重構在 scheduler 裡留了一段 <code>FORCED OVERRIDE</code>，不管設定選什麼，一律跑 IntelligentStrategy。9 月 28 日新增 follow_trade（照市場實際成交價掛單），設定也切過去了，但強制覆蓋還在，所以紀錄上的策略名稱是 follow_trade，實際跑的是 Intelligent。follow_trade 本身的成交分析也是寫死的假資料，永遠回 6.99%。當時完全沒發現，是後來才發現對不上，兩個問題到 10 月 3 日才一起拆掉。</p>
<p>現在看來，很多 bug 的產生都是對放貸的業務規則不熟，還有一些曖昧不清的符號，記得當時明明查清楚了，但是 AI 會自作聰明地把它認為是另一個東西，就繼續出 bug。不過機器人總算跑起來的感覺，真的是蠻有趣的。</p>]]></content:encoded>
            <category>開發筆記</category>
        </item>
    </channel>
</rss>