如何根據 Level 2 數據估算隊列位置
隊列位置決定被動委託單能否成功賺取價差。本文說明如何從彙整後的報價簿數據推算排隊順序,並分析在何種市場條件下,交易者應改用 MBO 數據以提升執行精確度,避免因資訊落差導致成交失敗。
隊列位置與市場微結構
隊列位置(queue position)是指您的委託單在特定價格價位上的排隊順序。在採用「價格優先、時間優先」原則的交易場所中,這決定了您的被動委託單(passive order)能否成功賺取價差(spread),或是最終完全無法成交。彙整後的市場數據不會直接提供此數值:Level 2 報價簿僅顯示各價格價位上的委託總量,而非個別委託的歸屬。以下內容將說明如何根據多數交易者可取得的數據來估算隊列位置,以及如何判斷何時該估算方式已不足以應對市場需求。
估算隊列位置的邏輯
若要估算隊列位置,必須觀察 Level 2 報價簿中特定價格的委託量變化。當您送出限價委託單後,若該價位的總委託量減少,且您的委託單尚未成交,這意味著在您之前的委託單已被執行或撤銷。透過持續監控委託量的增減,交易者可以推算自己距離成交還有多少「身位」。然而,這種方法存在誤差,因為您無法得知其他市場參與者是撤銷了委託,還是有新的委託單排在您的前面。
何時估算不再足夠
當市場波動加劇或流動性轉趨稀薄(thinly traded)時,單純的估算往往會失效。在高度競爭的市場中,高頻交易商(market maker)利用極低延遲的系統,能比一般交易者更快地調整委託。若您發現自己的委託單在價格觸及後仍未成交,或者在報價簿上的委託量出現異常劇烈的波動,這通常代表市場微結構已發生變化,單憑 Level 2 數據已無法精確掌握您的執行機率。此時,交易者應考慮調整委託策略,或改用更具流動性的標的以降低執行風險。
進階執行策略
為何排隊順序是獲利的關鍵
被動掛單(passive order)會留在委託簿中,等待其他交易者主動跨越買賣價差(spread)來成交。在 價格優先、時間優先 的機制下,撮合引擎會先依價格排序,再依委託到達時間排序。若已有一萬股以十美元的價格掛出買單,而您在其後追加一百股,則必須等那一萬股成交或撤單後,才輪到您。若在同一價格撤單並重新掛單,您會回到隊伍的最末端。
這種排序決定了經濟效益。排在隊伍前端,您能頻繁成交並賺取價差,以及任何提供流動性的回饋金,這正是 造市商與收費方費率及回饋金 的核心。排在隊伍後端,您只有在前方所有委託皆成交後才能成交,這種情況通常發生在單邊資金大量湧入時。排在後端的成交,往往集中在價格即將突破您掛單價位的前一刻。同樣的價格、同樣的委託,卻面臨截然不同的交易結果。
Level 2 數據能與不能顯示的資訊
Level 1 數據提供最佳買進與賣出報價(bid and offer)及其對應的掛單量。Level 2 數據又稱為「價格深度」(market by price),增加了市場深度:列出各個價格水準及其對應的總掛單量。兩者皆為彙總數據,Level 1 與 Level 2 市場數據比較 對此有完整說明。當 10.00 美元的買單從 10,000 股降至 8,500 股時,數據源僅顯示減少了 1,500 股。它不會說明這些股份是否已成交、是一筆還是四十筆委託單撤銷,也不會顯示這些委託單原本在隊列中的位置。
成交紀錄是市場中可見的一半:報價單(tape)會列出每一筆成交的規模,因此這些數據可以精確扣除。其餘的部分則是撤單,而撤單正是猜測的開始。下方的面板統計了 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。若您位於一萬股佇列的中間位置,觀察到一千股在沒有成交的情況下撤單,該模型會將您的順位向前推進五百名。
實際的佇列分佈並不均勻。已掛單一段時間的委託通常屬於願意等待的交易者,而剛加入的委託則更有可能是幾秒內就會消失的短暫報價。撤單傾向集中在佇列後方,即靠近您或在您之後的位置。在那一千股撤單中,可能只有兩百股位於您之前,但模型卻將五百股的進度歸功於您。若整日重複此過程,模擬佇列的推進速度將快於實際佇列。這種誤差具有單向性:模擬結果顯示的成交次數更多,且成交時機更佳,優於實際委託單所能獲得的表現。
排隊成交的機制
取消委託會讓您的順位發生隱形變動。而成交則會透過成交筆數(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)本交易時段中,低於整股單位(round lot)的成交筆數佔總數的 90%,成交股數則佔 42.5%。一千股或以上的大額交易(blocks)佔成交筆數的 0.2%,成交量則佔 19.9%。排隊委託是透過零星的成交逐步消化,因此從第兩千順位到第三千五百順位之間,可能需要等待數百筆成交才能輪到。若模擬器設定在兩筆大額交易後即視為成交,這將會忽略掉盤面上絕大多數的交易細節。
您看不見的委託單
深度行情資訊會進行截斷。若您接收十個價位,而您的委託單位於第十一個價位,則該委託單已超出數據範圍:您既看不見前方排隊的掛單量,也看不見後續加入的委託單。此時,您是在憑空臆測數據,而非進行估算。這種情況相當常見,而非特例,因為若委託單未隨市場價格追價,很快就會脫離最佳買賣價(inside market)。
每個數據背後的精確 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_time在 10:00 區間內,最佳買價平均為 $290.29,且在十五分鐘內觸及 187 個不同價位。對於以美分報價的股票而言,每個價位皆為獨立層級,因此十個價位的視圖僅涵蓋帳簿中十美分的深度。在如此波動的交易時段中,若委託單維持在單一價格,其掛單位置可能會長時間處於委託人可見的最深價位之下。
排隊順序價值最高之處
當價格改善空間不存在時,排隊順序的價值最高。若一檔股票的買賣價差(spread)被鎖定在 1 分錢,交易者無法透過提供更優價格來插隊:所有參與者都堆疊在同一個價位,此時進場時間決定了成交優先權。若價差寬達數分,交易者只需多出 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在同一交易日的四個盤中小時內,六檔標的中價差最窄的 KO,其平均價差為 1.18 分,且有 82.5% 的報價更新顯示為 1 分錢價差。價差最寬的 MSFT,平均價差為 8.46 分,僅 1.1% 的報價更新顯示為 1 分錢價差。以第一檔標的校準的排隊模型,無法對第二檔標的提供任何有效參考。至於介於買賣報價之間的委託單,即 中間價掛單 所涵蓋的範圍,則在相同規則下形成另一條獨立的隊伍。
四項回測診斷指標
- 將模擬成交率與相同標的在相同時段的實際成交率進行比較。若模擬器顯示成交率為百分之七十,而實際市場僅有百分之四十,這代表模擬器反映的是您的假設,而非市場實況。
- 將模擬成交分為兩類:一類是成交後價格水準維持不變,另一類是僅在價格完全突破該水準時才成交。若後者佔比較高,代表模擬器是在價格穿過您的掛單時才給予成交。
- 建立假設區間。重新執行回測,一次將所有撤單視為從隊列前端移除,另一次則視為從隊列後端移除。這兩次運算結果即為您所選定 p(x) 的真實誤差範圍。
- 測量您的報價位於行情資訊深度之外的頻率。在該範圍內的成交均為虛構。回測中的前瞻偏差 從另一個角度描述了同樣的缺失:即結果建立在策略當時無法取得的資訊之上。
何時應停止建模並購買委託單數據
逐筆委託數據(Market-by-order, MBO)包含每一筆委託單的訊息,從委託單送達至執行或取消的過程皆有獨立識別碼。若回放此數據流,您在委託隊列中的位置將是精確計數而非估算值,前提是您需將自身委託單送達交易所的延遲納入考量。此類數據成本高於深度報價(depth feed),且儲存需求龐大。
診斷三即為決策準則。若前後兩端的假設情境皆能使策略獲利,則採用中間值假設即可。若策略在其中一種假設下獲利,而在另一種假設下虧損,則代表隊列模型本身即為策略核心,此時購買逐筆委託數據的成本,將低於持續維護一個估算模型所需的代價。
比例分配交易場所改變了問題本質
部分期貨與選擇權市場會將收到的委託單,按各個掛單的規模比例分配給場內掛單,而非依照抵達順序執行。在這些市場中,時間優先順序的重要性大幅降低,報價規模成為關鍵槓桿:將掛單規模加倍,大約能使成交份額增加一倍。隨之而來的失敗模式,轉變為報價規模超過了實際想持有的部位。為何選擇權委託單無法成交 一文探討了從選擇權交易簿零售端觀察到的現象。
常見問題
交易中的排隊順位(queue position)是什麼?
排隊順位是指您的委託單在同一交易場所、同一價格水準下,所有待成交委託中的排序。在價格優先、時間優先(price-time priority)的撮合機制下,排在您之前的委託必須先成交或撤銷,您的委託才能成交。
可以從 Level 2 資料計算排隊順位嗎?
無法精確計算。Level 2 僅顯示各價格水準的總委託量,不具備委託單識別資訊。因此,當委託量在沒有成交紀錄(print)的情況下減少時,您無法判斷這些消失的股數是排在您之前還是之後。您僅能估算數量並設定估值區間。若要取得確切數字,必須使用逐筆委託(order-by-order)資料。
為什麼回測的成交率通常偏高?
常見的假設是將撤單均勻分配在隊列中,但實際的撤單行為多集中在隊列後方。均勻分配模型會使模擬委託的推進速度快於真實隊列,導致回測結果顯示的成交次數與成交品質,皆優於實際交易表現。
什麼是 MBO 資料?
逐筆委託(Market-by-order)資料會針對每一筆委託提供獨立訊息,涵蓋從委託送達、執行到撤銷的完整過程。這是唯一能讓您精確計算排隊順位而非僅進行模型推估的數據源,對於在一個 tick spread 內運作的策略至關重要。
排隊順位在比例分配(pro-rata)交易場所重要嗎?
重要性較低。比例分配機制會根據委託量將進場單分攤給所有待成交委託,因此搶先下單的優勢較小,掛單量的大小才是關鍵。在進行任何隊列建模前,應先確認該交易場所採用的分配模型。
此處每個面板均附有產生該數據的 SQL。您可以在 Strasmore 終端機上變更 ticker、調整日期,並針對您交易的標的提出相同的問題。