L2 데이터로 대기 순번 추정하는 방법
대기 순번은 수동적 주문의 체결 여부를 결정하는 핵심 요소입니다. 집계된 호가창 데이터를 활용해 대기 순번을 추정하는 구체적인 방법과 더 정확한 판단을 위해 MBO 데이터를 도입해야 하는 상황을 설명합니다.
대기 순번의 이해와 추정
대기 순번(queue position)은 특정 가격에 대기 중인 주문들 사이에서 본인의 주문이 위치한 순서를 의미합니다. 가격-시간 우선순위(price-time priority)가 적용되는 거래소에서 이 순번은 수동적 주문(passive order)이 스프레드(spread)를 취할지, 아니면 체결되지 않을지를 결정합니다. 집계된 시장 데이터는 이 숫자를 직접 제공하지 않습니다. 레벨 2(Level 2) 호가창은 각 가격대에 얼마나 많은 물량이 대기 중인지는 보여주지만, 누구의 주문인지는 나타내지 않습니다. 다음은 대부분의 트레이더가 접근 가능한 데이터를 바탕으로 대기 순번을 추정하는 방법과, 추정치만으로는 충분하지 않은 상황을 판단하는 기준입니다.
큐 포지션이 모든 우위를 결정하는 이유
수동적 주문(passive order)은 호가창에 머물며 다른 시장 참여자가 스프레드(spread)를 가로질러 체결해주기를 기다립니다. 가격-시간 우선순위(price-time priority) 체계 하에서, 매칭 엔진은 우선 가격을 기준으로, 그다음에는 도착 시간을 기준으로 주문 순위를 정합니다. 만약 10.00달러에 1만 주의 매수 주문이 이미 대기 중인 상태에서 뒤에 100주를 추가한다면, 앞선 1만 주가 모두 체결되거나 취소되어야 귀하의 차례가 옵니다. 같은 가격에 주문을 취소하고 다시 진입하면 대기열의 맨 뒤로 밀려납니다.
이러한 순위가 경제적 성과를 결정합니다. 앞쪽에 위치하면 거래가 자주 발생하며 스프레드 수익과 함께 메이커-테이커 수수료 및 리베이트(maker-taker fees and rebates)를 챙길 수 있습니다. 뒤쪽에 위치하면 앞선 모든 주문이 체결된 후에야 거래가 이루어지는데, 이는 한쪽 방향으로 대규모 주문 흐름이 유입될 때 발생합니다. 뒤쪽에서의 체결은 가격이 해당 호가를 뚫고 지나가기 직전 순간에 집중됩니다. 같은 가격, 같은 주문이라도 결과는 정반대가 됩니다.
Level 2 데이터가 보여줄 수 있는 것과 없는 것
Level 1은 각 호가에서의 수량을 포함한 최우선 매수 및 매도 호가입니다. 시장 가격별 데이터(market by price)라고도 불리는 Level 2는 여기에 깊이를 더합니다. 즉, 각 가격 수준에 대기 중인 총 수량을 나열한 목록입니다. 두 데이터 모두 집계된 정보이며, Level 1 대 Level 2 시장 데이터에서 상세히 비교합니다. 10.00달러의 매수 호가가 1만 주에서 8,500주로 감소하면, 피드는 1,500주가 사라졌음을 보고합니다. 이 데이터는 해당 수량이 체결되었는지, 하나의 주문이 취소되었는지 혹은 40개의 주문이 취소되었는지, 아니면 대기 순서 중 어느 위치에 있던 주문이었는지는 알려주지 않습니다.
체결(execution)은 가시적인 절반의 영역입니다. 테이프(tape)는 모든 거래를 수량과 함께 기록(print)하므로, 체결된 수량은 정확히 산출할 수 있습니다. 나머지는 취소 주문이며, 취소 주문부터는 추측이 시작됩니다. 아래 패널은 2026년 6월 10일 수요일, 평범한 장세에서 유동성이 높은 한 종목을 대상으로 통합 최우선 호가(consolidated top of book)의 메시지 수와 테이프에 기록된 체결 건수를 비교한 것입니다.
모든 수치 뒤에 숨겨진 정확한 SQL
SELECT
q.et_time AS et_time,
q.quote_updates AS quote_updates,
t.trades AS trades,
round(q.quote_updates / t.trades, 1) AS updates_per_trade
FROM
(
SELECT
formatDateTime(toStartOfHour(toTimeZone(sip_timestamp, 'America/New_York')), '%H:%i') AS et_time,
count() AS quote_updates
FROM global_markets.cache_stocks_quotes
WHERE ticker = 'AAPL'
AND sip_timestamp >= '2026-06-10 12:00:00'
AND sip_timestamp < '2026-06-10 20:00:00'
GROUP BY et_time
) AS q
INNER JOIN
(
SELECT
formatDateTime(toStartOfHour(toTimeZone(sip_timestamp, 'America/New_York')), '%H:%i') AS trade_hour,
count() AS trades
FROM global_markets.stocks_trades
WHERE ticker = 'AAPL'
AND sip_timestamp >= '2026-06-10 12:00:00'
AND sip_timestamp < '2026-06-10 20:00:00'
GROUP BY trade_hour
) AS t ON q.et_time = t.trade_hour
ORDER BY et_time08:00 시간대는 개장 벨이 울리기 전입니다. 해당 시간 동안 최우선 호가는 체결 건당 0.8회 변동했으며, 이는 체결 건수보다 메시지 수가 적었음을 의미합니다. 정규장 내에서는 이 비율이 뒤집힙니다. 15:00 시간대에는 최우선 호가가 체결 건당 1.6회 변동했으며, 해당 시간 한 시간 동안에만 총 233433건의 메시지가 발생했습니다. 공개 시장에서 특정 가격 수준에 발생하는 대부분의 현상은 주문이 체결되지 않은 채 유입되고 이탈하는 것입니다. 이러한 각각의 이벤트는 집계된 피드에서는 확인할 수 없는 수준으로 대기 순서를 변화시킵니다.
균등 취소 가정과 그로 인한 착시
표준적인 초기 분석 모델은 주문 취소가 대기열 전체에 균등하게 분포한다고 가정합니다. 당신의 상대적 위치를 x라고 하면, 이는 당신 앞에 놓인 주식 수를 해당 가격대의 총 잔량으로 나눈 값입니다. 균등 모델은 취소된 주식이 당신 앞에 있었을 확률을 x로 설정하며, 이를 p(x) = x로 표기합니다. 1만 주 대기열의 중간에 위치한 상태에서 1천 주가 체결(print) 없이 취소된다면, 이 모델은 당신의 순번이 500계단 앞당겨졌다고 계산합니다.
실제 대기열은 편향되어 있습니다. 이미 오랫동안 대기한 주문은 기다릴 의사가 있는 투자자의 것일 가능성이 높지만, 방금 추가된 주문은 수 초 내에 사라질 일시적인 호가일 가능성이 훨씬 큽니다. 취소는 대기열의 뒤쪽, 즉 당신 근처나 당신 뒤쪽으로 집중되는 경향이 있습니다. 취소된 1천 주 중 실제로는 200주만이 당신 앞에 있었을지라도, 모델은 당신에게 500주만큼의 이득을 부여합니다. 이를 하루 종일 반복하면 시뮬레이션상의 대기열은 실제보다 더 빠르게 줄어듭니다. 이 오류는 한 방향으로만 작용하여, 실제 주문이 체결되는 것보다 더 많은 체결이, 더 유리한 시점에 발생하는 것처럼 나타나게 합니다.
대기열이 소진되는 방식
주문 취소는 보이지 않는 곳에서 순위를 이동시킵니다. 체결(trades)은 체결된 거래량(prints)의 규모를 통해 눈에 보이는 방식으로 순위를 이동시킵니다.
모든 수치 뒤에 숨겨진 정확한 SQL
SELECT
multiIf(size < 100, 'under 100 shares',
size = 100, 'exactly 100 shares',
size <= 499, '101 to 499 shares',
size <= 999, '500 to 999 shares',
'1000 shares or more') AS trade_size_group,
round(100 * count() / sum(count()) OVER (), 1) AS share_of_prints_pct,
round(100 * sum(size) / sum(sum(size)) OVER (), 1) AS share_of_shares_pct
FROM global_markets.stocks_trades
WHERE ticker = 'AAPL'
AND sip_timestamp >= '2026-06-10 14:00:00'
AND sip_timestamp < '2026-06-10 20:00:00'
GROUP BY trade_size_group
ORDER BY min(size)이번 세션에서 100주 미만의 소량 거래는 전체 체결 건수의 90%를 차지했으며, 전체 거래량의 42.5%를 기록했습니다. 1,000주 이상의 대량 거래(blocks)는 전체 체결 건수의 0.2%, 전체 거래량의 19.9%를 차지했습니다. 대기열은 작은 단위로 소진되므로, 2,000번째 순위와 3,500번째 순위 사이의 간극은 수백 건의 대기 체결 내역을 의미합니다. 두 번의 대규모 거래 이후 체결이 이루어진다고 가정하는 시뮬레이터는 실제 시장의 대부분 거래 흐름(tape)을 간과한 것입니다.
보이지 않는 주문
호가창(depth feed) 데이터는 일정 수준에서 잘립니다. 만약 10단계의 호가 정보를 수신하는데 본인의 주문이 11번째 단계에 있다면, 해당 주문은 데이터 범위 밖에 위치하게 됩니다. 따라서 앞선 주문 물량이나 뒤따르는 주문 물량을 확인할 수 없습니다. 이 시점부터는 추정이 아닌 추측으로 숫자를 산출하게 됩니다. 시장을 쫓아가지 않는 주문은 내부 호가에서 빠르게 멀어지기 때문에, 이러한 상황은 이례적인 것이 아니라 일상적으로 발생합니다.
모든 수치 뒤에 숨겨진 정확한 SQL
SELECT
formatDateTime(toStartOfFifteenMinutes(toTimeZone(sip_timestamp, 'America/New_York')), '%H:%i') AS et_time,
round(avg(toFloat64(bid_price)), 2) AS best_bid,
uniqExact(bid_price) AS bid_levels_touched
FROM global_markets.cache_stocks_quotes
WHERE ticker = 'AAPL'
AND sip_timestamp >= '2026-06-10 14:00:00'
AND sip_timestamp < '2026-06-10 20:00:00'
AND bid_price > 0
GROUP BY et_time
ORDER BY et_time10:00 구간에서 최우선 매수호가(best bid)는 평균 290.29달러였으며, 15분 동안 187개의 서로 다른 가격대를 기록했습니다. 페니 단위로 호가가 제시되는 주식의 경우 각 가격은 별도의 레벨이므로, 10단계 호가창은 10센트 범위의 오더북(book)만을 보여줍니다. 이와 같은 장세에서 특정 가격에 남겨둔 주문은 주문자가 확인할 수 있는 가장 깊은 호가보다 낮은 위치에서 오랜 시간 머무를 수 있습니다.
대기 순번의 가치가 가장 높은 경우
가격 개선이 불가능한 상황에서 대기 순번(queue position)의 가치는 극대화됩니다. 호가 스프레드(spread)가 1센트에 고정된 종목은 더 나은 가격으로 우선권을 확보할 여지가 없습니다. 모든 주문이 동일한 틱(tick)에 쌓이므로, 도착 시간이 우선순위를 결정합니다. 반면 스프레드가 수 센트 이상으로 넓은 경우, 트레이더는 1센트 더 유리한 가격을 제시하여 전체 대기열의 앞줄로 이동할 수 있으며, 이때는 가격 결정이 대기 순번보다 우선합니다.
모든 수치 뒤에 숨겨진 정확한 SQL
SELECT
ticker AS symbol,
round(avg(toFloat64(ask_price - bid_price)) * 100, 2) AS avg_spread_cents,
round(100 * countIf(round(toFloat64(ask_price - bid_price) * 100) <= 1) / count(), 1) AS one_cent_pct
FROM global_markets.cache_stocks_quotes
WHERE ticker IN ('SPY', 'AAPL', 'KO', 'NVDA', 'MSFT', 'BKNG')
AND sip_timestamp >= '2026-06-10 15:00:00'
AND sip_timestamp < '2026-06-10 19:00:00'
AND bid_price > 0
AND ask_price > bid_price
GROUP BY ticker
ORDER BY avg_spread_cents동일한 세션의 정오 무렵 4시간 동안, 6개 종목 중 가장 호가가 촘촘한 KO는 평균 1.18센트의 스프레드를 기록했으며, 업데이트의 82.5%에서 1센트 스프레드를 보였습니다. 가장 넓은 종목인 MSFT는 평균 8.46센트였으며, 업데이트의 1.1%에서 1센트 스프레드를 나타냈습니다. 첫 번째 종목을 기준으로 보정한 대기열 모델은 두 번째 종목에 대해 유의미한 정보를 제공하지 못합니다. 호가 사이에 위치하는 주문들은 중간가 페그 주문(midpoint peg orders)에서 다루며, 동일한 규칙에 따라 별도의 대기열을 형성합니다.
백테스트를 위한 네 가지 진단
- 시뮬레이션상의 체결률과 동일 종목, 동일 시간대에 발생한 실제 체결률을 비교하십시오. 실제로는 40%의 확률로 체결되는 주문을 시뮬레이터가 70%의 확률로 체결시킨다면, 이는 시장이 아닌 귀하의 가정을 묘사하고 있는 것입니다.
- 시뮬레이션된 체결 건을 두 가지로 분류하십시오. 가격 수준이 이후에도 유지된 경우와 해당 가격대가 완전히 소진되면서 체결된 경우입니다. 후자의 비중이 높다면, 시뮬레이터는 가격이 귀하의 주문을 뚫고 지나가는 시점에 체결을 발생시키고 있는 것입니다.
- 가정의 범위를 설정하십시오. 모든 취소 주문이 대기열의 맨 앞에서 발생했다고 가정한 경우와 맨 뒤에서 발생했다고 가정한 경우로 나누어 각각 재실행하십시오. 이 두 가지 결과값은 귀하가 선택한 모든 p(x)에 대한 정직한 오차 범위가 됩니다.
- 귀하의 가격이 데이터 피드(feed)가 제공하는 호가 잔량 범위를 벗어난 빈도를 측정하십시오. 해당 범위 밖에서 발생한 체결은 허구입니다. 백테스트에서의 미래 정보 편향(Look-ahead bias)은 동일한 오류를 다른 관점에서 설명합니다. 즉, 전략이 보유하지 않았던 정보에 기반한 결과라는 점입니다.
모델링을 멈추고 주문 데이터를 구매해야 할 시점
MBO(Market-by-order, 주문별 시장 데이터)는 개별 주문이 도착하는 순간부터 체결되거나 취소되는 순간까지 모든 메시지를 담고 있으며, 각 주문에는 고유 식별자가 부여됩니다. 해당 피드를 재생하면 자신의 주문이 거래소에 도달하는 현실적인 지연 시간을 가정했을 때, 대기열 내 자신의 위치를 추정이 아닌 정확한 수치로 파악할 수 있습니다. 이는 호가창 데이터(depth feed)보다 비용이 많이 들고 저장 용량도 훨씬 큽니다.
진단 3은 의사결정 규칙입니다. 전방 및 후방 브래킷(bracket) 모두에서 전략이 수익을 낸다면 중간 가정만으로도 충분합니다. 그러나 한쪽 브래킷에서는 수익이 나고 다른 쪽에서는 손실이 발생한다면, 대기열 모델 자체가 곧 전략의 핵심입니다. 이 경우 추측을 방어하는 것보다 주문별 피드를 구매하는 것이 더 저렴합니다.
비례 배분(Pro-rata) 시장은 질문의 성격을 바꿉니다
일부 선물 및 옵션 시장은 유입된 주문을 가격 우선순위가 아닌 주문 규모에 비례하여 체결합니다. 이러한 시장에서는 주문 도달 시간의 중요성이 현저히 낮아지며, 제시된 주문 규모(quoted size)가 핵심 수단이 됩니다. 즉, 주문 규모를 두 배로 늘리면 각 체결에서 차지하는 비중도 대략 두 배가 됩니다. 이에 따른 실패 유형도 변화하여, 실제 보유하고자 하는 것보다 더 큰 규모의 주문을 제시하게 되는 상황이 발생합니다. 옵션 주문이 체결되지 않는 이유에서는 이러한 현상이 옵션 호가창의 개인 투자자 측면에서 어떻게 나타나는지 다룹니다.
자주 묻는 질문(FAQ)
트레이딩에서 대기 순번(queue position)이란 무엇입니까?
대기 순번은 동일한 거래소의 동일한 가격대에 대기 중인 주문들 사이에서의 귀하의 순위를 의미합니다. 가격-시간 우선순위(price-time priority) 방식의 호가창에서는 귀하의 주문이 체결되기 전에 앞선 주문들이 먼저 체결되거나 취소되어야 합니다.
Level 2 데이터를 통해 대기 순번을 계산할 수 있습니까?
정확히는 불가능합니다. Level 2 데이터는 가격대별 총 수량만 보여줄 뿐 개별 주문의 식별 정보를 제공하지 않습니다. 따라서 체결(print) 없이 수량이 사라질 경우, 해당 수량이 귀하의 주문보다 앞선 것이었는지 뒤에 있던 것이었는지 알 수 없습니다. 대략적인 수치를 추정하여 범위를 좁힐 수는 있으나, 정확한 수치를 확인하려면 주문별(order-by-order) 데이터가 필요합니다.
백테스팅의 체결률이 실제보다 높게 나타나는 이유는 무엇입니까?
일반적인 가정은 주문 취소가 대기열 전체에 균등하게 발생한다고 보지만, 실제 취소는 대기열 후미에 집중되는 경향이 있습니다. 균등 분배 모델은 실제 시장보다 시뮬레이션상의 주문을 더 빠르게 앞당기며, 이는 실제 트레이딩보다 더 많고 유리한 체결 결과로 나타납니다.
MBO 데이터란 무엇입니까?
MBO(Market-by-order) 데이터는 모든 개별 주문의 도착부터 체결 또는 취소까지의 모든 메시지를 제공합니다. 이 데이터 피드를 사용하면 대기열 내 귀하의 위치를 모델링이 아닌 실제 수치로 파악할 수 있으며, 이는 1틱(one-tick) 스프레드에서 운용되는 전략에 가장 중요합니다.
프로라타(pro-rata) 거래소에서도 대기 순번이 중요합니까?
그렇지 않습니다. 프로라타 배분 방식은 유입되는 주문을 대기 중인 주문들의 수량 비율에 따라 나누어 체결시키므로, 먼저 주문을 냈다고 해서 유리할 것은 없으며 제시한 수량이 체결을 결정짓습니다. 따라서 대기열 모델링에 앞서 해당 거래소가 어떤 배분 모델을 사용하는지 확인해야 합니다.
이곳의 모든 패널에는 해당 데이터를 산출한 SQL이 포함되어 있습니다. Strasmore 터미널에서 티커(ticker)를 변경하고 날짜를 조정하여 귀하가 거래하는 종목에 대해 동일한 질문을 확인해 보십시오.