用 Python 打造 Bitfinex 借貸機器人
Bitfinex 的 API 用起來確實舒服,一個最精簡的借貸機器人大約六十行 Python 就能完成,除了 requests 之外不需要任何相依套件。這份教學會實際做出一個:限定權限的金鑰、輪詢利率、送出簽名委託、一個天真的策略迴圈。文末有一段誠實的說明,講清楚這六十行與一個你敢託付真實資金的機器人之間的差距 — 因為真正的工作量在那道差距,不在 API 呼叫。
我們要打造什麼
一個監看 USD 融資市場的機器人:它會維持一筆掛在當前 Flash Return Rate(FRR)上方 10% 的委託,讓借款需求自己上門。這個單一行為 — 永遠在市場上方掛著委託 — 是多數融資策略的核心,因為利率飆升太短,手動追不上。
前置條件:Python 3.10+、pip install requests、一個 Bitfinex 帳戶,以及融資錢包裡 $150 以上的資金(交易所的單筆委託下限)。其餘都在下面。
步驟 0:一把傷不了你的金鑰
在 Bitfinex 建立 API 金鑰(API Keys → Create New Key),權限只勾這些:Margin Funding 讀取 + 寫入、Wallets 讀取、Account Info 讀取。提款與交易保持停用 — 借貸機器人永遠不需要它們,而限定權限的金鑰意味著即使金鑰外洩,最多只會讓你的放貸定價失準,卻無法掏空你的帳戶。
逐項權限的完整說明在我們的 Bitfinex 貸方 API 指南裡;簡短版是:本文的一切只需要上述權限,不需要更多。
步驟 1:讀取市場(不需要金鑰)
利率是公開的。融資 ticker 的索引 0 會回傳以日利率表示的 FRR — 乘以 365 就是 APR。這個迴圈就是機器人的眼睛:
執行它,你就有了即時利率來源。現在就該內化的兩個慣例:Bitfinex 的每個利率都是日利率(0.0003 ≈ 10.95% APR),而且每個利率都是毛額 — 交易所會保留已賺取利息的 15%,所以乘以 0.85 才是實際進到你錢包的金額。
import requests, time
PUB = "https://api-pub.bitfinex.com"
def frr_apr(symbol: str = "fUSD") -> float:
ticker = requests.get(f"{PUB}/v2/ticker/{symbol}", timeout=10).json()
return ticker[0] * 365 * 100 # index 0 = FRR, a daily rate
while True:
print(f"FRR now: {frr_apr():.2f}% APR")
time.sleep(300) # poll every 5 minutes — stay well inside rate limits
步驟 2:送出簽名委託
寫入需要驗證:對路徑做 HMAC-SHA384、一個嚴格遞增的 nonce,以及 JSON 主體。這就是整個驗證層 — 不需要 SDK:
period 是以天為單位的貸款期限(2–120)。短期讓你保持流動;長期則鎖定利率。金額是字串,最低相當於 $150。如果遇到 nonce: small 錯誤,代表有另一個程序用了同一把金鑰 — 一把金鑰配一個程序,永遠如此。
import hashlib, hmac, json, time, requests
KEY, SECRET = "your-key", "your-secret"
BASE = "https://api.bitfinex.com"
def auth_post(path: str, body: dict):
nonce = str(int(time.time() * 1_000_000)) # must strictly increase per key
raw = f"/api/{path}{nonce}{json.dumps(body)}"
sig = hmac.new(SECRET.encode(), raw.encode(), hashlib.sha384).hexdigest()
return requests.post(f"{BASE}/{path}", data=json.dumps(body), timeout=15, headers={
"bfx-nonce": nonce, "bfx-apikey": KEY, "bfx-signature": sig,
"content-type": "application/json",
}).json()
def place_offer(rate_daily: float, amount: str = "150", period: int = 2):
return auth_post("v2/auth/w/funding/offer/submit", {
"type": "LIMIT", "symbol": "fUSD",
"amount": amount, "rate": f"{rate_daily:.8f}", "period": period,
})
步驟 3:策略迴圈
接下來是真正的機器人:如果沒有委託在掛,就在當前 FRR 上方 10% 掛一筆委託然後等待。利率上推時借款需求會把它成交;否則它就靜靜待著。這是百分位下限的粗糙版本 — 用固定加價取代能感知情境的加價:
這就是一個能運作的借貸機器人了。它確實會賺到融資利息,在平靜的週裡也不會讓你難堪。但它同時也刻意只是故事的開頭,而非結局。
def tick():
apr = frr_apr()
# naive floor strategy: rest 10% above the current FRR and wait to be hit
target_daily = (apr * 1.10) / 365 / 100
offers = auth_post("v2/auth/r/funding/offers/fUSD", {})
if not offers: # nothing resting -> place one
place_offer(target_daily)
# a real bot also reprices stale offers, sizes per wallet balance,
# handles partial fills, retries 429s, and survives restarts
while True:
tick()
time.sleep(600)
這 60 行沒有做的事
誠實清單 — 每一項都是業餘機器人悄悄陣亡的地方:
- 策略。「FRR + 10%」是隨意定的。下限應該是過去 60 天的第 96 百分位嗎?利率處於情境高點時該鎖 120 天嗎?要好好回答這些問題,需要把規則拿去重播多年的資料 — 這就是腳本與策略的差別。
- 重新定價。市場一動,掛著的委託就會過時。正式環境的機器人會持續依照當前委託簿重新定價,同時不會因頻繁改單而錯失成交。
- 狀態與重啟。迴圈跑到一半崩潰後重啟:哪些委託是你的?停機期間成交了什麼?把交易所狀態與你的意圖對帳,佔了一個真正機器人程式碼的大部分。
- 失敗處理。429 速率限制、5xx 回應、WebSocket 斷線、nonce 衝突、部分成交、貸款提前償還 — 每一項都需要一個決策,而不是凌晨三點的一個未處理例外。
- 帳務。你的真實收益在分類帳裡(利息入帳減去 15% 費用),不在你掛出的利率上。逐筆對帳每筆利息分類帳項目,才能讓收益與稅務數字站得住腳。
教學 FAQ
在 Bitfinex 上跑機器人合法/被允許嗎?
是 — API 就是為此存在的,融資自動化是明確受支援的用途。請遵守各端點的速率限制(HTTP 429 表示要退避),並且一把 API 金鑰只給一個程序使用。
我該改用官方的 bfxapi 函式庫而不是原生 requests 嗎?
要上正式環境的話,大概是的 — 它幫你維護簽名、重連與 WebSocket 這些管線。這份教學手工實作驗證,是為了讓你確切看到線路上發生了什麼;概念可以直接轉移過去。
這樣的機器人能賺多少?
融資市場付多少就是多少 — 歷史上 USD 在平靜情境約為 8–12% 毛 APR,需求飆升時更高,再扣掉交易所的 15% 費用。機器人不會創造收益;它只是比手動放貸更可靠地捕捉市場收益。誠實的分布請見我們的三年資料研究。
自己動手做,或直接跳到策略那一段
這個機器人真正困難的地方是策略與可靠性,不是 API 呼叫。Stratum 就是那一層正式環境:11 個經回測的策略、重新定價、對帳與報表,同樣建立在停用提款的金鑰權限之上 — 固定費用,不抽收益。或者拿上面的程式碼自己掌握整個技術棧;無論哪條路,這一頁都會留在這裡。