크로스 익스체인지 풋프린트
풋프린트 차트가 어떻게 Binance, Bybit, OKX, Hyperliquid 무기한 선물 깊이와 거래 흐름을 분당 bid × ask 셀로 결합하는가 — 출처, 정규화, 시간 정렬, 월 분류, 엣지 케이스, 한계.
실시간 위젯 보기: /perpetuals/footprint.
데이터 출처
네 거래소 피드, 공개 깊이 스트림만. API 키 불필요.
- Binance USDT-M 무기한. diff-stream WebSocket과 콜드 스타트의 REST 스냅샷, 모두 선물 엔드포인트. 로컬에서 시퀀스 검증된 L2 책, 자산당 상위 200 레벨 발행.
- Bybit V5 선형 무기한. 공개 WebSocket,
orderbook.<tier>.<SYMBOL>. 거래소가 지원하는 자산에서 tier 200(현재 BTC, ETH, SOL), 나머지는 tier 50. 구독 시 스냅샷 프레임, 단조 증가u증분, 시퀀스 갭 시 재구독으로 새 스냅샷 강제. - OKX V5 SWAP. 공개
books채널(400 레벨, 인증 불필요), 상위 200 레벨 보유. 스냅샷 + 업데이트 프레임은 각 항목의seqId/prevSeqId로 연결. tick-by-tick 변형도 고려했으나 우리에게 없는 VIP 수수료 티어가 필요(한계 참조). - Hyperliquid 무기한. 공개 WebSocket
l2Book구독. 거래소가 각 프레임을 원시 20레벨로 제한하므로 데몬은 자산당 점진적으로 거친nSigFigs집계로 병렬 구독을 엽니다(raw / 4 / 3, XRP·DOGE에는 추가로nSigFigs=2: 그 둘은 4 스트림, 나머지는 3 스트림). 애그리게이터가 모든 스트라이프를 발행 시 하나의 Hyperliquid 기여로 병합하고, UI는 단일 venue로 표시합니다. - 추적 자산. BTC, ETH, SOL, BNB, XRP, DOGE.
정규화: 가격과 수량
크로스 익스체인지 집계는 모든 출처가 같은 단위를 말할 때만 작동. 애그리게이터에 도달하기 전 인제스트에서 두 가지 조정이 일어남.
수량을 기초 코인으로. Binance와 Bybit은 기초 통화로 직접 수량을 반환(BTC-USDT 무기한은 BTC 단위 등). OKX는 계약 단위로 크기를 반환하며 한 계약은 기초 코인 ctVal 단위. BTC-USDT-SWAP은 ctVal = 0.01, DOGE-USDT-SWAP은 1000. OKX 피드는 시작 시 공개 instruments 엔드포인트에서 ctVal을 해석하고 발행 전에 모든 레벨에 곱셈자 적용. 이 단계가 없으면 DOGE 깊이가 크로스 익스체인지 뷰에서 1000배 깊게 읽힘.
가격을 자산별 버킷에. 거래소마다 틱 크기가 약간 다름. 애그리게이터가 가격을 가장 가까운 버킷 경계로 내림하여 거래소 간 인접 틱이 같은 벽에 병합되도록 함. 자산별 주 버킷 크기:
btc: $1.0 eth: $0.10 sol: $0.05 bnb: $0.10 xrp: $0.001 doge: $0.0001
멀티 버킷 뷰
매 사이클 같은 원시 깊이가 병렬로 자산당 두 버킷 크기로 빈됨: 주 틱(위)과 5× 거친 변형. 사용자가 어느 것을 표시할지 선택. 풋프린트은 재연결 없이 올바른 버킷으로 전환.
BTC의 경우 $1 뷰(세밀, 중간가 근처에서 밀집)와 $5 뷰. 측면당 200 버킷 빈으로 $1에서 풋프린트은 중간가 ±$200을 커버. $5 뷰는 ±$1 000에 도달하며 라운드 넘버 자석($79k / $80k / $81k)이 위치하는 곳. 같은 로직이 자산별로 스케일: ETH는 $0.10 + $0.50 발행, DOGE는 $0.0001 + $0.001 발행.
집계: 합 + 거래소별 분할
각 버킷에 대해 애그리게이터가 세 출처의 수량을 합하고 거래소별 기여를 총합과 함께 보존. UI가 단일 벽 행과 호버 시 스택 분해를 두 번째 라운드트립 없이 렌더링할 수 있게 함.
for src in (binance, bybit, okx):
for (price, qty_base) in src.depth.bids:
bucket = floor(price / BUCKET_SIZE) × BUCKET_SIZE
bid_buckets[bucket].total += qty_base
bid_buckets[bucket].by[src] += qty_base
# asks: 동일, 가격 오름차순 정렬
top_bids = sorted(bid_buckets, by price desc)[:200]
top_asks = sorted(ask_buckets, by price asc)[:200]출력 payload는 출처 리스트와 거래소별 베스트 비드/베스트 아스크를 별도로 포함. 단일 통합 베스트 비드/아스크는 노출하지 않음 — 한계 참조.
케이던스와 spoof 해상도
애그리게이터는 10 Hz로 발행(~100 ms마다 스냅샷 1개). 프로듀서 피드는 ~20 Hz까지 쓸 수 있으나 제약은 거래소 푸시율(원생 ~50-100 ms).
풋프린트 100 ms 셀 너비에서 벽과 spoof는 다음과 같이 표시:
- spoof ≥ 100 ms → 1 가시 셀(경계 탐지).
- spoof ≥ 200 ms → 2 가시 셀(신뢰 가능).
- spoof ≥ 500 ms → 5 셀, 명확한 수직 점으로 표시.
- 수 초 지속되는 벽 → 여러 셀에 걸친 수평 자국.
100 ms 미만 spoof는 탐지 불가. 우리 접근 티어에서 세 거래소 모두에 잠긴 tick-by-tick(TBT) 채널이 필요.
시간 정렬
각 프로듀서는 원생 깊이 스트림에서 거래소 이벤트 타임스탬프를 추출(Binance의 E 필드, Bybit의 top-level ts, OKX의 entry-level ts)하고 프로듀서 자신의 발행 시간과 함께 전파.
애그리게이터에서 각 스냅샷은 출처별 이벤트 타임스탬프 및 크로스 익스체인지 skew(OK 상태 출처 간 이벤트 시간 최대 - 최소)를 노출. 풋프린트 스냅샷 ts는 타임라인이 균일하게 간격을 가지도록 애그리게이터 폴링 순간으로 유지. skew는 툴팁에 ≥ 100 ms일 때 표시(≥ 300 ms는 빨강)되어 셀의 “합의”가 정직하게 경계 설정됨.
전형적 관측 skew: 정상 상태 < 100 ms. 한 출처가 일시적으로 뒤처지는 basis 스트레스 순간에 300-500 ms 피크. 이 귀속이 없으면 Binance T+0과 Bybit T+200 ms에 게시된 벽이 단일 즉시 합의로 읽혀버림 — 실제로는 그렇지 않음.
Stale 처리
각 프로듀서가 60초 TTL과 타임스탬프로 출처 키 작성. 애그리게이터가 매 사이클 출처별 나이를 계산하고 60초 이상 된 출처를 통합 뷰에서 제외. 제외된 출처는 여전히 sources 배열에 stale 상태로 나타나 FE가 저하 지시자를 렌더링.
FE: 툴바의 출처 pill이 색상 + 상태를 표시. 풋프린트은 남은 출처로 계속 작동. 지속적 stale 상태는 보통 프로듀서가 워치독 리셋을 겪었거나 WebSocket이 깨끗한 재연결 없이 끊겼음을 의미. 페이지는 조용히가 아니라 가시적으로 저하됨.
한계와 알려진 함정
- 통합 베스트 비드/아스크 없음. 크로스 익스체인지 basis는 정상. Binance BTC 무기한은 종종 Bybit과 OKX의 같은 instrument보다 $5-15 위 또는 아래로 거래. 이 기간에 단순한 통합 top-of-book은 뒤집힘(통합 베스트 비드가 통합 베스트 아스크보다 큼). 이 함정을 피하려고 위젯은 통합 벽과 거래소별 베스트 견적을 별도로 표시. 차이가 mid의 0.10 % 초과일 때만 보라색 inversion band 노출(URL의
?inv_bps=N로 설정 가능). - 깊이 커버리지. 버킷 크기당 측면당 200 버킷 빈: $1 BTC 뷰 ±$200, $5 BTC 뷰 ±$1 000 도달. mid ±2 % 라운드 넘버 앵커는 세 거래소가 공개 채널로 반환하는 범위를 넘어섬. 그 깊이는 이 방법론에서 구조적으로 보이지 않음.
- 100 ms 미만 지연. 애그리게이터는 10 Hz 폴링. 무료 공개 채널의 거래소 푸시율은 ~50-100 ms 캡. OKX tick-by-tick 변형(
books-l2-tbt,books50-l2-tbt)은 우리에게 없는 더 높은 거래 수수료 티어 필요. 구독 시code 64003반환. Bybit과 Binance는 선물에 비교 가능한 무료 tick-by-tick 채널을 발행하지 않음. - 200 레벨 ≠ 깊은 책. 각 프로듀서가 200 원시 레벨 공급. 정상 시장에서 BTC의 원생 호가 단위로 mid에서 약 $30-50까지 확장. 더 조용한 페어에서는 더 멀리 도달 가능. 책 더 깊은 벽은 버킷 크기와 무관하게 피드에 없음.
- 크로스 익스체인지 skew는 실재. 풋프린트은 균일한 100 ms 간격으로 셀 렌더링하지만 각 셀 뒤의 3 거래소 스냅샷은 이벤트 시간에
cross_exchange_skew_ms까지 걸칠 수 있음. 전형적 < 100 ms, 가끔 200-500 ms. 의미 있을 때 툴팁이 이를 노출. 시간 단위의 하한으로 다루세요.
버전
v1.0.0 최초 릴리스 2026-05-08(4 Hz 집계, 50 레벨). v2.0.0 2026-05-09: 10 Hz, 200 레벨, 멀티 버킷 뷰(자산당 $1 + $5), 출처별 이벤트 타임스탬프 정렬과 크로스 익스체인지 skew 노출로 업그레이드. v2.1.0 2026-05-21: multi-resolution l2Book 구독을 통해 Hyperliquid를 네 번째 출처로 추가(원시 20레벨 한도는 단독으로는 너무 짧음. 거친 nSigFigs 스트라이프가 mid 근처 네이티브 granularity를 유지하면서 도달 범위를 확장). v3.0.0 2026-05-23: M2 풋프린트 UI 폐지 후 크로스 익스체인지 오더북 풋프린트 방법론에서 풋프린트 방법론으로 rebrand. Substrate(출처, 정규화, 정렬)은 변경 없음 — 풋프린트 init aggregator가 동일한 `prod:agg:<asset>:history` 키를 읽음. 멀티 버킷 변형(`prod:agg:<asset>:b<size>:*`)은 같은 시기에 폐기됨(풋프린트가 유일한 소비자였음). 컴퓨트 경로의 중요 변경은 버전을 올리고 발행일을 갱신. 외관 편집은 안 함.