Соберите кредитного бота для Bitfinex на Python
API Bitfinex по-настоящему приятно автоматизировать, и минимальный кредитный бот умещается примерно в шестьдесят строк Python без зависимостей, кроме requests. В этом туториале мы собираем его по-настоящему: ключ с ограниченными правами, опрос ставок, размещение подписанных офферов, наивный цикл стратегии. В конце — честный раздел о разрыве между этими шестьюдесятью строками и ботом, которому вы доверили бы реальный баланс, потому что настоящая работа — этот разрыв, а не вызовы API.
Что мы собираем
Бот, который следит за рынком фандинга USD, держит один оффер на 10% выше текущей Flash Return Rate (FRR) и позволяет спросу заёмщиков прийти к нему самому. Это единственное поведение — постоянно держать оффер выше рынка — и есть ядро большинства стратегий фандинга, потому что всплески ставок слишком короткие, чтобы гнаться за ними вручную.
Что нужно: Python 3.10+, pip install requests, аккаунт на Bitfinex и $150+ в кошельке фандинга (минимум биржи на один оффер). Всё остальное ниже.
Шаг 0: ключ, который не может вам навредить
Создайте API-ключ на Bitfinex (API Keys → Create New Key) ровно с этими правами: Margin Funding read + write, Wallets read, Account Info read. Вывод средств и трейдинг оставьте выключенными — кредитному боту они никогда не нужны, а ключ с ограниченными правами означает, что утёкший ключ может неверно оценить ваши займы, но не может опустошить ваш счёт.
Полный разбор по каждому разрешению — в нашем гиде по API Bitfinex для кредиторов; коротко: всё в этом посте работает с правами выше и ничем больше.
Шаг 1: читаем рынок (ключ не нужен)
Ставки публичны. Тикер фандинга возвращает FRR как дневную ставку под индексом 0 — умножьте на 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: цикл стратегии
Теперь сам бот: если в книге ничего не стоит, поставьте оффер на 10% выше текущей FRR и ждите. Во время рывков ставки спрос заёмщиков его исполняет; иначе он просто стоит. Это грубая версия перцентильного пола — фиксированная надбавка вместо учитывающей режим:
Это работающий кредитный бот. Он действительно будет зарабатывать проценты фандинга и в спокойные недели вас не опозорит. Но он же — намеренно — начало истории, а не её конец.
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%» — произвольная цифра. Должен ли пол быть 96-м перцентилем последних 60 дней? Стоит ли фиксировать 120 дней, когда ставки высоки для режима? Чтобы хорошо на это ответить, нужно прогонять правила по годам данных — в этом разница между скриптом и стратегией.
- Переоценка. Стоящий оффер устаревает по мере движения рынка. Продакшен-боты непрерывно переоценивают его относительно текущей книги, не распугивая исполнения.
- Состояние и перезапуски. Упадите посреди цикла и перезапуститесь: какие офферы ваши? Что исполнилось, пока вас не было? Сверка состояния биржи с намерением — это большая часть кода настоящего бота.
- Обработка сбоев. Лимиты 429, ответы 5xx, обрывы WebSocket, коллизии nonce, частичные исполнения, займы, возвращённые досрочно, — каждому нужно решение, а не необработанное исключение в 3 часа ночи.
- Учёт. Ваша настоящая доходность живёт в леджере (начисления процентов минус комиссия 15%), а не в ставке, которую вы предложили. Именно сверка записей леджера по каждой выплате делает цифры заработка и налогов реальными.
FAQ туториала
Законно ли/разрешено ли запускать бота на Bitfinex?
Да — API для этого и существует, и автоматизация фандинга — явно поддерживаемый сценарий. Уважайте лимиты запросов по эндпоинтам (HTTP 429 означает «сбавьте темп») и держите один API-ключ на процесс.
Стоит ли использовать официальную библиотеку bfxapi вместо голого requests?
Для продакшена — скорее да: она берёт на себя подпись, переподключение и всю обвязку WebSocket. В этом туториале авторизация написана вручную, чтобы вы видели, что именно происходит на проводе; концепции переносятся напрямую.
Сколько может заработать такой бот?
Столько, сколько платит рынок фандинга — исторически ~8–12% валового APR по USD в спокойных режимах, больше во время всплесков спроса, минус комиссия биржи 15%. Бот не создаёт доходность; он захватывает рыночную доходность надёжнее, чем ручное кредитование. Честное распределение — в нашем трёхлетнем исследовании данных.
Соберите сами — или перейдите сразу к стратегии
Всё сложное в этом боте — стратегия и надёжность, а не вызовы API. Stratum и есть этот продакшен-слой: 11 стратегий с бэктестами, переоценка, сверка и отчётность за тем же ключом без права вывода — фиксированная плата, без доли от заработка. Или возьмите код выше и владейте всем стеком сами; эта страница в любом случае останется здесь.