Xây dựng bot cho vay Bitfinex bằng Python
API của Bitfinex thực sự dễ chịu để tự động hóa, và một bot cho vay tối giản gói gọn trong khoảng sáu mươi dòng Python, không phụ thuộc gì ngoài requests. Hướng dẫn này xây một bot thật sự: khóa giới hạn quyền, thăm dò lãi suất, đặt lệnh chào có chữ ký, một vòng lặp chiến lược ngây thơ. Ở cuối bài là một phần trung thực về khoảng cách giữa sáu mươi dòng này và một bot bạn dám giao số dư thật — vì khoảng cách đó, chứ không phải các lệnh gọi API, mới là công việc thực sự.
Chúng ta sẽ xây gì
Một bot theo dõi thị trường cấp vốn USD, giữ một lệnh chào nằm chờ cao hơn 10% so với Flash Return Rate (FRR) hiện tại, và để nhu cầu của người vay tự tìm đến. Chính hành vi đơn lẻ đó — luôn giữ một lệnh chào trên mức thị trường — là cốt lõi của hầu hết các chiến lược cấp vốn, vì các đợt tăng đột biến lãi suất quá ngắn để đuổi theo thủ công.
Yêu cầu trước: Python 3.10+, pip install requests, một tài khoản Bitfinex, và $150+ trong ví cấp vốn (mức tối thiểu của sàn cho mỗi lệnh chào). Mọi thứ còn lại ở bên dưới.
Bước 0: một chiếc khóa không thể làm hại bạn
Tạo khóa API trên Bitfinex (API Keys → Create New Key) với đúng các quyền sau: Margin Funding đọc + ghi, Wallets đọc, Account Info đọc. Tắt rút tiền và giao dịch — bot cho vay không bao giờ cần đến chúng, và một khóa giới hạn quyền nghĩa là khóa bị lộ có thể định giá sai khoản cho vay của bạn nhưng không thể rút cạn tài khoản.
Chi tiết từng quyền một có trong hướng dẫn API Bitfinex cho người cho vay của chúng tôi; phiên bản ngắn gọn là mọi thứ trong bài viết này hoạt động với các quyền ở trên và không cần gì thêm.
Bước 1: đọc thị trường (không cần khóa)
Lãi suất là công khai. Ticker cấp vốn trả về FRR dưới dạng lãi suất ngày ở chỉ số 0 — nhân với 365 để ra APR. Vòng lặp này là đôi mắt của bot:
Chạy nó và bạn có một luồng lãi suất trực tiếp. Hai quy ước cần khắc ghi ngay: mọi lãi suất trên Bitfinex đều là theo ngày (0.0003 ≈ 10.95% APR), và mọi lãi suất đều là gộp — sàn giữ 15% lãi kiếm được, nên hãy nhân với 0.85 để ra số thực về ví của bạn.
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
Bước 2: đặt một lệnh chào có chữ ký
Thao tác ghi yêu cầu xác thực: HMAC-SHA384 trên đường dẫn, một nonce tăng nghiêm ngặt, và phần thân JSON. Đây là toàn bộ lớp xác thực — không cần SDK:
period là kỳ hạn khoản vay tính bằng ngày (2–120). Kỳ hạn ngắn giữ bạn thanh khoản; kỳ hạn dài khóa lãi suất. Số tiền là một chuỗi ký tự, tối thiểu tương đương $150. Nếu bạn gặp lỗi nonce: small, một tiến trình khác đã dùng chiếc khóa này — một khóa cho mỗi tiến trình, luôn luôn.
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,
})
Bước 3: vòng lặp chiến lược
Giờ mới là bot thực sự: nếu không có gì đang nằm chờ, đặt một lệnh chào cao hơn 10% so với FRR hiện tại và đợi. Nhu cầu người vay sẽ khớp nó trong các đợt lãi suất đẩy lên; nếu không, nó cứ nằm đó. Đây là phiên bản thô sơ của một sàn bách phân vị — mức cộng thêm cố định thay vì một mức nhận biết chế độ thị trường:
Vậy là bạn có một bot cho vay hoạt động được. Nó sẽ thực sự kiếm lãi cấp vốn, và trong những tuần yên ắng nó sẽ không làm bạn xấu hổ. Nó cũng, một cách có chủ đích, là phần mở đầu của câu chuyện chứ không phải kết thúc.
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)
Những gì 60 dòng này không làm
Danh sách trung thực — mỗi mục là nơi các bot nghiệp dư âm thầm chết:
- Chiến lược. “FRR + 10%” là tùy tiện. Mức sàn có nên là bách phân vị 96 của 60 ngày gần nhất? Có nên khóa 120 ngày khi lãi suất cao theo chế độ? Trả lời tốt câu hỏi đó đòi hỏi chạy lại các quy tắc trên nhiều năm dữ liệu — đây là khác biệt giữa một đoạn script và một chiến lược.
- Định giá lại. Một lệnh chào nằm chờ sẽ lỗi thời khi thị trường dịch chuyển. Bot sản xuất liên tục định giá lại theo sổ lệnh hiện tại mà không tự đánh mất cơ hội khớp.
- Trạng thái và khởi động lại. Sập giữa vòng lặp rồi khởi động lại: lệnh chào nào là của bạn? Cái gì đã khớp trong lúc bạn ngừng chạy? Đối soát trạng thái trên sàn với ý định của bot chiếm phần lớn mã nguồn của một bot thực thụ.
- Xử lý lỗi. Giới hạn tần suất 429, phản hồi 5xx, rớt WebSocket, xung đột nonce, khớp một phần, khoản vay bị trả sớm — mỗi thứ cần một quyết định, không phải một exception chưa xử lý lúc 3 giờ sáng.
- Kế toán. Lợi suất thật của bạn nằm trong sổ cái (các khoản lãi được ghi có trừ đi phí 15%), không phải ở mức lãi suất bạn chào. Đối soát từng mục sổ cái theo từng lần thanh toán mới là thứ khiến con số thu nhập và thuế trở nên thật.
FAQ hướng dẫn
Chạy bot trên Bitfinex có hợp pháp/được phép không?
Có — API tồn tại cho việc này, và tự động hóa cấp vốn là mục đích sử dụng được hỗ trợ chính thức. Tôn trọng giới hạn tần suất theo từng endpoint (HTTP 429 nghĩa là hãy giảm tốc) và giữ một khóa API cho mỗi tiến trình.
Tôi có nên dùng thư viện bfxapi chính thức thay vì requests thuần không?
Cho môi trường sản xuất, có lẽ nên — nó bảo trì phần ký, kết nối lại và hạ tầng WebSocket giúp bạn. Hướng dẫn này tự viết phần xác thực để bạn thấy chính xác điều gì xảy ra trên đường truyền; các khái niệm chuyển giao trực tiếp.
Một bot như thế này có thể kiếm được bao nhiêu?
Bất cứ gì thị trường cấp vốn trả — trong lịch sử khoảng ~8–12% APR gộp cho USD ở chế độ yên ắng, cao hơn trong các đợt bùng nổ nhu cầu, trừ đi phí 15% của sàn. Bot không tạo ra lợi suất; nó bắt lợi suất thị trường một cách đáng tin cậy hơn cho vay thủ công. Xem nghiên cứu dữ liệu ba năm của chúng tôi để biết phân phối trung thực.
Tự xây, hoặc nhảy thẳng đến phần chiến lược
Mọi thứ khó của bot này nằm ở chiến lược và độ tin cậy, không phải các lệnh gọi API. Stratum chính là lớp sản xuất đó: 11 chiến lược đã backtest, định giá lại, đối soát, và báo cáo — đằng sau cùng cơ chế khóa đã tắt quyền rút tiền — phí cố định, không cắt phần trăm thu nhập. Hoặc lấy mã ở trên và tự sở hữu toàn bộ hệ thống; trang này vẫn ở đây dù bạn chọn cách nào.