크립토 스마트 오더 라우팅: 하나의 주문, 열두 개의 거래소, NBBO는 없다
400 BTC를 사야 한다. 바이낸스가 가장 깊은 뎁스를 갖고 있다. OKX와 바이빗은 각각 한 틱 넓은 가격에 괜찮은 수량을 보여준다. 코인베이스는 더 나은 헤드라인 가격을 제시하지만, USDT가 아니라 USD 기준이다. 크라켄의 최우선 호가는 훌륭해 보이지만 400밀리초나 지연된 정보다. 업비트는 그보다도 낫지만, 한국 규제 승인도 없고 KRW도 없다. 이런 난장판을 마주한 주식 트레이더라면 스마트 오더 라우터를 켜고 더 이상 생각하지 않을 것이다. 왜냐하면 주식 시장에서는 라우팅의 어려운 부분들이 이미 20년 전에 규제를 통해 인프라 차원에서 해결되었기 때문이다. 크립토에서는 당신 자신이 그 인프라다. 통합 테이프도, 주문 보호 규칙도, 수수료 상한도, 네팅 결제도 없다 — 그리고 가장 근본적으로, 자본이 이미 위치해 있지 않은 곳에서는 거래할 방법 자체가 없다.
이 글은 그럼에도 라우터를 만드는 방법을 다룬다. 통합 오더북과, 그것을 대상으로 한 단순 최적가 라우팅이 왜 돈을 잃는지, 차일드 주문의 마감 시한 안에서 실제로 풀 수 있는 컨벡스 프로그램으로서의 배분 문제, 크립토 SOR을 트레저리 관리와 떼려야 뗄 수 없게 만드는 자본 제약, 여러 거래소에 걸친 메이커 인지형 라우팅, 그리고 이 모든 것이 실제로 작동하는지 알려주는 TCA 피드백 루프까지. 이 글은 러스트로 짜는 복합 차익거래 실행의 공학적 형제뻘 되는 글이다 — 그 글이 나노초를 다룬다면, 이 글은 의사결정을 다룬다.
주식 SOR이 공짜로 얻는 것들
미국 주식 라우팅이 규제로부터 물려받는 것이 무엇인지 정확히 짚어볼 가치가 있다. 이 목록의 항목 하나하나가 크립토에서는 직접 재구축하거나, 의식적으로 포기해야 하는 것들이기 때문이다.
Regulation NMS(SEC, 2005년)는 여기서 중요한 세 가지를 해냈다. Rule 611, 즉 주문 보호 규칙(Order Protection Rule)은 다른 거래소에 표시된 보호 호가보다 나쁜 가격에 체결하는 것 — 이른바 "트레이드 스루(trade-through)" — 을 금지한다. 이는 모든 브로커가 최우선 표시 가격으로 라우팅하거나 시장간 스윕 주문(intermarket sweep order)으로 그 가격을 쓸어가도록 강제한다. Rule 610은 보호 호가를 체결시키기 위해 어떤 거래소든 부과할 수 있는 접근 수수료(access fee)를 주당 $0.003로 제한한다. 그래서 표시 가격은 거래소 간에 30밀(mil) 이내로 서로 비교 가능해진다. 그리고 통합 테이프(SIP)는 국가 최우선 매수·매도 호가(National Best Bid and Offer, NBBO)를 발표한다 — "시장이 지금 어떤가"에 대한 단일한 공식 답이다.
이 아키텍처에 대한 학계의 평가는 놀랍도록 잘 작동한다는 것이다. O'Hara and Ye (2011), "Is market fragmentation harming market quality?" (Journal of Financial Economics 100(3), 459–474)는 분절 수준이 다른 미국 주식들을 조사했고, 더 분절된 주식일수록 거래 비용이 더 낮고 체결이 더 빠르며, 가격이 랜덤워크에 더 가깝다는 것을 발견했다. 이들의 요약이 핵심 문구다. 미국 주식은 "여러 진입점을 가진 하나의 가상 시장(a single virtual market with multiple points of entry)"처럼 작동한다는 것. 스마트 라우터와 트레이드 스루 보호가 조각들을 다시 하나로 꿰매어주는 한, 분절은 무해하다. Foucault and Menkveld (2008), "Competition for Order Flow and Smart Order Routing Systems" (Journal of Finance 63(1), 119–158)는 네덜란드 시장에서 그 메커니즘을 보여주었다. 두 번째 지정가주문장(LSE의 EuroSETS)이 유로넥스트에 맞서 진입했을 때 통합 뎁스는 오히려 증가했고, 한 거래소의 유동성 공급은 그 거래소의 트레이드 스루 비율에 직접적으로 억눌렸다 — 라우터가 무시하는 거래소는 호가를 낼 유인 자체를 잃는다.
이렇게 규제된 세계에서조차, 통합된 시야는 짧은 시간 지평에서는 거짓말이다. Ding, Hanna, and Hendershott (2014), "How Slow Is the NBBO? A Comparison with Direct Exchange Feeds" (Financial Review 49(2), 313–332)는 SIP NBBO를 같은 데이터센터 안에서 거래소 직접 피드로 구축한 NBBO와 비교 측정했고, 활발히 거래되는 종목에서 초당 여러 번, 대개 1~2밀리초 지속되는 괴리를 발견했다 — 순수하게 집계와 전송 지연에서 오는 것이다. 이 숫자를 기억해두자. 이것이 바로 크립토에서는 한두 자릿수 더 심각해지는 문제의 주식 버전이다.
이제 이 모든 것을 지워보자. 크립토에는 SIP가 없으므로 NBBO도 없다. 트레이드 스루 규칙도 없다. 어떤 거래소는 다른 거래소의 호가보다 다섯 틱이나 통과한 가격에 기꺼이 체결시켜주고, 아무도 아무것도 신고하지 않는다. 수수료 상한도 없다. 테이커 수수료는 협상된 서브베이시스포인트 등급부터 소매용 10bp 스케줄까지 다양하며, 그 결과 표시 가격 순서와 순가격 순서가 일상적으로 어긋난다. 그리고 통합 청산도 없다. 모든 거래소는 사전 예치 잔고를 가진 저마다의 사일로다. 당신이 곧 SIP이고, 라우터이며, 동시에 청산기관이다.
통합 오더북 구축, 그리고 단순 최적가 라우팅이 실패하는 이유
공학적 베이스라인은 화려할 것이 없다. N개의 웹소켓 L2 피드, 거래소별 시퀀스 넘버 갭 처리, 심볼 및 틱 사이즈 정규화, 그리고 표시통화 정규화(BTC-USD 오더북과 BTC-USDT 오더북은 USDT/USD 환율만큼 차이가 나는데, 이 환율은 항상 1.0인 것도 아니고 가끔은 전혀 아니다). 정규화된 오더북들을 가격순으로 정렬된 하나의 사다리로 병합하면서, 모든 호가 레벨에 그것이 어느 거래소에서 왔는지, 그리고 결정적으로 그 스냅샷이 얼마나 오래됐는지를 태그로 붙인다. 병합된 오더북이 거래소별 호가 나이(quote age)를 1급 필드로 갖고 있지 않다면, 당신이 만든 것은 라우터가 아니라 스크린세이버다.

단순한 라우터는 이 병합된 사다리를 탐욕적으로 훑는다. 순가격이 가장 좋은 것부터. 이는 세 가지 서로 다른 이유로 실패하는데, 해법이 각각 다르므로 구분해둘 가치가 있다.
지연된 호가와 레이턴시 편차. 거래소마다 데이터가 도착하는 레이턴시가 다르다. 콜로케이션된 피드는 행동에 옮길 때 3ms밖에 안 지났을 수 있는 반면, 다른 대륙에 있는 거래소의 퍼블릭 웹소켓은 300ms나 지났을 수 있다. 그래서 병합된 최우선 호가는 서로 다른 과거들의 합성물이다. BTC가 200ms 안에 10bp 움직이는 것 — 흔한 일이다 — 이 일어나면, 지연된 거래소의 호가는 하필 잘못된 방향으로 체계적으로 매력적으로 보인다. 그쪽으로 라우팅하는 것은 이미 진 경주를 사는 셈이다. 호가는 사라지고, IOC 주문은 빈손이거나 부분 체결로 돌아오며, 재라우팅할 즈음이면 신선한 거래소들은 이미 가격을 다시 매긴 뒤다. 이것이 바로 Ding-Hanna-Hendershott의 1~2ms SIP 괴리 문제인데, 다만 여기서는 그 괴리가 수백 밀리초씩 지속되고 누구도 아무것도 지켜줄 의무가 없다는 점이 다르다.
팬텀 유동성. 여러 거래소에 걸쳐 표시된 수량을 단순 합산하면 과대 계산된다. 동일한 마켓 메이커의 재고가 여러 곳에 동시에 호가로 걸려 있기 때문이다. Van Kervel (2015), "Competition for Order Flow with Fast and Slow Traders" (Review of Financial Studies 28(7), 2094–2127)는 분절된 주식 시장에서 이를 기록했다. 한 거래소에서의 체결 직후 밀리초 단위로 경쟁 거래소들의 지정가 주문이 대규모로 취소된다는 것이다. 이는 빠른 유동성 공급자들이 모든 곳에 중복된 수량을 호가로 걸어두었다가 하나가 맞으면 나머지 사본들을 거둬들인다는 모델이 정확히 예측하는 대로다. 크립토 마켓 메이커들도 바이낸스/OKX/바이빗에 걸쳐 똑같은 전략을 구사하며, 그 결과 접근 가능한 통합 뎁스는 표시된 통합 뎁스보다 실질적으로 적고, 그 차이는 거래소들을 (동시가 아니라) 순차적으로 때릴수록 커진다. 라우터가 한 번에 한 거래소씩 체결 확인을 기다리며 차일드 주문을 보낸다면, 스스로를 낚시하고 있는 것이다. 체결 하나하나가 나머지 거래소들에 취소하라는 신호를 보내는 셈이기 때문이다.
수수료가 사다리 순서를 뒤바꾼다. 원가가 가장 좋은 가격을 보여주는 거래소가 7.5bp의 테이커 수수료를 물린다면, 그곳은 종종 오더북에서 순가격 기준 최악이다. 너무 당연해서 굳이 말할 필요도 없어 보이지만, 정작 대부분의 1세대 크립토 라우터들(그리고 여러 벤더 제품들)이 구현하는 것이 바로 이 "최고 표시 가격" 라우팅이다. 수수료를 반영한 순가격 비교는 최소한의 기준선일 뿐이다. 메이커-테이커 수수료와 리베이트를 다루는 자매 글에서는 거래소별 수수료 산식, VIP 등급 역학, 그리고 스티커 가격이 아니라 당신의 한계 수수료 등급이 라우터 안에 들어가야 하는 이유를 다룬다.
라우팅 최적화
차일드 주문 문제를 정식화해보자. 수량 를 지금 즉시, 시장가로, 여러 거래소 에 걸쳐 매수해야 한다. 를 거래소 의 오더북에서 단위를 먹어치운 뒤의 한계 매도 호가(L2 스냅샷으로부터 얻은 비감소 계단 함수)라 하고, 를 그 거래소의 테이커 수수료, 를 거래소 의 지연성 및 역선택에 대한 단위당 페널티(아래에서 자체 마크아웃으로부터 보정)라 하자. 배분 는 다음을 푼다.
각 는 컨벡스다(비감소 함수의 적분에 선형항을 더한 것이므로). 따라서 이 문제는 컨벡스 문제이고, KKT 조건이 전체 이야기를 말해준다. 어떤 임계값 가 존재해서
이며, 아무것도 받지 않는 거래소에 대해서는 다. 말로 풀면 이렇다. 물을 채우듯 주문을 여러 거래소에 흘려보내면서, 실제로 거래하는 모든 곳에서 한계 총비용을 균등하게 맞춘다. 어떤 거래소가 배제되는 것은 정확히 그 거래소의 첫 단위 — 최우선 가격에 수수료와 지연성 페널티를 더한 것 — 가 다른 곳의 한계 단위보다 나쁠 때다.

계단 함수 형태의 오더북에서 워터필링 해는 수수료와 페널티를 반영해 조정한 병합 사다리를 탐욕적으로 훑음으로써 계산된다 — 그러므로 탐욕적 뎁스 훑기 자체가 틀린 것은 아니다. 다만 원가 표시 가격이 아니라 헤어컷된 사이즈를 반영한 순한계비용을 탐욕적으로 훑을 때에 한해 그것이 정확한 해가 된다. 그 구분이 라우터와 스크린세이버를 가르는 모든 차이다.
일반적인 문제에 대한 정전(正典)급 다룸은 Cont and Kukanov, "Optimal order placement in limit order markets" (Quantitative Finance 17(1), 21–39, 2017; arXiv:1210.1625)이다. 이들은 여러 거래소에 걸친 주문 배치 — 지정가와 시장가 사이의 분할, 수수료와 리베이트, 체결 리스크에 대한 페널티까지 포함 — 를 컨벡스 최적화로 정식화하고, 단일 거래소의 지정가/시장가 분할에 대한 명시적 폐형해(closed form)를 유도했으며, 다중 거래소 사례에 대해서는 열두 개 거래소에 걸친 배분을 200ms 이내에 계산하는 확률적 근사 알고리즘을 제시한다. 이 프레임워크는 크립토보다 앞서 나왔지만 거의 손댈 것 없이 그대로 옮겨온다. 애초에 NBBO를 전혀 가정하지 않았기 때문이다 — 오직 거래소별 오더북, 거래소별 수수료, 그리고 체결에 대한 불확실성만을 가정했는데, 이는 정확히 크립토의 상황이다.
시장가 측면(지연성 헤어컷을 반영한 컨벡스 워터필)에 대한 최소한의, 정직한 스케치는 다음과 같다.
import math
from dataclasses import dataclass
@dataclass
class Venue:
name: str
asks: list[tuple[float, float]] # (price, displayed size), sorted
taker_fee: float # fractional, e.g. 0.0002 = 2 bps
quote_age_ms: float
kappa: float # phantom-liquidity decay rate, 1/ms
lam: float # staleness/toxicity penalty, $ per unit
def allocate(venues: list[Venue], Q: float):
ladder = [] # (marginal all-in cost, accessible qty, venue)
for v in venues:
surv = math.exp(-v.kappa * v.quote_age_ms) # P(level still there)
for price, size in v.asks:
cost = price * (1.0 + v.taker_fee) + v.lam
ladder.append((cost, size * surv, v.name))
ladder.sort()
fills, remaining = {}, Q
for cost, qty, name in ladder:
take = min(qty, remaining)
fills[name] = fills.get(name, 0.0) + take
remaining -= take
if remaining <= 1e-12:
break
return fills, remaining # remaining > 0 => book too thin: slice parent
로직은 16줄뿐이다. 지능은 전부 입력값에 담겨 있다. (호가 나이에 따라 표시 수량이 얼마나 빨리 증발하는지)는 전송 시점의 호가 나이의 함수로서 자체 IOC 체결 비율로부터 보정한다. 는 거래소별 마크아웃(뒷부분 참조)에서 나온다. 둘 다 추측이 아니라 측정된 값이다.
실제 예시. 세 거래소에 걸쳐 BTC를 매수한다.
| 거래소 | 테이커 수수료 | 호가 나이 | 매도호가 (가격 × 수량) |
|---|---|---|---|
| A (깊고 신선함) | 2.0 bps | 10 ms | 87,000 × 3.0; 87,010 × 4.0; 87,025 × 6.0 |
| B (저렴한 수수료, 지연됨) | 1.0 bps | 250 ms | 86,995 × 1.5; 87,015 × 2.0 |
| C (최고 헤드라인, 뚱뚱한 수수료) | 7.5 bps | 20 ms | 86,990 × 2.0; 87,000 × 3.0 |
원가 테이프만 보면 C가 최우선 매도호가(86,990)이고 그 다음이 B다. 수수료를 반영하면 사다리 순서는 완전히 뒤바뀐다. C의 최상단은 순가격 가 되어, 화면상 최악의 유동성이 된다. B의 최상단은 순가격 87,004, A는 87,017이다. B의 표시 수량에 30% 지연성 헤어컷을 적용하고() 워터필하면, B의 첫 레벨에서 1.05 BTC, A의 첫 레벨에서 3.0, B의 둘째 레벨에서 1.4, A의 둘째 레벨에서 4.0, A의 셋째 레벨에서 0.55를 가져온다. 전체 평균가는 BTC당 87,022.2달러다. 단순 최고표시가 라우터라면 — C를 먼저, 그다음 B를 원가 수량으로, 그다음 C의 둘째 레벨 순으로 — 87,038.8달러를 지불하게 된다. 1.9bp 더 나쁘고, 10 BTC 차일드 주문 하나당 약 166달러인데, 이것이 하루 종일 모든 부모 주문의 모든 차일드마다 누적된다. 그리고 핵심을 짚어보면, 테이프에서 가장 좋은 표시 가격을 보여준 거래소는 최적화된 라우터로부터 유동성을 전혀 받지 못했다. 크립토에서는 그곳에서 거래하도록 강제하는 사람이 아무도 없다 — "보호된 호가"를 통한 라우팅이라는 개념 자체가 없다 — 그리고 올바른 배분은 표면상 최우선 가격을 완전히 무시하는 일이 흔하다.
이 컨벡스 프로그램이 여전히 무시하는 것들이 있다. 동시성(모든 거래소의 차일드 주문을 같은 밀리초에 발사하지 않으면, van Kervel의 취소 현상이 체결 도중 거래소 가격을 다시 매길 것이다), 이산적인 랏 사이즈와 최소 명목가액(연속 해를 반올림한 뒤 탐욕적으로 보정), 그리고 애초에 스프레드를 건너지 않을 선택지 — 이는 다음 절의 주제다. 이 모든 거래소 로직이 실행되기 전에, 큰 부모 주문이 시간에 걸쳐 어떻게 잘려야 하는지에 대한 더 깊은 질문은 Almgren-Chriss 최적 집행을 참고하라. SOR은 차일드 주문이 어디로 가는지를 결정하지, 언제 차일드 주문이 발생하는지를 결정하지 않는다.
자본 제약: SOR은 곧 트레저리 관리다
앞의 모든 논의는 거래소 에서 수량 를 거래할 수 있다고 암묵적으로 가정했다. 주식 시장에서는 이 가정이 공짜다. 하나의 프라임 브로커, 네팅 결제, 지금 거래하고 자금은 나중에 옮기면 된다. 크립토에서는 이것이 시스템 전체를 옭아매는 제약이다. 거래소들은 사전 예치된 잔고를 요구한다 — 바이낸스에 있는 USDT로 크라켄의 매도호가를 들어올릴 수는 없다. 그래서 진짜 문제는 이렇다.
여기서 는 거래소 에서 사용 가능한 잔고다(매수의 경우 표시통화, 매도의 경우 기초자산 기준). KKT 조건은 이제 가 되며, 는 잔고 상한에 대한 라그랑주 승수다. 잔고가 캡에 걸린 거래소에서는 이다. 그곳의 한계 1달러는 시장 전체 워터 레벨보다 더 싸게 체결되는데, 어쩔 수 없이 더 비싼 거래소들로 유동성을 밀어내야 한다. 그 승수는 추상 개념이 아니다. 는 문자 그대로, 지금 거래소 에 잔고 한 단위가 더 있었다면 절약했을 달러/단위 금액이다. 향후 예상 물량에 걸쳐 합산하면, 이는 리밸런싱 이체에 대한 당신의 지불 의향이 되고, 이체 결정은 어떤 트레저리 시스템이든 실행할 수 있는 비교로 바뀐다. 다음과 같을 때 재고를 옮긴다.
우변은 작지도 일정하지도 않다. 온체인 BTC는 거래소가 입금을 인정하기까지 26번의 컨펌(2060분)이 필요하다. ERC-20 전송은 몇 분에 더해, 시장이 바쁠 때 하필 치솟는 가스비까지 든다. TRC-20과 솔라나 레일은 더 빠르고 저렴하지만 모든 곳에서 지원되지는 않는다. 그리고 모든 거래소는 자체 출금 처리 대기열을 추가로 두는데, 이는 몇 분에서 몇 시간까지 늘어나며, 하필 라우터가 재고 이동을 가장 원하는 변동성 이벤트 때 그렇게 된다. 이체 비용에 대한 완전한 계산 — 수수료, 레이턴시 분포, 이동 중 짊어지는 가격 리스크까지 — 는 펀딩비 차익거래 글에서 자세히 다루며, 그대로 옮겨온다. SOR 리밸런스는 비용 측면까지 포함해 차익거래 레그 이체와 동일한 대상이다.
이것이 바로 여기서 내면화해야 할 학술적 결론이 실행 관련 논문이 아니라 Makarov and Schoar (2020), "Trading and Arbitrage in Cryptocurrency Markets" (Journal of Financial Economics 135(2), 293–319)인 이유다. 이들은 며칠에서 몇 주씩 지속되는 거래소 간 가격 괴리를 기록했다 — 2018년 초 40%를 넘었던 한국의 "김치 프리미엄"도 포함해서 — 그리고 거래 비용으로는 이를 설명할 수 없으며, 느리고 자본 통제를 받는 차익거래 자본이 그 원인임을 보여주었다. 크립토 거래소들은 O'Hara-Ye가 말한 "여러 진입점을 가진 하나의 가상 시장"이 아니다. 이들은 느리고 비용이 많이 드는 파이프로 연결된, 부분적으로 분리된 풀들이며, 당신의 라우터는 그 분절 안에서 살아간다. 트레저리 모델 없는 크립토 SOR은 주식 SOR을 흉내 내는 코스프레일 뿐이다.

실무에서 이는 두 시간축을 가진 컨트롤러가 된다. 빠른 루프(밀리초 단위)는 매 차일드 주문마다 현재 잔고 내에서 제약된 워터필을 푼다. 느린 루프(분에서 시간 단위)는 섀도 가격 와 예상 물량의 시계열을 지켜보다가, 의 지속적인 성분이 이체 비용 허들을 넘으면 이체를 스케줄한다 — 히스테리시스를 두는데, 노이즈만으로 거래소 사이에서 재고를 핑퐁시키는 것이야말로 트론 네트워크에 자신의 엣지를 갖다 바치는 지름길이기 때문이다. 기관 데스크들은 오프익스체인지 결제(Copper ClearLoop, Ceffu MirrorX)로 이 문제를 압축한다. 담보는 커스터디언에 예치되고 거래소들에 미러링되는데, 이는 지원되는 거래소에 한해 이체 레이턴시를 극적으로 줄여준다 — 제약을 좁혀주긴 하지만 없애지는 못하며, 그 자체로 별도의 거래상대방 리스크 항목을 들여온다.
메이커 인지형 라우팅과 거래소 간 큐 게임
스프레드를 건너기만 하는 라우터는 가장 저렴한 유동성을 그대로 남겨둔다. 바로 당신 자신의 유동성 말이다. Cont-Kukanov 프레임워크는 이미 답을 담고 있다. 그들의 단일 거래소 폐형해는 수수료, 큐 포지션, 체결 리스크 회피 성향에 따라 주문을 포스팅(게시)과 테이킹(체결) 사이에 분할하며, 다중 거래소 버전은 이를 일반화한다. (메이커 수수료, 큐 길이, 차일드 마감 시한 내 체결 확률)이 유리한 거래소에는 수동적으로 포스팅하고, 즉시성이 저렴한 거래소에서는 테이크하며, 체결되지 않은 수동 잔량은 마감 시한에 테이커 최적화로 다시 진입하는 물량으로 취급한다.
크립토 특유의 두 가지 요소가 이를 주식 버전보다 더 복잡하게 만든다.
수수료 추격은 실측으로 확인된 함정이다. Battalio, Corwin, and Jennings (2016), "Can Brokers Have It All? On the Relation between Make-Take Fees and Limit Order Execution Quality" (Journal of Finance 71(5))는 지정가 주문을 최고 리베이트 거래소로 라우팅하는 미국 브로커들이 측정 가능할 정도로 더 나쁜 체결을 얻었음을 보여주었다 — 더 낮은 체결률, 더 나쁜 실현 품질. 이유는 리베이트 거래소가 바로 다른 모든 리베이트 추구자들의 주문도 몰려 있는 곳이기 때문이다. 가장 긴 큐, 가장 불리한 체결. 크립토에서도 이는 그대로 성립한다. 최고의 메이커 리베이트를 지급하는 거래소는 모든 마켓 메이커의 수동 호가를 끌어모은다. 당신의 주문은 깊은 큐에 합류하게 되고, 주로 가격이 당신을 관통하려는 순간에 체결된다. 거래소별 마크아웃 반영 순 메이커 경제성(다음 절)은 종종 수수료 스케줄과 정반대 순위를 매긴다.
레이턴시 편차는 양방향 게임이다. van Kervel이 방어적 취소로 기록했던 것과 동일한 거래소 간 정보 흐름은, 반대편에서 보면 공격적인 신호이기도 하다. 바이낸스 최우선 호가에서의 체결은 밀리초 내로 OKX의 대응 레벨에서 체결과 취소를 예측한다. 그러므로 메이커 인지형 라우터는 반드시 (a) 다른 거래소의 이벤트를 근거로 대기 주문의 가격을 다시 매겨야 한다 — 로컬 미드가 아니라 거래소 간 마이크로프라이스에 페깅해야 한다 — 그렇지 않으면 거래소 간 차익거래자들에게 잡아먹히는 느린 상대방이 되어버린다. 그리고 (b) 의도적으로 이 게임을 이용할 수도 있다. 뒤처지는 거래소에 포스팅하고, 체결되는 순간 앞서가는 거래소에서 헤지하는 것이다. 이것이 거래소 간 큐 차익거래이며, 거래소 간 차익거래 실행에서 다룬 것과 동일한 레이턴시 구조가, 단지 통계적 차익거래 북이 아니라 실행 위임 안에 내장되어 있을 뿐이다. 운영상의 요구사항은 동일하다. 거래소 A의 체결 이벤트와 거래소 B로 보내는 헤지 주문은 반드시 한 자릿수 밀리초의 동일한 코드 경로 안에서 살아야 한다. 그렇지 않으면 그 엣지는 다른 누군가의 것이 된다.
라우팅 품질 측정: 마크아웃과 순위표
주식 라우터는 Rule 605/606 공시로 규율된다. 당신의 라우터를 규율하는 것은 오직 당신 자신의 TCA뿐이다 — 집행 손실과 TCA에서 다룬 프레임워크가 스코어보드이고, 여기서는 그중 라우터에 특화된 부분을 다룬다.
가장 기본이 되는 측정치는 **거래소별 마크아웃(markout)**이다. 모든 체결 건에 대해, 에 대한 시점의 (지연 보정된 통합) 미드가를 기록하고, 음수가 시장이 체결에 불리하게 움직였음을 의미하도록 부호를 매긴다. 이를 종합해 순가격 순위표를 만든다.
| 거래소 | 테이커 체결 비중 | 실효 스프레드 (bps) | 수수료 (bps) | 마크아웃 1초 (bps) | 순가격 비용 (bps) |
|---|---|---|---|---|---|
| A | 46% | 1.4 | 2.0 | −0.6 | 4.0 |
| B | 31% | 1.9 | 1.0 | −2.1 | 5.0 |
| C | 23% | 1.2 | 7.5 | −0.4 | 9.1 |
수수료 열만 보면 B가 저렴한 거래소다. 순가격 열은 B가 사실 비싼 거래소임을 말해준다. B의 지연된 호가는 시장이 이미 그 호가를 관통해 움직이고 있을 때 선택적으로 당신을 체결시키고, 1초 마크아웃이 그 청구서를 거둬간다. 이 역전 현상 — 수수료 순위 대 실효비용 순위 — 은 데스크들이 처음 이 표를 만들 때 가장 일관되게 나오는 발견이며, 정확히 라우터 안으로 다시 들어가야 할 숫자다. 컨벡스 프로그램의 페널티는 바로 이 지속적인 거래소별 마크아웃 결손을 측정하고, 평활화하고, 업데이트한 것이다. 라우터와 TCA는 하나의 닫힌 루프를 이루거나, 아니면 둘 다 작동하지 않는다.
한 가지 방법론적 함정이 있다. 실제 운영 중인 라우터로부터 만든 순위표는 선택 편향으로 오염된다. 만약 라우터가 이미 어렵고 정보성이 높은 물량을 깊은 거래소로, 쉬운 물량을 저렴한 거래소로 보내고 있다면, 깊은 거래소의 마크아웃은 부당하게 나빠 보인다. 깔끔한 해법은 의도적인 무작위화다 — 차일드 주문의 몇 퍼센트를 균등 무작위로 라우팅하는 것(-그리디 라우터로, 퀀트라면 컨벡스 최적화 사전분포를 가진 밴딧으로 알아볼 것이다) — 이렇게 하면 반사실적(counterfactual) 비교 기준이 존재하게 된다. 무작위화된 부분에서는 몇 베이시스포인트의 비용이 들지만, 나머지 95%의 물량이 제대로 라우팅되고 있음을 입증할 수 있는 유일한 방법이다.
정리하면 이런 스택이다. 레이턴시를 정직하게 반영한 통합 오더북, 측정된 증발률과 독성 파라미터를 반영한 순한계비용에 대한 컨벡스 워터필, 섀도 가격이 이체 비용을 고려한 느린 루프를 이끄는 잔고 제약형 빠른 루프, 큐와 거래소 간 정보 흐름을 존중하는 수동 배치, 그리고 모든 파라미터를 되먹임하는 무작위화된 마크아웃 기반 TCA. 이 구성요소들은 어느 것도 개별적으로는 그리 심오하지 않다. 그러나 시스템 전체는 심오하다 — 왜냐하면 크립토에서는, 주식과 달리, 어떤 규제기관도 당신을 위해 이 층위들을 대신 지어주지 않았고, 시장은 당신이 이를 해내기 전까지, 영원히, 차일드 주문마다 2bp씩 청구할 것이기 때문이다.
Authors
Trading-systems engineer
Trading-systems engineer building bots since 2017: cross-exchange arbitrage (connected up to 30 venues), cointegration-based pairs arbitrage across spot and futures, scalping, news and sentiment-driven strategies, trend algorithms, and portfolio management and balancing algorithms. Also builds sub-millisecond order execution, big-data warehouses, backtesting engines, AI agents, and trading interfaces (incl. open-source profitmaker.cc). Stack: JS/TS, Python, Rust/Zig/Go, DevOps, backend, frontend, architecture.