Strasmore Research
Deep Dives · Matt ConnorBy Matt Connor ·

تخمین موقعیت در صف با استفاده از داده‌های Level 2

موقعیت در صف تعیین‌کننده موفقیت سفارش‌های غیرفعال در دریافت اسپرد است. این مقاله روش‌های تخمین جایگاه سفارش از طریق داده‌های تجمیعی و شرایط جایگزینی آن با داده‌های MBO را بررسی می‌کند.

موقعیت در صف (Queue position)، جایگاه شما در میان سفارش‌هایی است که در یک قیمت مشخص در انتظار نشسته‌اند. در بازارهایی که اولویت با «قیمت-زمان» است، این موقعیت تعیین می‌کند که آیا یک سفارش غیرفعال (passive) موفق به دریافت اسپرد می‌شود یا اصلاً معامله نمی‌شود. داده‌های تجمیعی بازار این عدد را در اختیار شما قرار نمی‌دهند: دفتر سفارشات سطح 2 (Level 2) تنها نشان می‌دهد که در هر قیمت چه حجمی وجود دارد، نه اینکه متعلق به کیست. در ادامه، نحوه تخمین موقعیت در صف با استفاده از داده‌های در دسترس اکثر معامله‌گران و همچنین زمانِ از دست رفتن اعتبار این تخمین‌ها بررسی می‌شود.

چرا موقعیت در صف، تمامِ مزیت رقابتی است

یک سفارش غیرفعال در دفتر سفارشات می‌ماند و منتظر می‌ماند تا شخص دیگری با عبور از اسپرد، آن را معامله کند. تحت اولویت قیمت-زمان، موتور تطبیق سفارشات، سفارش‌های موجود را ابتدا بر اساس قیمت و سپس بر اساس زمان ورود رتبه‌بندی می‌کند. اگر 10,000 سهم در قیمت 10.00 دلار برای خرید پیشنهاد شده باشد و شما 100 سهم پشت آن‌ها اضافه کنید، آن 10,000 سهم باید معامله یا لغو شوند تا نوبت به شما برسد. اگر سفارش خود را لغو و دوباره در همان قیمت وارد کنید، به انتهای صف بازمی‌گردید.

این رتبه‌بندی، اقتصاد معامله را تعیین می‌کند. در ابتدای صف، شما مکرراً معامله می‌کنید و اسپرد را به همراه هرگونه تخفیف تأمین نقدینگی (add-liquidity rebate) دریافت می‌کنید که موضوع کارمزدها و تخفیف‌های سازنده-گیرنده است. در انتهای صف، تنها زمانی معامله می‌کنید که تمام افرادِ پیش از شما معامله کرده باشند؛ این اتفاق زمانی رخ می‌دهد که جریان سفارشات یک‌طرفه با حجم بالا وارد شود. پر شدن سفارش‌ها در انتهای صف، درست در لحظاتی پیش از آن رخ می‌دهد که قیمت از سطح شما عبور کند. قیمت یکسان، سفارش یکسان، اما نتیجه تجاری متفاوت.

آنچه داده‌های سطح 2 نشان می‌دهند و آنچه نمی‌توانند نشان دهند

سطح 1 (Level 1) بهترین قیمت خرید و فروش به همراه حجم هر کدام است. سطح 2 که به آن «بازار بر اساس قیمت» (market by price) نیز می‌گویند، عمق بازار را اضافه می‌کند: فهرستی از سطوح قیمتی با حجم کل موجود در هر سطح. هر دو، داده‌های تجمیعی هستند و مقایسه داده‌های بازار سطح 1 و سطح 2 آن‌ها را به‌طور کامل بررسی می‌کند. وقتی حجم خرید در قیمت 10.00 دلار از 10,000 سهم به 8,500 سهم کاهش می‌یابد، فیدِ داده گزارش می‌دهد که 1,500 سهم کم شده است. این فید نمی‌گوید که آیا آن‌ها معامله شده‌اند، آیا یک سفارش خارج شده یا چهل سفارش، و یا اینکه در کجای صف قرار داشته‌اند.

اجراها (Executions) نیمه قابل‌مشاهده هستند: نوار معاملات (tape) هر معامله را با حجم آن ثبت می‌کند، بنابراین آن مقادیر را دقیقاً کسر می‌کنید. باقی‌مانده، لغو سفارش (cancellation) است و لغو سفارش جایی است که حدس و گمان آغاز می‌شود. پنل زیر، تعداد پیام‌ها در بالاترین سطح تجمیعی دفتر سفارشات را در مقابل معاملات ثبت‌شده در نوار برای یک سهم نقدشونده در یک جلسه معاملاتی عادی، چهارشنبه 10 ژوئن 2026، شمارش می‌کند.

پرس‌وجومقایسه پیام‌های لایه اول دفتر سفارشات با معاملات ثبت‌شده، AAPL، ۱۰ ژوئن ۲۰۲۶
کد دقیق 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_time
Run this yourself

ساعت 08:00 پیش از زنگ آغاز بازار است: بالاترین سطح دفتر سفارشات در آنجا 0.8 بار به ازای هر معامله تغییر کرد، که تعداد پیام‌ها کمتر از تعداد معاملات بود. در داخل جلسه معاملاتی عادی، این نسبت معکوس می‌شود. در ساعت 15:00، بالاترین سطح دفتر سفارشات 1.6 بار به ازای هر معامله تغییر کرد، که در مجموع 233433 پیام تنها در همان ساعت بود. بیشتر آنچه برای یک سطح قیمتی در بازار آزاد رخ می‌دهد، ورود و خروج سفارش‌ها بدون معامله شدن است و هر یک از این رویدادها، جایگاه شما را در صف به مقداری تغییر می‌دهد که هیچ فید تجمیعی آن را اعلام نمی‌کند.

فرض لغو یکنواخت و جایی که به نفع شما اغراق می‌کند

اولین رویکرد استاندارد فرض می‌کند که لغو سفارش‌ها به‌طور یکنواخت در طول صف پخش شده است. فرض کنید x عمق کسری شما باشد: یعنی تعداد سهامِ پیش از شما تقسیم بر کل حجم موجود در قیمت شما. مدل یکنواخت، احتمال اینکه هر سهم لغو شده پیش از شما بوده باشد را برابر با x در نظر می‌گیرد، که به‌صورت p(x) = x نوشته می‌شود. اگر در نیمه یک صف 10,000 سهمی قرار داشته باشید و ببینید 1,000 سهم بدون معامله لغو می‌شوند، مدل شما را 500 جایگاه جلو می‌برد.

صف‌های واقعی دارای انحراف هستند. سفارشی که مدتی است در صف مانده، معمولاً متعلق به کسی است که از انتظار راضی است، در حالی که سفارشی که لحظه‌ای پیش اضافه شده، به احتمال زیاد یک مظنه گذراست که ظرف چند ثانیه ناپدید می‌شود. لغو سفارش‌ها به سمت انتهای صف، یعنی نزدیک به شما و پشت سر شما متمرکز است. از آن 1,000 سهم لغو شده، شاید 200 سهم پیش از شما بوده باشند، در حالی که مدل به شما 500 سهم اعتبار داده است. این کار را در تمام طول روز تکرار کنید تا ببینید صف شبیه‌سازی‌شده سریع‌تر از صف واقعی حرکت می‌کند. خطا همیشه در یک جهت است: تعداد پر شدن سفارش‌ها بیشتر و در لحظات بهتری نسبت به سفارش‌های واقعی است.

چگونه صف‌ها تخلیه می‌شوند

لغو سفارش‌ها شما را به‌طور نامرئی جابه‌جا می‌کند. معاملات شما را به‌طور مرئی و به اندازه حجمِ ثبت‌شده در نوار، جابه‌جا می‌کنند.

پرس‌وجوتفکیک معاملات AAPL بر اساس حجم، ۱۰ ژوئن ۲۰۲۶
کد دقیق 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)
Run this yourself

معاملات با حجم کمتر از یک لات استاندارد (round lot)، 90% از تعداد معاملات در این جلسه و 42.5% از حجم کل را تشکیل می‌دادند. بلوک‌های هزار سهمی یا بیشتر، 0.2% از معاملات و 19.9% از حجم را شامل می‌شدند. صف‌ها با لقمه‌های کوچک تخلیه می‌شوند، بنابراین فاصله بین موقعیت 2,000 و 3,500، صدها معامله در انتظار است. شبیه‌سازی که پس از دو معامله بزرگ، سفارش را پرشده تلقی می‌کند، بخش بزرگی از نوار معاملات را نادیده گرفته است.

سفارشی که نمی‌توانید ببینید

فیدهای عمق بازار محدود هستند. اگر ده سطح قیمتی دریافت کنید و سفارش شما در سطح یازدهم باشد، سفارش شما خارج از داده‌هاست: نه حجم پیش از آن را می‌دانید و نه سفارش‌هایی که پشت سر آن اضافه می‌شوند. در آن نقطه، شما به جای تخمین زدن، در حال اختراع عدد هستید. این وضعیت عادی است، نه عجیب، زیرا سفارشی که بازار را تعقیب نمی‌کند، به‌سرعت از قیمت‌های داخلی فاصله می‌گیرد.

پرس‌وجوبهترین قیمت پیشنهادی خرید و سطوح قیمتی آن، AAPL، بازه‌های ۱۵ دقیقه‌ای
کد دقیق 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
Run this yourself

در بازه 10:00، بهترین قیمت خرید به‌طور میانگین 290.29 دلار بود و در عرض پانزده دقیقه از 187 قیمت متمایز بازدید کرد. هر یک از این قیمت‌ها یک سطح جداگانه در سهمی است که با سنت قیمت‌گذاری می‌شود، بنابراین نمای ده سطحی، ده سنت از دفتر سفارشات را پوشش می‌دهد. سفارشی که در چنین جلسه‌ای در یک قیمت باقی می‌ماند، می‌تواند مدت‌های طولانی زیر عمیق‌ترین سطحی که مالک آن می‌بیند، قرار بگیرد.

موقعیت در صف کجا بیشترین ارزش را دارد

موقعیت در صف جایی بیشترین ارزش را دارد که بهبود قیمت (price improvement) غیرممکن باشد. سهمی که در اسپرد یک سنتی قفل شده، جایی برای جلو زدن از صف با قیمت بهتر باقی نمی‌گذارد: همه در همان تیک (tick) جمع می‌شوند و زمان ورود، بقیه کار را تعیین می‌کند. جایی که اسپرد چندین سنت عرض دارد، معامله‌گر با یک سنت اختلاف، از کل صف جلو می‌زند و تصمیم قیمتی بر صف اولویت می‌یابد.

پرس‌وجومیانگین اسپرد مظنه و مدت زمان استقرار در اسپرد یک سنتی، نیم‌روز ۱۰ ژوئن ۲۰۲۶
کد دقیق 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
Run this yourself

در طول چهار ساعت میانی همان جلسه، فشرده‌ترینِ این شش نام، یعنی KO، به‌طور میانگین 1.18 سنت عرض داشت و در 82.5% از به‌روزرسانی‌های خود اسپرد یک سنتی نشان داد. عریض‌ترین آن‌ها، MSFT، به‌طور میانگین 8.46 سنت بود و در 1.1% از به‌روزرسانی‌ها اسپرد یک سنتی داشت. مدل صفی که روی نام اول کالیبره شده، هیچ اطلاعات مفیدی درباره نام دوم نمی‌دهد. سفارش‌هایی که بین مظنه‌ها می‌مانند و در سفارش‌های میخ‌شده در نقطه میانی (midpoint peg orders) پوشش داده شده‌اند، تحت همان قوانین، صف خود را تشکیل می‌دهند.

چهار تشخیص برای تست گذشته (Backtest) شما

  1. نرخ پر شدن شبیه‌سازی‌شده را با نرخ پر شدن واقعی خود روی همان نام‌ها در همان ساعات مقایسه کنید. شبیه‌سازی که 70 درصد سفارش‌هایی را پر می‌کند که در واقعیت 40 درصد مواقع پر شده‌اند، در حال توصیف فرض شماست، نه بازار.
  2. پر شدن‌های شبیه‌سازی‌شده را به دو دسته تقسیم کنید: آن‌هایی که سطح قیمت پس از آن باقی ماند، و آن‌هایی که تنها زمانی رخ داد که سطح قیمت کاملاً تخلیه شد. دسته‌ای که به سمت نوع دوم سنگینی می‌کند، به این معناست که شبیه‌ساز درست در لحظه‌ای که قیمت از روی شما عبور می‌کند، سفارش را پر می‌کند.
  3. فرض را در یک بازه قرار دهید. شبیه‌سازی را یک بار با فرض لغو تمام سفارش‌ها از ابتدای صف و بار دیگر با فرض لغو از انتهای صف اجرا کنید. این دو اجرا، بازه‌های خطای صادقانه پیرامون هر p(x) انتخابی شما هستند.
  4. اندازه‌گیری کنید که قیمت شما چند بار خارج از عمقی که فید شما ارائه می‌دهد، قرار گرفته است. پر شدن‌های آن بخش، ساختگی هستند. سوگیری نگاه به آینده در تست گذشته همین شکست را از زاویه‌ای دیگر توصیف می‌کند: نتیجه‌ای که بر اطلاعاتی استوار است که استراتژی هرگز در اختیار نداشته است.

چه زمانی مدل‌سازی را متوقف و داده‌های سفارش را خریداری کنیم

داده‌های «بازار بر اساس سفارش» (MBO) برای هر سفارش فردی، از لحظه ورود تا لحظه اجرا یا لغو، پیامی به همراه دارد که هر کدام با شناسه خاص خود برچسب‌گذاری شده‌اند. آن فید را بازپخش کنید تا جایگاه شما در صف، به جای تخمین، یک عدد شمارشی باشد؛ البته با فرض یک تأخیر واقع‌بینانه برای رسیدن سفارش خودتان به محل معامله. این داده‌ها از فید عمق بازار گران‌تر هستند و ذخیره‌سازی آن‌ها حجم بسیار بیشتری می‌طلبد.

تشخیص شماره 3، قانون تصمیم‌گیری است. اگر هر دو حد بالا و پایین (front and back brackets)، استراتژی را سودآور نگه می‌دارند، یک فرض میانی کافی است. اگر استراتژی تحت یک حد سودآور و تحت دیگری زیان‌ده است، مدل صف همان استراتژی شماست و خرید فید سفارش‌به‌سفارش، ارزان‌تر از دفاع از یک حدس است.

بازارهای تناسبی (Pro-rata) پرسش را تغییر می‌دهند

برخی بازارهای آتی و اختیار معامله، سفارش ورودی را به جای اولویت زمانی، به نسبت حجم در میان سفارش‌های موجود در یک قیمت تقسیم می‌کنند. در آنجا زمان اهمیت بسیار کمتری دارد و حجمِ مظنه‌شده به اهرم تبدیل می‌شود: دو برابر کردن حجم، تقریباً سهم شما از هر پر شدن را دو برابر می‌کند. حالت شکست نیز با آن حرکت می‌کند و به سمت مظنه‌گذاری حجمی بیش از آنچه می‌خواهید مالک آن باشید، می‌رود. چرا سفارش‌های اختیار معامله پر نمی‌شوند نشان می‌دهد که این موضوع از دیدگاه خرده‌فروشی در دفتر سفارشات اختیار معامله چگونه به نظر می‌رسد.

پرسش‌های متداول

موقعیت در صف در معاملات چیست؟

موقعیت در صف، رتبه شما در میان سفارش‌هایی است که در یک قیمت و در یک محل معامله (venue) یکسان نشسته‌اند. در دفتر سفارشاتی که اولویت قیمت-زمان دارند، سفارش‌های پیش از شما باید معامله یا لغو شوند تا نوبت سفارش شما برسد.

آیا می‌توان موقعیت در صف را از داده‌های سطح 2 محاسبه کرد؟

نه دقیقاً. سطح 2 حجم کل در هر سطح قیمتی را بدون هویت سفارش نشان می‌دهد، بنابراین وقتی حجم بدون معامله شدن ناپدید می‌شود، نمی‌توانید تشخیص دهید که آن سهام پیش از شما بوده یا پشت سر شما. شما می‌توانید عدد را تخمین بزنید و بازه‌ای برای آن تعیین کنید. عدد دقیق نیازمند داده‌های سفارش‌به‌سفارش است.

چرا نرخ‌های پر شدن در تست‌های گذشته معمولاً بیش از حد بالا هستند؟

فرض رایج این است که لغو سفارش‌ها به‌طور یکنواخت در طول صف پخش شده است، در حالی که لغوهای واقعی به سمت انتهای صف متمرکز هستند. مدل یکنواخت، سفارش شبیه‌سازی‌شده شما را سریع‌تر از حرکت صف واقعی جلو می‌برد که خود را به‌صورت پر شدن‌های بیشتر و بهتر نسبت به معاملات واقعی نشان می‌دهد.

داده‌های MBO چیست؟

داده‌های «بازار بر اساس سفارش» (Market-by-order) برای هر سفارش فردی، از لحظه ورود تا اجرا یا لغو، پیام‌های جداگانه‌ای ارائه می‌دهد. این فیدی است که در آن جایگاه شما در صف قابل‌شمارش است، نه مدل‌سازی‌شده؛ موضوعی که برای استراتژی‌هایی که در اسپرد یک تیکی زندگی می‌کنند، حیاتی است.

آیا موقعیت در صف در بازارهای تناسبی (Pro-rata) اهمیت دارد؟

کمتر. تخصیص تناسبی، سفارش ورودی را بر اساس حجم در میان سفارش‌های موجود تقسیم می‌کند، بنابراین اول رسیدن، مزیت چندانی برای شما ندارد و حجمِ مظنه‌شده کار را انجام می‌دهد. بررسی اینکه یک محل معامله از چه مدل تخصیصی استفاده می‌کند، پیش از هرگونه مدل‌سازی صف ضروری است.


هر پنل در اینجا حاوی کد SQL است که آن را تولید کرده است. تیکر را تغییر دهید، تاریخ را جابه‌جا کنید و همان پرسش را درباره نام‌هایی که در ترمینال Strasmore معامله می‌کنید، بپرسید.