고주파 데이터 분석 — 틱 단위 시장 데이터 처리
암호화폐의 고주파 거래는 밀리초/마이크로초 단위로 이루어집니다. 하루에 수백만 개의 틱을 처리하고, 폭발적인 데이터 흐름을 다루며, 미시구조 신호를 추출하는 것은 전문 트레이더와 그렇지 않은 사람들을 구분하는 요소입니다. 이 가이드는 Smart Money API의 5분 갱신 주기를 가능하게 하는 틱 단위 데이터 관리 및 실시간 분석에 대해 설명합니다.
핵심 통찰: 고래들이 시장을 즉시 움직이지는 않습니다. 그들의 대량 거래는 호가창 불균형, 매수-매도 호가 스프레드, 테이커 거래량 비율에서 감지 가능한 신호를 생성합니다. Smart Money API는 이러한 신호를 실시간으로 포착합니다.
틱 데이터 수집 및 저장
데이터 소스
암호화폐의 틱 데이터는 다음에서 얻을 수 있습니다:
- 거래소 API: Bybit, Binance, Hyperliquid (WebSocket 스트림)
- 집계 서비스: CoinGecko, Kaiko, Tardis.dev (과거 + 실시간 데이터)
- 호가창 스냅샷: 100ms마다 또는 업데이트 시마다
Parquet을 이용한 효율적인 틱 저장
빠른 쿼리를 위해 압축된 칼럼 형식 데이터 저장:
Python — 틱 데이터 파이프라인
import pandas as pd
import pyarrow.parquet as pq
# 실시간 틱 버퍼 (1시간 누적 후 저장)
tick_buffer = []
def on_tick(exchange, symbol, price, size, side, timestamp):
tick_buffer.append({
"timestamp": timestamp,
"exchange": exchange,
"symbol": symbol,
"price": price,
"size": size,
"side": side # "buy" 또는 "sell"
})
# 매시간 압축하여 저장
if len(tick_buffer) > 1_000_000:
df = pd.DataFrame(tick_buffer)
pq.write_table(
pa.Table.from_pandas(df),
f"ticks/{symbol}_{timestamp:%Y%m%d_%H}.parquet",
compression="snappy"
)
tick_buffer = []
호가창 분석
레벨 2 호가창 스냅샷
100-500ms마다 전체 호가창 캡처:
Python — 호가창 처리
class OrderBook:
def __init__(self):
self.bids = {} # 가격 -> 수량
self.asks = {} # 가격 -> 수량
def update(self, side, price, size):
if side == "bid":
if size == 0: del self.bids[price]
else: self.bids[price] = size
else:
if size == 0: del self.asks[price]
else: self.asks[price] = size
def get_imbalance(self, depth=10):
# 상위 10개 매수 및 매도 호가 조회
top_bids = sorted(self.bids.items(), reverse=True)[:depth]
top_asks = sorted(self.asks.items())[:depth]
bid_volume = sum(size for _, size in top_bids)
ask_volume = sum(size for _, size in top_asks)
# 불균형: >1 = 강세 (더 많은 매수 압력)
반환 bid_volume / ask_volume 만약 ask_volume > 0 그렇지 않으면 1.0
정의 get_spread(self):
best_bid = max(self.bids.keys())
best_ask = min(self.asks.keys())
반환 (best_ask - best_bid) / best_bid # 퍼센트 스프레드
마이크로스트럭처 신호
주문 책 구조에서 실행 가능한 신호 추출:
- 매수-매도 불균형: 상위 10단계의 매수 대 매도 비율
- 스프레드 압축: 좁아지는 스프레드 = 강한 확신
- 아이스버그 식별: 동일한 가격에서 부분 체결 감지 (숨겨진 볼륨)
- 플래시 크래시: 마이크로초 내 5% 이상 급락 (유동성 이벤트)
시장 마이크로스트럭처 메트릭
볼륨 가중 평균 가격 (VWAP)
단순 종가보다 더 나은 실행 벤치마크:
Python — VWAP 계산
정의 calculate_vwap(ticks):
# ticks: (가격, 볼륨) 튜플의 리스트
numerator = sum(price * volume 에 대해 price, volume 에서 ticks)
denominator = sum(volume 에 대해 _, volume 에서 ticks)
반환 numerator / denominator
테이커 매수/매도 비율
어느 쪽이 공격적인지 식별:
Python — 테이커 분석
정의 get_taker_direction(tick):
# 거래 가격 = bid이면, 판매자가 공격적 (공급)
# 거래 가격 = ask이면, 구매자가 공격적 (수요)
만약 abs(tick.price - best_bid) < tick.price_step:
반환 "sell"
그렇지 않으면 abs(tick.price - best_ask) < tick.price_step:
반환 "buy"
그렇지 않으면:
반환 "mid" # 스프레드 내부, 아마도 다크 풀
buy_volume = sum(t.size 에 대해 t 에서 ticks 만약 get_taker_direction(t) == "buy")
sell_volume = sum(t.size 에 대해 t 에서 ticks 만약 get_taker_direction(t) == "sell")
반환 buy_volume / (buy_volume + sell_volume) # % 매수
실시간 파이프라인 아키텍처
WebSocket 스트림 처리
Bybit/Binance/Hyperliquid WebSocket에 연결하여 실시간 데이터 수신:
Python — 실시간 스트림 핸들러
가져오기 asyncio
가져오기 websockets
비동기 정의 connect_bybit_ticks(symbol):
url = f"wss://stream.bybit.com/v5/public/spot"
비동기 와 함께 websockets.connect(url) 으로 ws:
# 거래 스트림 구독
기다림 ws.send(json.dumps({
"op": "subscribe",
"args": [f"publicTrade.{symbol}"]
}))
비동기 에 대해 message 에서 ws:
data = json.loads(message)
에 대해 trade in data["data"]:
on_tick(
exchange="bybit",
symbol=symbol,
price=float(trade["price"]),
size=float(trade["size"]),
side=trade["side"],
timestamp=int(trade["time"])
)
Redis 스트림을 이용한 분산 처리
메시지 큐잉으로 하루 수백만 틱 처리:
Python — Redis 스트림 처리
import redis
r = redis.Redis(host='localhost', port=6379)
# Producer: 스트림에 틱 데이터 전송
def publish_tick(exchange, symbol, tick):
stream_key = f"ticks:{exchange}:{symbol}"
r.xadd(stream_key, {
"price": tick.price,
"size": tick.size,
"side": tick.side,
"ts": tick.timestamp
})
# Consumer group이 지연 추적하며 읽기
r.xgroup_create(stream_key, "analytics", id="$", mkstream=True)
실시간 신호를 분석에 추가하세요
Smart Money API는 3개 거래소와 250개 이상의 고래 지갑에서 틱 데이터를 집계합니다. 미리 계산된 미시구조 신호를 활용해 실시간 분석을 강화하세요.
오늘 무료로 시작하기 →