ENGINEERING19 de julho de 2026 · 12 min

Construa um bot de lending na Bitfinex em Python

A API da Bitfinex é genuinamente agradável de automatizar, e um bot de lending mínimo cabe em cerca de sessenta linhas de Python sem dependências além de requests. Este tutorial constrói um de verdade: chave com escopo limitado, consulta de taxas, envio de ofertas assinadas, um loop de estratégia ingênuo. No final, uma seção honesta sobre a distância entre essas sessenta linhas e um bot em que você confiaria um saldo real — porque essa distância, e não as chamadas de API, é o verdadeiro trabalho.

O que vamos construir

Um bot que observa o mercado de funding de USD, mantém uma oferta parada 10% acima da Flash Return Rate (FRR) atual e deixa a demanda dos tomadores vir até ele. Esse único comportamento — sempre manter uma oferta parada acima do mercado — é o núcleo da maioria das estratégias de funding, porque os picos de taxa são curtos demais para perseguir manualmente.

Pré-requisitos: Python 3.10+, pip install requests, uma conta na Bitfinex e $150+ na carteira de funding (o mínimo por oferta da exchange). Todo o resto está abaixo.

Passo 0: uma chave que não pode te machucar

Crie a chave de API na Bitfinex (API Keys → Create New Key) com exatamente estes escopos: Margin Funding read + write, Wallets read, Account Info read. Deixe saques e trading desativados — um bot de lending nunca precisa deles, e uma chave com escopo limitado significa que uma chave vazada pode precificar mal seus empréstimos, mas não pode esvaziar sua conta.

O detalhamento completo, permissão por permissão, está no nosso guia da API da Bitfinex para credores; a versão curta é que tudo neste post funciona com os escopos acima e nada mais.

Passo 1: leia o mercado (sem chave)

As taxas são públicas. O ticker de funding retorna a FRR como taxa diária no índice 0 — multiplique por 365 para obter o APR. Este loop são os olhos do bot:

Rode-o e você tem um feed de taxas ao vivo. Duas convenções para internalizar agora: toda taxa da Bitfinex é diária (0.0003 ≈ 10.95% APR), e toda taxa é bruta — a exchange fica com 15% dos juros ganhos, então multiplique por 0.85 para saber o que entra na sua carteira.

                
                  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
                
              

Passo 2: envie uma oferta assinada

Escritas exigem autenticação: HMAC-SHA384 sobre o caminho, um nonce estritamente crescente e o corpo JSON. Esta é toda a camada de autenticação — nenhum SDK necessário:

O period é o prazo do empréstimo em dias (2–120). Prazos curtos mantêm você líquido; longos travam a taxa. O valor é uma string, mínimo equivalente a $150. Se você receber um erro nonce: small, outro processo usou a chave — uma chave por processo, sempre.

                
                  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,
    })
                
              

Passo 3: o loop de estratégia

Agora o bot de verdade: se nada estiver parado no livro, coloque uma oferta 10% acima da FRR atual e espere. A demanda dos tomadores a preenche durante as altas de taxa; caso contrário, ela fica parada. Esta é uma versão rudimentar de um piso por percentil — um acréscimo fixo em vez de um sensível ao regime:

Isso é um bot de lending funcional. Ele vai genuinamente ganhar juros de funding, e em semanas calmas não vai te envergonhar. Ele também é, deliberadamente, o começo da história em vez do fim.

                
                  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)
                
              

O que essas 60 linhas não fazem

A lista honesta — cada item é onde bots de hobby morrem em silêncio:

  • Estratégia. "FRR + 10%" é arbitrário. O piso deveria ser o percentil 96 dos últimos 60 dias? Você deveria travar 120 dias quando as taxas estão altas para o regime? Responder bem a isso exige reproduzir regras contra anos de dados — essa é a diferença entre um script e uma estratégia.
  • Reprecificação. Uma oferta parada fica obsoleta conforme o mercado se move. Bots de produção reprecificam continuamente contra o livro atual sem espantar os preenchimentos.
  • Estado e reinícios. Trave no meio do loop e reinicie: quais ofertas são suas? O que foi preenchido enquanto você estava fora? Reconciliar o estado da exchange com a intenção é a maior parte do código de um bot real.
  • Tratamento de falhas. Limites de taxa 429, respostas 5xx, quedas de WebSocket, colisões de nonce, preenchimentos parciais, empréstimos devolvidos antes do prazo — cada um exige uma decisão, não uma exceção não tratada às 3 da manhã.
  • Contabilidade. Seu rendimento verdadeiro vive no ledger (créditos de juros menos a taxa de 15%), não na taxa que você ofereceu. Reconciliar as entradas do ledger por pagamento é o que torna os números de ganhos e de impostos reais.

FAQ do tutorial

É legal/permitido rodar um bot na Bitfinex?

Sim — a API existe para isso, e a automação de funding é um uso explicitamente suportado. Respeite os limites de taxa por endpoint (HTTP 429 significa recuar) e mantenha uma chave de API por processo.

Devo usar a biblioteca oficial bfxapi em vez de requests puro?

Para produção, provavelmente sim — ela mantém a assinatura, a reconexão e o encanamento de WebSocket por você. Este tutorial faz a autenticação à mão para que você veja exatamente o que acontece na rede; os conceitos se transferem diretamente.

Quanto um bot como este pode ganhar?

O que o mercado de funding pagar — historicamente ~8–12% de APR bruto para USD em regimes calmos, mais durante picos de demanda, menos a taxa de 15% da exchange. O bot não cria rendimento; ele captura o rendimento do mercado com mais confiabilidade que o empréstimo manual. Veja nosso estudo de dados de três anos para a distribuição honesta.

Construa você mesmo, ou pule para a parte da estratégia

Tudo o que é difícil neste bot é estratégia e confiabilidade, não chamadas de API. A Stratum é essa camada de produção: 11 estratégias com backtest, reprecificação, reconciliação e relatórios por trás do mesmo escopo de chave sem saques — taxa fixa, sem fatia dos ganhos. Ou pegue o código acima e seja dono de toda a pilha; esta página continua aqui de qualquer forma.

Veja as estratégias com backtestGuia completo da API da Bitfinex