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.