ENGINEERING19 июля 2026 г. · 12 min

Соберите кредитного бота для 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 стратегий с бэктестами, переоценка, сверка и отчётность за тем же ключом без права вывода — фиксированная плата, без доли от заработка. Или возьмите код выше и владейте всем стеком сами; эта страница в любом случае останется здесь.

Посмотреть стратегии с бэктестамиПолный гид по API Bitfinex