ENGINEERING2026년 7월 19일 · 12 min

Python으로 Bitfinex 대출 봇 만들기

Bitfinex API는 자동화하기에 정말로 쾌적하고, 최소한의 대출 봇은 requests 외의 의존성 없이 약 60줄의 Python에 들어갑니다. 이 튜토리얼은 실제로 하나를 만듭니다: 권한 제한 키, 금리 폴링, 서명된 오퍼 제출, 단순한 전략 루프. 마지막에는 이 60줄과 실제 잔고를 맡길 수 있는 봇 사이의 간극을 솔직하게 다루는 섹션이 있습니다 — 진짜 작업은 API 호출이 아니라 바로 그 간극이기 때문입니다.

무엇을 만드나

USD 펀딩 시장을 지켜보다가 현재 Flash Return Rate(FRR)보다 10% 높은 곳에 오퍼 하나를 걸어두고, 차입자 수요가 찾아오게 하는 봇입니다. 이 단 하나의 행동 — 항상 시장 위에 오퍼를 걸어두기 — 이 대부분의 펀딩 전략의 핵심입니다. 금리 스파이크는 수동으로 쫓기에는 너무 짧기 때문입니다.

준비물: Python 3.10+, pip install requests, Bitfinex 계정, 그리고 펀딩 지갑의 $150 이상(오퍼당 거래소 최소 금액). 나머지는 모두 아래에 있습니다.

0단계: 당신을 해칠 수 없는 키

Bitfinex에서 API 키를 만들 때(API Keys → Create New Key) 정확히 다음 권한만 부여하세요: Margin Funding 읽기 + 쓰기, Wallets 읽기, Account Info 읽기. 출금과 거래는 비활성화한 채로 두세요 — 대출 봇에는 절대 필요 없고, 권한이 제한된 키라면 유출되더라도 대출 가격을 잘못 매길 수는 있어도 계정을 털어갈 수는 없습니다.

권한별 상세 설명은 저희 대출자를 위한 Bitfinex API 가이드에 있습니다. 요약하면, 이 글의 모든 내용은 위 권한만으로 동작하며 그 이상은 필요 없습니다.

1단계: 시장 읽기 (키 불필요)

금리는 공개 정보입니다. 펀딩 티커는 인덱스 0에 일 단위 금리로 FRR을 반환합니다 — APR을 얻으려면 365를 곱하세요. 이 루프가 봇의 눈입니다:

실행하면 실시간 금리 피드가 생깁니다. 지금 내면화해야 할 두 가지 관례: 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단계: 전략 루프

이제 진짜 봇입니다: 걸려 있는 오퍼가 없으면 현재 FRR보다 10% 높은 곳에 오퍼를 내고 기다립니다. 금리가 밀어 올려질 때 차입자 수요가 이를 체결시키고, 아니면 그냥 대기합니다. 이것은 백분위 하한선의 조악한 버전입니다 — 국면을 인식하는 마크업 대신 고정 마크업이죠:

이것으로 동작하는 대출 봇이 완성됩니다. 실제로 펀딩 이자를 벌어줄 것이고, 조용한 주에는 부끄럽지 않은 성과를 낼 것입니다. 동시에 이것은, 의도적으로, 이야기의 끝이 아니라 시작입니다.

                
                  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%”는 임의적입니다. 하한선을 최근 60일의 96번째 백분위로 잡아야 할까요? 금리가 국면 기준으로 높을 때 120일로 잠가야 할까요? 이 질문에 제대로 답하려면 규칙을 수년치 데이터에 재현해봐야 합니다 — 이것이 스크립트와 전략의 차이입니다.
  • 재가격. 걸어둔 오퍼는 시장이 움직이면 낡아버립니다. 프로덕션 봇은 체결 기회를 날리지 않으면서 현재 오더북에 맞춰 지속적으로 재가격합니다.
  • 상태와 재시작. 루프 중간에 크래시가 나고 재시작하면: 어떤 오퍼가 내 것인가? 다운된 동안 무엇이 체결되었나? 거래소 상태를 의도와 대조하는 일이 실제 봇 코드의 대부분입니다.
  • 장애 처리. 429 속도 제한, 5xx 응답, WebSocket 끊김, nonce 충돌, 부분 체결, 조기 상환 — 각각에 결정이 필요합니다. 새벽 3시의 처리되지 않은 예외가 아니라요.
  • 회계. 진짜 수익률은 제시한 금리가 아니라 원장(이자 입금에서 15% 수수료를 뺀 것)에 있습니다. 지급 건별 원장 항목을 대조하는 것이 수익과 세금 수치를 진짜로 만듭니다.

튜토리얼 FAQ

Bitfinex에서 봇을 돌리는 것이 합법/허용되나요?

네 — API가 바로 이것을 위해 존재하며, 펀딩 자동화는 명시적으로 지원되는 용도입니다. 엔드포인트별 속도 제한을 지키고(HTTP 429는 물러나라는 뜻), API 키는 프로세스당 하나만 사용하세요.

raw requests 대신 공식 bfxapi 라이브러리를 써야 하나요?

프로덕션이라면 아마도 그렇습니다 — 서명, 재연결, WebSocket 배관을 대신 관리해줍니다. 이 튜토리얼은 와이어에서 정확히 무슨 일이 일어나는지 볼 수 있도록 인증을 직접 구현합니다. 개념은 그대로 이전됩니다.

이런 봇으로 얼마나 벌 수 있나요?

펀딩 시장이 지급하는 만큼입니다 — 역사적으로 평온한 국면의 USD는 총 ~8–12% APR, 수요 스파이크 때는 그 이상, 여기서 15% 거래소 수수료를 뺍니다. 봇은 수익률을 만들어내지 않습니다. 시장 수익률을 수동 대출보다 더 안정적으로 포착할 뿐입니다. 정직한 분포는 저희의 3년 데이터 연구를 보세요.

직접 만들거나, 전략 파트로 건너뛰세요

이 봇에서 어려운 것은 전부 전략과 신뢰성이지 API 호출이 아닙니다. Stratum이 바로 그 프로덕션 계층입니다: 동일한 출금 비활성화 키 권한 뒤에서 백테스트된 11개 전략, 재가격, 대조, 리포팅 — 정액 요금, 수익에서 떼어가는 몫 없음. 아니면 위의 코드를 가져가 스택 전체를 직접 소유하세요. 이 페이지는 어느 쪽이든 여기 그대로 있습니다.

백테스트된 전략 보기Bitfinex API 전체 가이드