MBO vs MBP 호가창 데이터 차이점 비교
MBO(Market By Order)와 MBP(Market By Price) 호가창 데이터의 기술적 차이를 분석합니다. 개별 주문 단위의 이벤트 스트림인 MBO와 가격대별 총 잔량을 집계하는 MBP의 구조적 특징, 데이터 활용 목적, 그리고 운영 비용의 차이를 상세히 설명합니다.
MBO(Market By Order)와 MBP(Market By Price) 호가창 데이터는 작은 명칭 차이 뒤에 거대한 기술적 간극이 숨어 있는 개념입니다. 두 데이터 공급업체 모두 'Level 2'라는 이름으로 상품을 판매할 수 있지만, MBP는 각 가격대별 총 잔량을 전송하는 반면, MBO는 개별 주문마다 고유 ID를 부여하여 이벤트 단위로 전송합니다. 전자는 호가창의 요약본이며, 후자는 호가창을 구성하는 원장(ledger) 그 자체입니다. 따라서 후자를 전송하는 데는 수십 배 이상의 트래픽이 소요됩니다.
MBP와 MBO 호가창 데이터의 실제 구성
MBP(Market By Price)는 집계된 호가 깊이(aggregated depth)를 의미합니다. 각 업데이트는 매수/매도 구분, 가격대, 해당 가격의 총 잔량, 그리고 때로는 해당 가격에 걸려 있는 주문 건수를 포함합니다. 'MBP-10'으로 판매되는 상품은 양방향으로 최상위 10개 가격대를 제공하며, 이는 트레이딩 플랫폼의 호가창과 모든 깊이 차트(depth chart)의 계단식 구조를 형성합니다.
MBO(Market By Order)는 이벤트 스트림입니다. 각 메시지는 하나의 주문을 지칭하며, 주문 ID, 방향, 가격, 표시된 수량, 그리고 해당 주문에 발생한 변화를 담고 있습니다. 어떠한 정보도 사전 집계되지 않습니다. 만약 동일한 가격에 40개의 주문이 있다면, 40개의 개별 메시지가 이를 생성하며, 사용자는 해당 가격대의 총 잔량을 파악하기 위해 40개의 주문을 모두 메모리에 유지해야 합니다.
당사의 Level 1 vs Level 2 시장 데이터 가이드에서는 브로커가 제공하는 소매용 등급 명칭의 의미를 다룹니다. MBO와 MBP는 공급업체가 'Level 2'라고 지칭할 때 그 상자 안에 무엇이 들어있는지를 정의하는 정확한 명칭이며, 스키마(schema) 명칭을 확인하는 것이 중요합니다.
MBO 피드가 전달하는 메시지 액션
MBO 피드는 주문 ID에 적용되는 액션의 분류 체계입니다. 다음 네 가지가 트래픽의 대부분을 차지합니다.
- Add(추가): 새로운 주문 ID와 함께 새로운 주문이 호가창에 진입합니다.
- Modify(수정): 기존 ID의 주문이 가격이나 수량을 변경합니다. 수량을 늘리거나 가격을 이동하면 해당 주문은 새로운 가격대의 대기열 맨 뒤로 밀려나지만, 수량을 줄이는 경우에는 일반적으로 기존 순번이 유지됩니다.
- Cancel(취소): ID가 호가창에서 전체 또는 일부 제거됩니다.
- Trade or fill(체결): 공격적인 주문이 대기 중인 하나 이상의 ID와 체결되어 해당 수량이 줄어들거나 제거됩니다.
MBP는 이러한 세부 정보를 포함하지 않습니다. MBP 업데이트는 "현재 이 가격대에 이만큼의 수량이 있다"는 수준의 정보입니다. 수량이 취소로 인해 줄었는지, 체결로 인해 줄었는지와 관계없이 업데이트 내용은 동일하게 보입니다. 아래 패널은 가장 단순한 호가창인 통합 최우선 호가(consolidated top of book)에서의 제한 사항을 보여주며, 이는 양방향으로 가격대 하나씩을 나타내는 'MBP-1' 명칭에 해당합니다.
모든 수치 뒤에 숨겨진 정확한 SQL
WITH
ordered AS
(
SELECT
row_number() OVER (ORDER BY sip_timestamp, sequence_number) AS msg_index,
bid_price,
bid_size,
lagInFrame(bid_price) OVER (ORDER BY sip_timestamp, sequence_number) AS prev_bid_price,
lagInFrame(bid_size) OVER (ORDER BY sip_timestamp, sequence_number) AS prev_bid_size
FROM global_markets.cache_stocks_quotes
WHERE ticker = 'AAPL'
AND sip_timestamp >= '2026-06-16 14:00:00'
AND sip_timestamp < '2026-06-16 14:30:00'
AND bid_price > 0
),
classified AS
(
SELECT multiIf(
bid_price != prev_bid_price, 'best bid price changed',
bid_size > prev_bid_size, 'size joined at the best bid',
bid_size < prev_bid_size, 'size left the best bid',
'bid untouched, ask side updated') AS message_type
FROM ordered
WHERE msg_index > 1
)
SELECT
message_type,
count() AS message_count,
round(100 * count() / sum(count()) OVER (), 1) AS share_pct
FROM classified
GROUP BY message_type
ORDER BY indexOf(['best bid price changed', 'size joined at the best bid', 'size left the best bid', 'bid untouched, ask side updated'], message_type)해당 30분 동안, 17.6%의 메시지는 최우선 매수 호가를 다른 가격으로 이동시켰고, 17.4%은 동일한 매수 호가에서 수량을 추가했으며, 12%는 동일한 매수 호가에서 수량을 제거했고, 53%는 반대편 호가가 움직이는 동안 매수 호가를 그대로 유지했습니다. 각 그룹은 가격대에 대한 순수 상태를 나타냅니다. 그 어떤 메시지도 주문 ID를 명시하지 않으며, 어떠한 산술적 계산으로도 누락된 ID를 복구할 수 없습니다.
각 스키마가 답변할 수 있는 질문과 없는 질문
MBP-10은 "해당 가격에 수량이 얼마나 있었는가"라는 질문에 답합니다. 호가창의 형태, 호가 불균형(book imbalance), 중간 가격 근처의 유동성, 깊이 차트 자체가 이에 해당합니다. 집계된 가격대 정보만으로도 이러한 질문을 해결하기에 충분합니다.
MBO는 "이 주문에 무슨 일이 일어났는가"라는 질문에 답합니다. 내가 진입했을 때 내 앞에 얼마나 많은 수량이 있었는지, 주문이 취소되기 전까지 얼마나 생존하는지, 최우선 호가에 있는 수동적 주문이 가격이 움직이기 전에 체결될 확률은 얼마인지 등이 포함됩니다. 이러한 수량은 집계된 형태로는 존재하지 않으며, 주문을 합산하여 가격대 총계로 만드는 순간 이를 정의하던 순서 정보는 파괴됩니다.
대기열 순번(queue position)은 가장 대표적인 예이며, 이는 도착 순서에 따라 체결 우선순위가 결정되는 가격-시간 우선순위 대 비례 배분 매칭 방식에서만 의미를 갖습니다. 여기서 중요한 것은 체결 단위(print size)입니다. 하나의 큰 체결이 아니라 여러 개의 작은 체결이 모여 가격대를 소진하기 때문입니다.
모든 수치 뒤에 숨겨진 정확한 SQL
SELECT
multiIf(size < 100, '1 to 99 shares',
size < 200, '100 to 199 shares',
size < 500, '200 to 499 shares',
size < 1000, '500 to 999 shares',
'1000 or more shares') AS trade_size_bucket,
count() AS trade_count,
round(100 * count() / sum(count()) OVER (), 1) AS share_pct,
round(avg(size)) AS avg_shares
FROM global_markets.stocks_trades
WHERE ticker = 'AAPL'
AND sip_timestamp >= '2026-06-16 14:00:00'
AND sip_timestamp < '2026-06-16 14:30:00'
AND size > 0
GROUP BY trade_size_bucket
ORDER BY min(size)100주 미만의 홀수 단위(odd lot) 체결은 해당 구간 전체 체결의 92.3%를 차지했으며, 가장 큰 비중을 차지한 1000 or more shares는 0.1%를 기록했습니다. 4,000주가 표시된 가격대에 해당 규모의 체결이 발생하면, 대기열 마지막에 진입한 주문은 수십 번의 체결이 일어나는 동안에도 체결되지 않을 수 있습니다. MBP는 4,000주라는 총량만 보여주지만, MBO는 그 줄을 보여줍니다.
어떤 스키마도 숨겨진 수량(hidden size)을 보여주지는 않습니다. 아이스버그 주문(iceberg order)은 작은 부분만 노출하고 해당 부분이 체결될 때마다 새로운 ID로 갱신되므로, 예비 수량은 어떤 메시지에도 나타나지 않습니다.
MBO를 통한 호가창 재구성은 상태 머신(state machine)입니다
MBP 피드는 이미 완성된 답을 제공하지만, MBO 피드는 입력값만을 제공하며 사용자가 정확하게 처리하기를 요구합니다.
- 스냅샷 또는 빈 호가창과 거래소의 초기화 메시지에서 시작합니다.
- 주문 ID를 기준으로 모든 추가, 수정, 취소, 체결 이벤트를 엄격한 순서대로 적용합니다.
- 전략이 참조하는 가격대별로 두 번째 인덱스를 유지합니다.
- 시퀀스 번호를 감시하고, 누락이 발생하면 즉시 새로운 스냅샷을 받아 재동기화합니다.
실패 시 발생하는 오류는 조용합니다. 취소 메시지 하나를 놓치면 유령 주문이 세션 종료 시까지 호가창에 남아 해당 가격대의 수량을 부풀리지만, 어디에서도 예외가 발생하지 않습니다. 반면 MBP는 훨씬 안정적으로 성능이 저하됩니다. 각 업데이트가 가격대의 총계를 다시 명시하므로, 손상된 값은 몇 개의 메시지 내에 덮어씌워지기 때문입니다.
또한 MBO는 거래소별로 하나씩 존재하는 직접 피드(direct venue feed)에서만 제공되므로, 여러 거래소의 데이터를 실행하고 병합해야 합니다. 통합 테이프(consolidated tape)는 구조적으로 요약된 데이터이며, 이에 대한 구분은 SIP 대 직접 거래소 피드에서 다룹니다.
추가적인 세부 정보가 대역폭에 미치는 비용
메시지 수는 차이를 측정하는 가장 정직한 지표입니다. 아래 패널은 5개 주요 종목에 대해 동일한 30분 동안 통합 최우선 호가 메시지와 실제 체결 건수를 비교한 것입니다.
모든 수치 뒤에 숨겨진 정확한 SQL
WITH
quote_load AS
(
SELECT ticker, count() AS quote_messages
FROM global_markets.cache_stocks_quotes
WHERE ticker IN ('SPY', 'AAPL', 'NVDA', 'MSFT', 'KO')
AND sip_timestamp >= '2026-06-16 14:00:00'
AND sip_timestamp < '2026-06-16 14:30:00'
GROUP BY ticker
),
trade_load AS
(
SELECT ticker, count() AS trades
FROM global_markets.stocks_trades
WHERE ticker IN ('SPY', 'AAPL', 'NVDA', 'MSFT', 'KO')
AND sip_timestamp >= '2026-06-16 14:00:00'
AND sip_timestamp < '2026-06-16 14:30:00'
GROUP BY ticker
)
SELECT
q.ticker AS ticker,
round(q.quote_messages / 1000, 1) AS quote_messages_thousands,
round(t.trades / 1000, 2) AS trades_thousands,
round(q.quote_messages / t.trades, 1) AS quotes_per_trade_ratio
FROM quote_load AS q
INNER JOIN trade_load AS t ON t.ticker = q.ticker
ORDER BY quotes_per_trade_ratio DESCSPY은 체결당 가장 많은 호가 트래픽을 발생시켰으며, 체결당 9.6개의 메시지, 30분간 총 510천 개의 메시지가 발생했습니다. 5개 종목 간의 편차는 큽니다. 패널 하단의 MSFT은 체결당 0.7개의 호가 메시지를 기록하여 체결 1건당 1개 미만의 메시지를 보였습니다. 이 열이 무엇을 계산하는지 기억하십시오. 이는 이미 모든 거래소를 하나의 최우선 매수/매도 호가(BBO)로 통합한 피드에서, 양방향으로 가격대 하나씩만을 계산한 것입니다. 10단계 깊이의 상품은 이를 몇 배로 곱하며, 주문별 피드는 이를 다시 몇 배로 곱합니다. 각 거래소의 각 가격대 뒤에 있는 모든 주문이 체결 여부와 관계없이 추가, 수정, 취소 메시지를 생성하기 때문입니다. 동일한 산술적 원리가 옵션 호가 피드의 크기에서도 더 큰 규모로 나타납니다.
전략에는 어떤 호가창 피드가 필요한가?
대부분의 작업은 MBP-10으로 수행됩니다. 깊이 차트, 불균형 지표, 가격대별 유동성 측정, 체결 비용 모델, 그리고 특정 가격에 얼마나 많은 수량이 대기하고 있었는지에 대한 거의 모든 연구 질문은 집계된 가격대 정보만으로도 훨씬 적은 메시지 용량으로 해결할 수 있습니다.
MBO는 대기열 순번, 주문 생존 시간, 취소 행태, 최우선 호가에서의 수동적 체결 확률 등 특정 주문에 의존하는 답이 필요할 때 요구됩니다. 대기열에서 200주 깊이에 있는지 20,000주 깊이에 있는지에 따라 성패가 갈리는 전략은 집계된 데이터로는 구현할 수 없으며, 그 대가로 라이선스 비용, 대역폭, 저장 공간, 그리고 하루 종일 재구성된 호가창을 정확하게 유지하기 위한 엔지니어링 비용을 지불해야 합니다.
이 패널들이 작성된 방식
- 모든 패널의 기반이 되는 피드는 통합 최우선 호가(양방향 가격대 1개)와 체결 테이프입니다. 깊이 피드나 주문별 피드가 아니므로, 이 패널들은 MBO 자체를 샘플링하는 것이 아니라 메시지 용량에 대한 논거를 시각화합니다.
- 시간대는 2026년 6월 16일 오전 10:00~10:30(ET), 즉 UTC 14:00~14:30으로 고정되었습니다. 고정된 시간대는 데이터 재생성 시에도 수치를 안정적으로 유지합니다.
- 분류 패널은 각 메시지를 시퀀스상의 이전 메시지와 비교하여 라벨을 지정합니다. 취소와 체결을 정확히 구분할 수는 없으며, 이는 본 게시물에서 설명하는 한계점입니다.
FAQ
MBO와 MBP 시장 데이터의 차이점은 무엇입니까?
MBP(Market By Price)는 각 가격대별로 표시된 수량을 집계하여 가격대당 하나의 업데이트를 전송합니다. MBO(Market By Order)는 개별 주문마다 고유 ID를 부여하고, 해당 주문에 발생하는 추가, 수정, 취소, 체결 이벤트를 모두 전송합니다.
Level 2 데이터는 MBO 데이터와 동일합니까?
보통은 그렇지 않습니다. 소매 브로커의 'Level 2'는 거의 항상 집계된 깊이, 즉 5~20개의 가격대를 포함하는 MBP를 의미합니다. 일부 공급업체는 동일한 등급 명칭 하에 주문별 피드를 판매하기도 하므로, 등급 명칭이 아닌 스키마 명칭을 확인해야 실제 수신되는 데이터를 알 수 있습니다.
MBO 피드는 MBP 피드보다 얼마나 더 큽니까?
거래소와 종목에 따라 다르지만 수십 배 이상 차이가 납니다. 통합 최우선 호가만으로도 위 패널의 가장 바쁜 종목은 체결당 9.6개의 메시지를 기록했습니다. 주문별 피드는 모든 거래소의 모든 가격대 뒤에 있는 모든 추가, 수정, 취소 메시지를 추가하며, 여기에는 체결되지 않는 대다수의 주문도 포함됩니다.
MBO 데이터로 MBP 호가창을 재구성할 수 있습니까?
네, 그것이 일반적인 파이프라인입니다. 주문 ID를 기준으로 호가창에 각 주문 이벤트를 적용한 후 가격대별 총계를 게시하는 방식입니다. 반대로 주문이 가격대 총계로 합산된 후에는 개별 ID와 도착 순서 정보가 사라지므로 재구성이 불가능합니다.
여기에 포함된 모든 패널은 그 아래에 있는 정확한 SQL과 함께 제공됩니다. 다른 종목이나 세션에서 동일한 메시지 수를 계산하려면 Strasmore 터미널에서 평이한 영어로 질문하십시오.