Cree un bot de préstamos de Bitfinex en Python
La API de Bitfinex es genuinamente agradable de automatizar, y un bot de préstamos mínimo cabe en unas sesenta líneas de Python sin más dependencias que requests. Este tutorial construye uno de verdad: clave con permisos limitados, sondeo de tasas, colocación de ofertas firmadas, un bucle de estrategia ingenuo. Al final, una sección honesta sobre la brecha entre esas sesenta líneas y un bot al que confiaría un saldo real — porque esa brecha, no las llamadas a la API, es el trabajo de verdad.
Qué vamos a construir
Un bot que vigila el mercado de financiación en USD, mantiene una oferta en reposo un 10% por encima de la Flash Return Rate (FRR) actual y deja que la demanda de los prestatarios venga a él. Ese único comportamiento — tener siempre una oferta en reposo por encima del mercado — es el núcleo de la mayoría de las estrategias de financiación, porque los picos de tasas son demasiado cortos para perseguirlos manualmente.
Requisitos previos: Python 3.10+, pip install requests, una cuenta de Bitfinex y $150+ en la billetera de financiación (el mínimo del exchange por oferta). Todo lo demás está abajo.
Paso 0: una clave que no pueda hacerle daño
Cree la clave API en Bitfinex (API Keys → Create New Key) con exactamente estos permisos: Margin Funding read + write, Wallets read, Account Info read. Deje deshabilitados los retiros y el trading — un bot de préstamos nunca los necesita, y una clave con permisos limitados significa que una clave filtrada puede fijar mal el precio de sus préstamos pero no puede vaciar su cuenta.
El detalle permiso por permiso está en nuestra guía de la API de Bitfinex para prestamistas; la versión corta es que todo lo de este artículo funciona con los permisos de arriba y nada más.
Paso 1: lea el mercado (sin clave)
Las tasas son públicas. El ticker de financiación devuelve la FRR como tasa diaria en el índice 0 — multiplique por 365 para obtener el APR. Este bucle es los ojos del bot:
Ejecútelo y ya tiene un feed de tasas en vivo. Dos convenciones para interiorizar ahora: cada tasa de Bitfinex es diaria (0.0003 ≈ 10.95% APR), y cada tasa es bruta — el exchange se queda con el 15% de los intereses ganados, así que multiplique por 0.85 para saber lo que llega a su billetera.
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
Paso 2: coloque una oferta firmada
Las escrituras requieren autenticación: HMAC-SHA384 sobre la ruta, un nonce estrictamente creciente y el cuerpo JSON. Esta es toda la capa de autenticación — no hace falta SDK:
El period es el plazo del préstamo en días (2–120). Los plazos cortos lo mantienen líquido; los largos bloquean la tasa. El monto es una cadena, mínimo el equivalente a $150. Si recibe un error nonce: small, otro proceso usó la clave — una clave por proceso, siempre.
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,
})
Paso 3: el bucle de estrategia
Ahora el bot de verdad: si no hay nada en reposo, coloque una oferta un 10% por encima de la FRR actual y espere. La demanda de los prestatarios la ejecuta durante los empujones de tasa; si no, se queda quieta. Esto es una versión rudimentaria de un suelo por percentil — un margen fijo en lugar de uno consciente del régimen:
Eso es un bot de préstamos funcional. Ganará genuinamente intereses de financiación, y en las semanas tranquilas no lo dejará en ridículo. También es, deliberadamente, el principio de la historia y no el final.
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)
Lo que estas 60 líneas no hacen
La lista honesta — cada punto es donde los bots de aficionado mueren en silencio:
- Estrategia. "FRR + 10%" es arbitrario. ¿Debería el suelo ser el percentil 96 de los últimos 60 días? ¿Debería bloquear 120 días cuando las tasas están altas para su régimen? Responder bien a eso exige reproducir reglas contra años de datos — esa es la diferencia entre un script y una estrategia.
- Reajuste de precios. Una oferta en reposo se queda obsoleta a medida que el mercado se mueve. Los bots de producción reajustan continuamente contra el libro actual sin espantar las ejecuciones a fuerza de cambios.
- Estado y reinicios. Caiga a mitad del bucle y reinicie: ¿qué ofertas son suyas? ¿Qué se ejecutó mientras estaba caído? Conciliar el estado del exchange con la intención es la mayor parte del código de un bot real.
- Manejo de fallos. Límites de tasa 429, respuestas 5xx, caídas de WebSocket, colisiones de nonce, ejecuciones parciales, préstamos devueltos antes de tiempo — cada uno necesita una decisión, no una excepción sin manejar a las 3 de la madrugada.
- Contabilidad. Su rendimiento verdadero vive en el libro mayor (créditos de intereses menos la comisión del 15%), no en la tasa que ofreció. Conciliar las entradas del libro mayor pago por pago es lo que hace reales las ganancias y las cifras fiscales.
FAQ del tutorial
¿Es legal/está permitido ejecutar un bot en Bitfinex?
Sí — la API existe para esto, y la automatización de la financiación es un uso explícitamente soportado. Respete los límites de tasa por endpoint (HTTP 429 significa retroceder) y mantenga una clave API por proceso.
¿Debería usar la librería oficial bfxapi en lugar de requests a pelo?
Para producción, probablemente sí — mantiene por usted la firma, la reconexión y la fontanería de WebSocket. Este tutorial implementa la autenticación a mano para que vea exactamente qué ocurre en el cable; los conceptos se transfieren directamente.
¿Cuánto puede ganar un bot como este?
Lo que pague el mercado de financiación — históricamente ~8–12% APR bruto para USD en regímenes tranquilos, más durante los picos de demanda, menos la comisión del 15% del exchange. El bot no crea rendimiento; captura el rendimiento del mercado con más fiabilidad que el préstamo manual. Vea nuestro estudio de datos de tres años para la distribución honesta.
Constrúyalo, o salte directamente a la parte de estrategia
Todo lo difícil de este bot es estrategia y fiabilidad, no llamadas a la API. Stratum es esa capa de producción: 11 estrategias con backtesting, reajuste de precios, conciliación e informes detrás del mismo esquema de claves sin permiso de retiro — tarifa plana, sin quedarse con parte de las ganancias. O tome el código de arriba y sea dueño de toda la pila; esta página seguirá aquí en cualquier caso.