α Alphaware
TECH

크립토 거래소 API로 시장 데이터 파이프라인 구축하기

Binance, Bybit API에서 OHLCV, 펀딩레이트, 오더북 데이터를 수집하고 자동화하는 파이프라인을 만드는 방법입니다. 퀀트 리서치의 첫 단계는 데이터입니다.

크립토 거래소 API로 시장 데이터 파이프라인 구축하기

퀀트 리서치는 데이터에서 시작한다

전략 아이디어가 아무리 좋아도 데이터가 없으면 검증할 수 없습니다. 크립토 시장의 가장 큰 장점은 데이터가 무료로 열려 있다는 것입니다. 전통 금융에서는 Bloomberg Terminal이나 유료 데이터 피드가 필요하지만, 크립토 거래소 API는 누구나 무료로 쓸 수 있습니다.

이 글에서는 Binance API를 중심으로 OHLCV, 펀딩레이트, 오더북 데이터를 수집하는 파이프라인을 만듭니다.


Binance API 기초

Binance는 가장 큰 크립토 거래소이고, API 문서화가 잘 되어 있습니다. REST API와 WebSocket 두 가지를 제공합니다.

설치

pip install python-binance pandas

OHLCV(캔들) 데이터 수집

from binance.client import Client
import pandas as pd

client = Client()  # 공개 데이터는 API 키 불필요

def get_ohlcv(symbol: str = "BTCUSDT", 
              interval: str = "1h",
              limit: int = 1000) -> pd.DataFrame:
    """Binance에서 OHLCV 데이터 가져오기"""
    klines = client.get_klines(
        symbol=symbol,
        interval=interval,
        limit=limit
    )
    
    df = pd.DataFrame(klines, columns=[
        'open_time', 'open', 'high', 'low', 'close', 'volume',
        'close_time', 'quote_volume', 'trades',
        'taker_buy_base', 'taker_buy_quote', 'ignore'
    ])
    
    # 타입 변환
    for col in ['open', 'high', 'low', 'close', 'volume']:
        df[col] = df[col].astype(float)
    
    df['open_time'] = pd.to_datetime(df['open_time'], unit='ms')
    df.set_index('open_time', inplace=True)
    
    return df[['open', 'high', 'low', 'close', 'volume']]

# 사용
btc_1h = get_ohlcv("BTCUSDT", "1h", 500)
print(btc_1h.tail())

장기 데이터 수집 (1년+)

limit=1000이 최대이므로, 긴 기간의 데이터는 분할 요청해야 합니다.

from datetime import datetime, timedelta

def get_historical_ohlcv(symbol: str,
                          interval: str,
                          start_date: str,
                          end_date: str = None) -> pd.DataFrame:
    """장기 OHLCV 데이터 수집"""
    klines = client.get_historical_klines(
        symbol=symbol,
        interval=interval,
        start_str=start_date,
        end_str=end_date
    )
    
    df = pd.DataFrame(klines, columns=[
        'open_time', 'open', 'high', 'low', 'close', 'volume',
        'close_time', 'quote_volume', 'trades',
        'taker_buy_base', 'taker_buy_quote', 'ignore'
    ])
    
    for col in ['open', 'high', 'low', 'close', 'volume']:
        df[col] = df[col].astype(float)
    
    df['open_time'] = pd.to_datetime(df['open_time'], unit='ms')
    df.set_index('open_time', inplace=True)
    
    return df[['open', 'high', 'low', 'close', 'volume']]

# 2025년 1월부터 현재까지 BTC 4시간봉
btc_4h = get_historical_ohlcv("BTCUSDT", "4h", "2025-01-01")
print(f"수집된 캔들 수: {len(btc_4h)}")

펀딩레이트 수집

선물 시장의 펀딩레이트는 롱/숏 포지션 불균형을 보여주는 중요한 지표입니다. 펀딩레이트가 지속적으로 높으면 롱 과열, 낮으면 숏 과열입니다.

def get_funding_rate(symbol: str = "BTCUSDT", 
                      limit: int = 500) -> pd.DataFrame:
    """Binance 선물 펀딩레이트 조회"""
    data = client.futures_funding_rate(
        symbol=symbol,
        limit=limit
    )
    
    df = pd.DataFrame(data)
    df['fundingTime'] = pd.to_datetime(df['fundingTime'], unit='ms')
    df['fundingRate'] = df['fundingRate'].astype(float)
    df.set_index('fundingTime', inplace=True)
    
    return df[['fundingRate']]

funding = get_funding_rate("BTCUSDT")
print(f"현재 펀딩레이트: {funding.iloc[-1]['fundingRate']:.6f}")
print(f"7일 평균: {funding.tail(21)['fundingRate'].mean():.6f}")

펀딩레이트 시그널

def funding_rate_signal(funding_df: pd.DataFrame) -> str:
    """펀딩레이트 기반 시장 과열 신호"""
    current = funding_df.iloc[-1]['fundingRate']
    avg_7d = funding_df.tail(21)['fundingRate'].mean()
    
    if current > 0.01:  # 1% 이상
        return "EXTREME_LONG"  # 롱 극단적 과열
    elif current > avg_7d * 3:
        return "OVERHEATED_LONG"  # 롱 과열
    elif current < -0.005:
        return "EXTREME_SHORT"  # 숏 극단적 과열
    else:
        return "NEUTRAL"

오더북 스냅샷

오더북 깊이(depth)는 지지/저항 수준을 실시간으로 확인하는 데 쓰입니다. 특정 가격대에 대량 주문이 쌓여 있으면 그 가격을 넘기기 어렵습니다.

def get_orderbook(symbol: str = "BTCUSDT", 
                   limit: int = 100) -> dict:
    """오더북 스냅샷 조회"""
    depth = client.get_order_book(symbol=symbol, limit=limit)
    
    bids = pd.DataFrame(depth['bids'], columns=['price', 'qty'])
    asks = pd.DataFrame(depth['asks'], columns=['price', 'qty'])
    
    for df in [bids, asks]:
        df['price'] = df['price'].astype(float)
        df['qty'] = df['qty'].astype(float)
        df['value'] = df['price'] * df['qty']
    
    return {
        'bids': bids,
        'asks': asks,
        'bid_wall': bids.nlargest(3, 'value'),  # 매수벽 상위 3개
        'ask_wall': asks.nlargest(3, 'value'),  # 매도벽 상위 3개
    }

book = get_orderbook("BTCUSDT")
print("매수벽 (지지):")
print(book['bid_wall'][['price', 'value']])
print("\n매도벽 (저항):")
print(book['ask_wall'][['price', 'value']])

자동 수집 파이프라인

매시간 데이터를 자동으로 수집하고 파일로 저장하는 간단한 파이프라인입니다.

import schedule
import time
from pathlib import Path

DATA_DIR = Path("data")
DATA_DIR.mkdir(exist_ok=True)

def collect_and_save():
    """매시간 실행: OHLCV + 펀딩레이트 저장"""
    timestamp = datetime.now().strftime("%Y%m%d_%H")
    
    # OHLCV
    ohlcv = get_ohlcv("BTCUSDT", "1h", 24)
    ohlcv.to_parquet(DATA_DIR / f"btc_1h_{timestamp}.parquet")
    
    # 펀딩레이트
    funding = get_funding_rate("BTCUSDT", 10)
    funding.to_parquet(DATA_DIR / f"funding_{timestamp}.parquet")
    
    print(f"[{timestamp}] 수집 완료")

# 매시간 실행
schedule.every(1).hours.do(collect_and_save)

while True:
    schedule.run_pending()
    time.sleep(60)

프로덕션에서는 이 스크립트를 cron 또는 systemd로 데몬화하고, 에러 발생 시 Slack 알림을 붙입니다. Railway에 올려서 서버리스로 돌리는 것도 방법입니다.


API 키가 필요한 경우

공개 데이터(OHLCV, 오더북, 펀딩레이트)는 API 키 없이 조회 가능합니다. 하지만 다음 기능에는 키가 필요합니다:

  • 계좌 잔고 조회
  • 주문 실행
  • 포지션 관리
  • WebSocket 사용자 데이터 스트림

API 키는 Binance 계정 설정에서 발급합니다. IP 제한읽기 전용 권한을 반드시 설정하세요. 출금 권한은 절대 주지 마세요.


여러 거래소 데이터 통합

Binance 하나만 보면 시장 전체를 놓칩니다. ccxt 라이브러리를 쓰면 100개 이상의 거래소를 같은 인터페이스로 접근할 수 있습니다.

import ccxt

def compare_funding_rates():
    """거래소별 펀딩레이트 비교"""
    exchanges = {
        'binance': ccxt.binance(),
        'bybit': ccxt.bybit(),
    }
    
    for name, ex in exchanges.items():
        try:
            funding = ex.fetch_funding_rate('BTC/USDT:USDT')
            rate = funding.get('fundingRate', 0)
            print(f"{name}: {rate:.6f}")
        except Exception as e:
            print(f"{name}: error - {e}")

거래소 간 펀딩레이트 차이가 크면 차익거래 기회가 있을 수 있습니다.


결론

크립토 데이터 수집은 퀀트 리서치의 기본 인프라입니다. Binance API로 시작하면 OHLCV, 펀딩레이트, 오더북을 무료로 수집할 수 있고, ccxt로 다른 거래소까지 확장할 수 있습니다.

데이터가 쌓이면 그때부터 팩터 분석, 시그널 생성, 백테스트를 본격적으로 시작할 수 있습니다.


Binance 가입하기 — 이 레퍼럴 링크로 가입하면 거래 수수료 할인이 적용됩니다.

#binance #api #data-pipeline #crypto #python

Newsletter

주간 퀀트·마켓 인사이트 구독

시장 분석, 퀀트 전략 아이디어, AI·데이터 도구 인사이트를 이메일로 받아보세요.

구독하기 →
같은 카테고리 더 보기 TECH →