رفتن به محتوای اصلی
سرفصل مسیر Quant Developer

مسیر Quant Developer · بخش ۱: مبانی بازار و Market Making · درس ۴

Market Microstructure: جریان سفارش، اسلیپیج و کیفیت اجرا

دفتر سفارش در طول زمان و بعد از یک معامله بزرگ چطور تغییر می‌کند، و هزینه واقعی اجرای سفارش را با اسلیپیج و Effective Spread چطور اندازه بگیریم.

سطح: مقدماتی تا متوسط۱۵ دقیقه مطالعه

۱. از عکس به فیلم: جریان سفارش

دفتر سفارشی که در درس‌های قبل دیدیم یک عکس بود؛ وضعیت بازار در یک لحظه. بازار واقعی یک فیلم است: هر لحظه سفارشی اضافه می‌شود، سفارشی لغو می‌شود و معامله‌ای انجام می‌شود. به مطالعه اینکه قیمت دقیقاً از دل چه سفارش‌ها و قواعدی بیرون می‌آید، Market Microstructure (ریزساختار بازار) می‌گویند.

هر تغییری در دفتر سفارش از یکی از این سه نوع رویداد است:

  • ثبت (Add): یک سفارش Limit تازه در دفتر می‌نشیند و عمق آن سطح را زیاد می‌کند.
  • لغو (Cancel): سفارشی که منتظر بود برداشته می‌شود. معامله‌ای رخ نداده، ولی عمق کم شده است.
  • معامله (Trade): یک سفارش Taker می‌رسد و سفارش‌های منتظر را مصرف می‌کند.

به دنباله این رویدادها، به‌ویژه دنباله معامله‌های خرید و فروش، جریان سفارش (Order Flow) می‌گویند. بیا از همان دفتر سفارش BTC/USDT درس ۱ شروع کنیم و یک ثانیه و نیم از این فیلم را ببینیم (رویدادها فرضی‌اند):

زمانرویدادجزئیاتBest BidBest AskSpread
09:00:00.000شروعدفتر سفارش درس ۱99,990100,01020
09:00:00.180ثبتخرید Limit به حجم 0.2 در 99,99599,995100,01015
09:00:00.410لغوفروش 0.3 در 100,010 برداشته شد99,995100,02025
09:00:00.650معاملهخرید Market به حجم 0.5 در 100,02099,995100,03035
09:00:00.900ثبتفروش Limit به حجم 0.4 در 100,02599,995100,02530
09:00:01.300لغوخرید 0.2 در 99,995 برداشته شد99,990100,02535

در این یک ثانیه و نیم فقط یک معامله انجام شد، ولی بهترین قیمت‌ها پنج بار عوض شدند. سه برداشت:

  1. بیشتر رویدادها معامله نیستند. در بسیاری از بازارها پیام‌های ثبت و لغو چندین برابر معامله‌هاست؛ فهرست معامله‌ها به‌تنهایی بیشتر داستان را نشان نمی‌دهد.
  2. نقدشوندگی دیده‌شده ممکن است وقتی سفارشت برسد، آنجا نباشد. کسی که در لحظه 0.000 خواست 0.3 BTC در 100,010 بخرد، اگر سفارشش بعد از 0.410 می‌رسید، قیمت بدتری می‌گرفت. این موضوع درس ۱۹ (Latency) است.
  3. جریان سفارش تصادفی محض نیست. در داده واقعی، خریدها معمولاً پشت سر هم می‌آیند و فروش‌ها هم؛ از جمله چون معامله‌گرهای بزرگ سفارششان را به تکه‌های کوچک تقسیم می‌کنند.

۲. سه بُعد نقدشوندگی

در درس ۱ گفتیم بازارساز «نقدشوندگی» فراهم می‌کند. حالا می‌توانیم این کلمه را دقیق‌تر کنیم. در ادبیات ریزساختار، معمولاً نقدشوندگی را سه‌بعدی می‌بینند:

  • فشردگی (Tightness): معامله فوری چقدر گران است؟ همان Spread که در درس ۲ دیدیم.
  • عمق (Depth): چه حجمی را می‌شود بدون جابه‌جا کردن زیاد قیمت معامله کرد؟ همان حجم سطوح دفتر که در درس ۳ دیدیم.
  • انعطاف‌پذیری (Resilience): بعد از یک معامله بزرگ، دفتر سفارش با چه سرعتی دوباره پر می‌شود و قیمت به حالت عادی برمی‌گردد؟

دو بُعد اول در یک عکس دیده می‌شوند. بُعد سوم فقط در فیلم دیده می‌شود؛ پس بیا همان معامله درس ۳ را این بار در طول زمان دنبال کنیم.

۳. بعد از Market Order درس ۳ چه شد؟

در درس ۳ یک خرید Market به حجم 1 BTC سه سطح Ask را مصرف کرد و میانگین قیمتش 100,019 شد. درست بعد از این معامله، دفتر سفارش این شکل را داشت:

قیمت (USDT) حجم (BTC)
100,030 0.7
اسپرد 40 USDT
99,990 0.4
99,980 0.7
99,970 1.2
دفتر سفارش نمایشی BTC/USDT: سفارش‌های فروش (Ask) بالا، سفارش‌های خرید (Bid) پایین. بهترین قیمت‌ها پررنگ شده‌اند.

Spread از ۲۰ به ۴۰ دلار رسیده و سمت فروش تقریباً خالی است. این وضعیت دوام ندارد: بازارسازها Spread بزرگ را فرصت می‌بینند و سفارش فروش تازه می‌گذارند. ده ثانیه بعد، دفتر ممکن است این شکل را داشته باشد (فرضی):

قیمت (USDT) حجم (BTC)
100,030 0.7
100,024 0.5
100,014 0.3
اسپرد 20 USDT
99,994 0.4
99,984 0.7
99,974 1.2
دفتر سفارش نمایشی BTC/USDT: سفارش‌های فروش (Ask) بالا، سفارش‌های خرید (Bid) پایین. بهترین قیمت‌ها پررنگ شده‌اند.

Spread دوباره ۲۰ دلار شده، ولی کل دفتر کمی بالاتر نشسته است. مسیر Mid Price را دنبال کنیم:

لحظهBest BidBest AskSpreadMid Price
پیش از معامله99,990100,01020100,000
بلافاصله بعد99,990100,03040100,010
۱ ثانیه بعد (فرضی)99,992100,01826100,005
۱۰ ثانیه بعد (فرضی)99,994100,01420100,004

اثر معامله روی قیمت، یعنی Market Impact، دو بخش دارد:

  • اثر موقت (Temporary Impact): Mid بلافاصله ده دلار بالا رفت، ولی شش دلارش ظرف چند ثانیه برگشت؛ این بخش فقط از خالی شدن سطوح فروش بود و با رسیدن سفارش‌های تازه از بین رفت.
  • اثر ماندگار (Permanent Impact): چهار دلار ماند. دو دلیل رایج: بقیه بازار خرید بزرگ را نشانه اطلاعات می‌بینند، و بازارسازهایی که فروخته‌اند حالا موجودی منفی دارند و قیمت‌هایشان را بالا می‌برند (درس ۶، Skew).

۴. اسلیپیج را نسبت به چه قیمتی بسنجیم؟

در درس ۳ اسلیپیج را اختلاف میانگین قیمت با Best Ask گرفتیم: ۹ دلار. این فقط هزینه پایین رفتن در دفتر است. ولی خریدار در لحظه تصمیم، ارزش بیت‌کوین را حدود Mid یعنی 100,000 می‌دید. به قیمت مرجع لحظه تصمیم Arrival Price می‌گویند و رایج‌ترین مرجع سنجش اسلیپیج است:

Slippage (bps) = side × (Avg Price − Arrival Mid) / Arrival Mid × 10,000

اینجا برای خرید side = +1 و برای فروش side = -1 است تا عدد مثبت همیشه یعنی هزینه. برای خرید 1 BTC ما:

Slippage = (100,019 − 100,000) / 100,000 × 10,000 = 1.9 bps

یعنی ۱۹ دلار به ازای هر بیت‌کوین: ۱۰ دلارش نصف Spread است که حتی کوچک‌ترین سفارش خرید هم می‌پردازد، و ۹ دلارش هزینه عمق ناکافی است.

Implementation Shortfall: وقتی همه سفارش پر نمی‌شود

اگر برای فرار از اسلیپیج سفارش Limit بگذاری، ممکن است قیمت بهتری بگیری یا بخشی از سفارشت هرگز پر نشود. برای مقایسه منصفانه، Implementation Shortfall (کسری اجرا، Perold ۱۹۸۸) را به کار می‌بریم: اختلاف نتیجه واقعی با سبدی کاغذی که کل حجم را در لحظه تصمیم با قیمت مرجع خریده بود. در ساده‌ترین شکل دو جزء دارد:

Execution Cost = side × (Avg Price − Decision Price) × Filled Qty
Opportunity Cost = side × (End Price − Decision Price) × Unfilled Qty

Implementation Shortfall جمع این دو، به‌علاوه کارمزد است. فرض کن به‌جای سفارش Market، سفارش خرید Limit به حجم 1 BTC در 99,990 گذاشته‌ای. فقط 0.4 BTC از آن پر می‌شود، بعد قیمت بالا می‌رود و در پایان بازه Mid به 100,050 می‌رسد و بقیه را لغو می‌کنی (اعداد فرضی، کارمزد را کنار می‌گذاریم):

روش اجراهزینه اجراهزینه فرصتImplementation Shortfall
خرید Market (1 BTC در 100,019)۱۹ دلارصفر۱۹ دلار
خرید Limit در 99,990 (0.4 پر شد)۴ دلار صرفه‌جویی۳۰ دلار (0.6 × 50)۲۶ دلار

سفارش Limit روی بخش پرشده ارزان‌تر بود، ولی هزینه پر نشدن بقیه از کل اسلیپیج سفارش Market بیشتر شد. اگر قیمت پایین رفته بود، نتیجه برعکس می‌شد. نکته ناخوشایند: سفارش Limit معمولاً وقتی راحت پر می‌شود که قیمت در حال حرکت به ضرر توست؛ همان Adverse Selection درس ۸.

۵. Quoted، Effective و Realized Spread

Spread درس ۲ در واقع Quoted Spread است: فاصله اعلام‌شده روی دفتر. Effective Spread هزینه‌ای را که یک معامله واقعاً پرداخته به زبان Spread بیان می‌کند:

Effective Spread = 2 × side × (Trade Price − Mid at Trade)

ضریب ۲ برای این است که فاصله یک‌طرفه تا Mid با Spread کامل قابل مقایسه شود (بعضی منابع همان نصفش را گزارش می‌کنند؛ همیشه تعریف را چک کن). برای خرید 1 BTC ما:

Effective Spread = 2 × (100,019 − 100,000) = 38 USDT

یعنی این خریدار عملاً با Spread ۳۸ دلاری معامله کرد، نه ۲۰ دلاری. برای سفارش کوچکی که در سطح اول جا شود، این دو برابرند؛ و اگر سفارشی داخل Spread پر شود (مثلاً با سفارش‌های پنهانی که در دفتر دیده نمی‌شوند)، Effective از Quoted هم کمتر می‌شود.

حالا از طرف مقابل: فروشنده‌های این 1 BTC از ۳۸ دلار چقدر نگه داشتند؟ برای جواب، Mid چند ثانیه بعد را مرجع می‌گیریم:

Realized Spread = 2 × side × (Trade Price − Mid after Δt)
Price Impact = 2 × side × (Mid after Δt − Mid at Trade)

با Mid ده ثانیه بعد یعنی 100,004:

Quoted Spread — اعلام‌شده روی دفتر
20 USDT
Effective Spread — هزینه واقعی خریدار
38 USDT
Realized Spread — سهم فروشنده‌ها پس از ۱۰ ثانیه
30 USDT
Price Impact — حرکت Mid پس از ۱۰ ثانیه
8 USDT
Effective Spread = Realized Spread + Price Impact → 38 = 30 + 8

این تجزیه برای بازارساز کلیدی است: Taker هزینه Effective را پرداخت، بخش Price Impact با حرکت قیمت از دست طرف مقابل رفت، و Realized Spread همان چیزی است که بازارساز پیش از کارمزد نگه داشت. اگر Realized Spread بازارساز روی تعداد زیادی معامله نزدیک صفر یا منفی باشد، یعنی با کسانی معامله می‌کند که جهت قیمت را بهتر می‌دانند. همین ایده با نام Markout در درس ۸ ابزار اصلی سنجش می‌شود.

۶. شبیه‌سازی: اندازه‌گیری از روی فهرست معاملات

در عمل این اعداد را روی هزاران معامله میانگین می‌گیری و بر حسب اندازه سفارش دسته‌بندی می‌کنی. کد زیر یک بازار مصنوعی می‌سازد با این فرض‌ها: Quoted Spread ثابت ۲۰ دلار، هزینه پایین رفتن در دفتر ۹ دلار به ازای هر بیت‌کوین (مثل درس ۳)، اثر ماندگار ۴ دلار به ازای هر بیت‌کوین (مثل بخش ۳) و حرکت تصادفی Mid. بعد سه معیار را از روی فهرست معاملات حساب می‌کند:

import numpy as np
import pandas as pd

rng = np.random.default_rng(7)
n = 5000                 # one taker trade per second
half_spread = 10.0       # quoted spread = 20 USDT
walk_cost = 9.0          # extra USDT per BTC from walking the book
perm_impact = 4.0        # USDT per BTC that stays in the mid
noise_sd = 3.0           # random mid move per second (USDT)
horizon = 5              # seconds after the trade for realized spread

side = rng.choice([1, -1], size=n)                  # +1 buy, -1 sell
size = np.clip(rng.exponential(0.3, size=n), 0.01, 2.0)

# Mid before each trade: random walk + permanent impact of past trades
moves = rng.normal(0, noise_sd, size=n) + perm_impact * side * size
mid = 100_000 + np.concatenate([[0.0], np.cumsum(moves)[:-1]])
price = mid + side * (half_spread + walk_cost * size)

df = pd.DataFrame({"side": side, "size": size, "mid": mid, "price": price})
df["mid_later"] = df["mid"].shift(-horizon)
df = df.dropna()

d = df["side"]
df["effective"] = 2 * d * (df["price"] - df["mid"])
df["realized"] = 2 * d * (df["price"] - df["mid_later"])
df["impact"] = 2 * d * (df["mid_later"] - df["mid"])

df["bucket"] = pd.cut(df["size"], [0, 0.1, 0.5, 2.0],
                      labels=["small", "medium", "large"])
cols = ["effective", "realized", "impact"]
table = df.groupby("bucket", observed=True)[cols].mean()
table["eff_bps"] = table["effective"] / df["mid"].mean() * 1e4
table["count"] = df.groupby("bucket", observed=True).size()
print("quoted spread: 20.0 USDT")
print(table.round(1))

خروجی:

quoted spread: 20.0 USDT
        effective  realized  impact  eff_bps  count
bucket                                             
small        20.9      20.2     0.7      2.1   1405
medium       24.6      22.4     2.2      2.5   2663
large        34.6      28.1     6.5      3.5    927
  • برای معامله‌های کوچک (تا 0.1 BTC)، Effective تقریباً همان Quoted است؛ هر چه سفارش بزرگ‌تر، فاصله بیشتر.
  • Price Impact با اندازه بزرگ می‌شود و از سهم بازارساز کم می‌کند. Price Impact دسته بزرگ (6.5) تقریباً برابر 2 × 4 × 0.81 است که 0.81 میانگین اندازه آن دسته است؛ یعنی اندازه‌گیری همان فرض کد را پس داد.

۷. چه چیزی کیفیت اجرا را تعیین می‌کند؟

کیفیت اجرا یعنی Implementation Shortfall کوچک، هم به‌طور میانگین و هم در بدترین حالت‌ها. عامل‌های اصلی:

  • اندازه سفارش نسبت به عمق: مهم‌ترین عامل. سفارشی که در سطح اول جا شود فقط نصف Spread می‌پردازد.
  • فوریت و نوع سفارش: Market قطعیت می‌خرد و Spread و اسلیپیج می‌پردازد؛ Limit در قیمت صرفه‌جویی می‌کند و ریسک پر نشدن می‌پذیرد (جدول بخش ۴).
  • نوسان و زمان‌بندی: در بازار پرنوسان یا اطراف خبرها، Spread بازتر، دفتر کم‌عمق‌تر و هزینه پر نشدن بیشتر است.
  • تأخیر و کارمزد: تأخیر احتمال رفتن نقدشوندگی دیده‌شده را بالا می‌برد (درس ۱۹)، و کارمزد Taker معمولاً بیشتر از Maker است و مستقیم به هزینه اضافه می‌شود (درس ۷).
  • تقسیم سفارش: خرید در چند تکه با فاصله زمانی به دفتر فرصت دوباره پر شدن می‌دهد (همان Resilience)، ولی تکه‌های پشت سر هم الگویی می‌سازند که بقیه بازار می‌بینند.

وقتی مدل خطی می‌شکند

در شبیه‌سازی اثر قیمتی را خطی گرفتیم. برای سفارش‌های بزرگی که در طول دقیقه‌ها یا ساعت‌ها و در چند تکه اجرا می‌شوند، مطالعات تجربی در بازارهای مختلف دیده‌اند که اثر تقریباً با ریشه دوم اندازه رشد می‌کند (Square-Root Law):

Impact ≈ Y × σ × √(Q / V)

اینجا σ نوسان روزانه قیمت، V حجم معاملات روزانه، Q حجم کل سفارش و Y یک ضریب تجربی از مرتبه ۱ است. مثلاً اگر Q یک درصد حجم روزانه باشد، √0.01 = 0.1 و اثر تقریباً یک‌دهم نوسان روزانه است. دو برابر کردن حجم، اثر را حدود ۱.۴ برابر می‌کند، نه دو برابر. این یک قاعده سرانگشتی تجربی است، نه قانون طبیعت: Y از بازاری به بازار دیگر فرق دارد، رابطه برای یک Market Order تکی ساخته نشده، و در بازار کم‌عمق یا لحظه‌های بحرانی ممکن است کاملاً بشکند.

۸. جمع‌بندی بخش اول

بخش اول اینجا تمام می‌شود. در درس ۱ دیدیم بازارساز چه می‌کند و چرا Spread به‌تنهایی سود نیست؛ در درس ۲ Bid، Ask، Mid و Spread را دقیق کردیم؛ در درس ۳ دفتر سفارش و موتور معاملات را ساختیم؛ و در این درس همان دفتر را در طول زمان دیدیم و هزینه اجرا را اندازه گرفتیم. نکته مشترک هر چهار درس: عددی که روی صفحه می‌بینی (Spread اعلام‌شده، عمق دیده‌شده، Mid لحظه‌ای) با چیزی که واقعاً به دست می‌آید فاصله دارد. بخش دوم درباره همین فاصله است، از نگاه اقتصاد بازارساز.

۹. تمرین این درس

گزینه مناسب هر سؤال را انتخاب کن و در پایان نتیجه را ببین. دفتر سفارش همان دفتر درس ۱ است.

سؤال ۱: یک فروش Market به حجم 0.5 BTC روی دفتر درس ۱ اجرا می‌شود. Mid پیش از معامله 100,000 است. Effective Spread این معامله چقدر است؟
سؤال ۲: یک خرید در 100,015 انجام می‌شود. Mid لحظه معامله 100,000 و Mid ده ثانیه بعد 100,012 است. Realized Spread چقدر است؟
سؤال ۳: در لحظه تصمیم Mid برابر 100,000 است. سفارش خرید Limit به حجم 1 BTC در 99,995 می‌گذاری؛ 0.5 BTC پر می‌شود، Mid به 100,040 می‌رسد و بقیه را لغو می‌کنی. Implementation Shortfall بدون کارمزد چقدر است؟
سؤال ۴: کدام گزینه بُعد Resilience (انعطاف‌پذیری) نقدشوندگی را توصیف می‌کند؟

درس بعدی

در تمام این درس Mid Price را مرجع «ارزش» گرفتیم. ولی دیدی که بلافاصله بعد از معامله بزرگ، Mid ده دلار پرید فقط چون سمت فروش خالی شده بود؛ آیا ارزش بیت‌کوین واقعاً ده دلار بالا رفته بود؟ درس پنجم، شروع بخش دوم، درباره Fair Value و قیمت‌گذاری است: چرا آخرین قیمت معامله و Mid Price همیشه تخمین خوبی از ارزش منصفانه نیستند، و بازارساز قیمت مرجعش را از چه داده‌هایی می‌سازد.

این مطلب صرفاً آموزشی است و توصیه خرید، فروش یا سرمایه‌گذاری نیست.