مسیر Quant Developer · بخش ۱: مبانی بازار و Market Making · درس ۴
Market Microstructure: جریان سفارش، اسلیپیج و کیفیت اجرا
دفتر سفارش در طول زمان و بعد از یک معامله بزرگ چطور تغییر میکند، و هزینه واقعی اجرای سفارش را با اسلیپیج و Effective Spread چطور اندازه بگیریم.
۱. از عکس به فیلم: جریان سفارش
دفتر سفارشی که در درسهای قبل دیدیم یک عکس بود؛ وضعیت بازار در یک لحظه. بازار واقعی یک فیلم است: هر لحظه سفارشی اضافه میشود، سفارشی لغو میشود و معاملهای انجام میشود. به مطالعه اینکه قیمت دقیقاً از دل چه سفارشها و قواعدی بیرون میآید، Market Microstructure (ریزساختار بازار) میگویند.
هر تغییری در دفتر سفارش از یکی از این سه نوع رویداد است:
- ثبت (Add): یک سفارش Limit تازه در دفتر مینشیند و عمق آن سطح را زیاد میکند.
- لغو (Cancel): سفارشی که منتظر بود برداشته میشود. معاملهای رخ نداده، ولی عمق کم شده است.
- معامله (Trade): یک سفارش Taker میرسد و سفارشهای منتظر را مصرف میکند.
به دنباله این رویدادها، بهویژه دنباله معاملههای خرید و فروش، جریان سفارش (Order Flow) میگویند. بیا از همان دفتر سفارش BTC/USDT درس ۱ شروع کنیم و یک ثانیه و نیم از این فیلم را ببینیم (رویدادها فرضیاند):
| زمان | رویداد | جزئیات | Best Bid | Best Ask | Spread |
|---|---|---|---|---|---|
| 09:00:00.000 | شروع | دفتر سفارش درس ۱ | 99,990 | 100,010 | 20 |
| 09:00:00.180 | ثبت | خرید Limit به حجم 0.2 در 99,995 | 99,995 | 100,010 | 15 |
| 09:00:00.410 | لغو | فروش 0.3 در 100,010 برداشته شد | 99,995 | 100,020 | 25 |
| 09:00:00.650 | معامله | خرید Market به حجم 0.5 در 100,020 | 99,995 | 100,030 | 35 |
| 09:00:00.900 | ثبت | فروش Limit به حجم 0.4 در 100,025 | 99,995 | 100,025 | 30 |
| 09:00:01.300 | لغو | خرید 0.2 در 99,995 برداشته شد | 99,990 | 100,025 | 35 |
در این یک ثانیه و نیم فقط یک معامله انجام شد، ولی بهترین قیمتها پنج بار عوض شدند. سه برداشت:
- بیشتر رویدادها معامله نیستند. در بسیاری از بازارها پیامهای ثبت و لغو چندین برابر معاملههاست؛ فهرست معاملهها بهتنهایی بیشتر داستان را نشان نمیدهد.
- نقدشوندگی دیدهشده ممکن است وقتی سفارشت برسد، آنجا نباشد. کسی که در لحظه 0.000 خواست 0.3 BTC در 100,010 بخرد، اگر سفارشش بعد از 0.410 میرسید، قیمت بدتری میگرفت. این موضوع درس ۱۹ (Latency) است.
- جریان سفارش تصادفی محض نیست. در داده واقعی، خریدها معمولاً پشت سر هم میآیند و فروشها هم؛ از جمله چون معاملهگرهای بزرگ سفارششان را به تکههای کوچک تقسیم میکنند.
۲. سه بُعد نقدشوندگی
در درس ۱ گفتیم بازارساز «نقدشوندگی» فراهم میکند. حالا میتوانیم این کلمه را دقیقتر کنیم. در ادبیات ریزساختار، معمولاً نقدشوندگی را سهبعدی میبینند:
- فشردگی (Tightness): معامله فوری چقدر گران است؟ همان Spread که در درس ۲ دیدیم.
- عمق (Depth): چه حجمی را میشود بدون جابهجا کردن زیاد قیمت معامله کرد؟ همان حجم سطوح دفتر که در درس ۳ دیدیم.
- انعطافپذیری (Resilience): بعد از یک معامله بزرگ، دفتر سفارش با چه سرعتی دوباره پر میشود و قیمت به حالت عادی برمیگردد؟
دو بُعد اول در یک عکس دیده میشوند. بُعد سوم فقط در فیلم دیده میشود؛ پس بیا همان معامله درس ۳ را این بار در طول زمان دنبال کنیم.
۳. بعد از Market Order درس ۳ چه شد؟
در درس ۳ یک خرید Market به حجم 1 BTC سه سطح Ask را مصرف کرد و میانگین قیمتش 100,019 شد. درست بعد از این معامله، دفتر سفارش این شکل را داشت:
Spread از ۲۰ به ۴۰ دلار رسیده و سمت فروش تقریباً خالی است. این وضعیت دوام ندارد: بازارسازها Spread بزرگ را فرصت میبینند و سفارش فروش تازه میگذارند. ده ثانیه بعد، دفتر ممکن است این شکل را داشته باشد (فرضی):
Spread دوباره ۲۰ دلار شده، ولی کل دفتر کمی بالاتر نشسته است. مسیر Mid Price را دنبال کنیم:
| لحظه | Best Bid | Best Ask | Spread | Mid Price |
|---|---|---|---|---|
| پیش از معامله | 99,990 | 100,010 | 20 | 100,000 |
| بلافاصله بعد | 99,990 | 100,030 | 40 | 100,010 |
| ۱ ثانیه بعد (فرضی) | 99,992 | 100,018 | 26 | 100,005 |
| ۱۰ ثانیه بعد (فرضی) | 99,994 | 100,014 | 20 | 100,004 |
اثر معامله روی قیمت، یعنی Market Impact، دو بخش دارد:
- اثر موقت (Temporary Impact): Mid بلافاصله ده دلار بالا رفت، ولی شش دلارش ظرف چند ثانیه برگشت؛ این بخش فقط از خالی شدن سطوح فروش بود و با رسیدن سفارشهای تازه از بین رفت.
- اثر ماندگار (Permanent Impact): چهار دلار ماند. دو دلیل رایج: بقیه بازار خرید بزرگ را نشانه اطلاعات میبینند، و بازارسازهایی که فروختهاند حالا موجودی منفی دارند و قیمتهایشان را بالا میبرند (درس ۶، Skew).
۴. اسلیپیج را نسبت به چه قیمتی بسنجیم؟
در درس ۳ اسلیپیج را اختلاف میانگین قیمت با Best Ask گرفتیم: ۹ دلار. این فقط هزینه پایین رفتن در دفتر است. ولی خریدار در لحظه تصمیم، ارزش بیتکوین را حدود Mid یعنی 100,000 میدید. به قیمت مرجع لحظه تصمیم Arrival Price میگویند و رایجترین مرجع سنجش اسلیپیج است:
اینجا برای خرید side = +1 و برای فروش side = -1 است تا عدد مثبت همیشه یعنی هزینه. برای خرید 1 BTC ما:
یعنی ۱۹ دلار به ازای هر بیتکوین: ۱۰ دلارش نصف Spread است که حتی کوچکترین سفارش خرید هم میپردازد، و ۹ دلارش هزینه عمق ناکافی است.
Implementation Shortfall: وقتی همه سفارش پر نمیشود
اگر برای فرار از اسلیپیج سفارش Limit بگذاری، ممکن است قیمت بهتری بگیری یا بخشی از سفارشت هرگز پر نشود. برای مقایسه منصفانه، Implementation Shortfall (کسری اجرا، Perold ۱۹۸۸) را به کار میبریم: اختلاف نتیجه واقعی با سبدی کاغذی که کل حجم را در لحظه تصمیم با قیمت مرجع خریده بود. در سادهترین شکل دو جزء دارد:
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 بیان میکند:
ضریب ۲ برای این است که فاصله یکطرفه تا Mid با Spread کامل قابل مقایسه شود (بعضی منابع همان نصفش را گزارش میکنند؛ همیشه تعریف را چک کن). برای خرید 1 BTC ما:
یعنی این خریدار عملاً با Spread ۳۸ دلاری معامله کرد، نه ۲۰ دلاری. برای سفارش کوچکی که در سطح اول جا شود، این دو برابرند؛ و اگر سفارشی داخل Spread پر شود (مثلاً با سفارشهای پنهانی که در دفتر دیده نمیشوند)، Effective از Quoted هم کمتر میشود.
حالا از طرف مقابل: فروشندههای این 1 BTC از ۳۸ دلار چقدر نگه داشتند؟ برای جواب، Mid چند ثانیه بعد را مرجع میگیریم:
با Mid ده ثانیه بعد یعنی 100,004:
- Quoted Spread — اعلامشده روی دفتر
- 20 USDT
- Effective Spread — هزینه واقعی خریدار
- 38 USDT
- Realized Spread — سهم فروشندهها پس از ۱۰ ثانیه
- 30 USDT
- Price Impact — حرکت Mid پس از ۱۰ ثانیه
- 8 USDT
این تجزیه برای بازارساز کلیدی است: 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):
اینجا σ نوسان روزانه قیمت، V حجم معاملات روزانه، Q حجم کل سفارش و Y یک ضریب تجربی از مرتبه ۱ است. مثلاً اگر Q یک درصد حجم روزانه باشد، √0.01 = 0.1 و اثر تقریباً یکدهم نوسان روزانه است. دو برابر کردن حجم، اثر را حدود ۱.۴ برابر میکند، نه دو برابر. این یک قاعده سرانگشتی تجربی است، نه قانون طبیعت: Y از بازاری به بازار دیگر فرق دارد، رابطه برای یک Market Order تکی ساخته نشده، و در بازار کمعمق یا لحظههای بحرانی ممکن است کاملاً بشکند.
۸. جمعبندی بخش اول
بخش اول اینجا تمام میشود. در درس ۱ دیدیم بازارساز چه میکند و چرا Spread بهتنهایی سود نیست؛ در درس ۲ Bid، Ask، Mid و Spread را دقیق کردیم؛ در درس ۳ دفتر سفارش و موتور معاملات را ساختیم؛ و در این درس همان دفتر را در طول زمان دیدیم و هزینه اجرا را اندازه گرفتیم. نکته مشترک هر چهار درس: عددی که روی صفحه میبینی (Spread اعلامشده، عمق دیدهشده، Mid لحظهای) با چیزی که واقعاً به دست میآید فاصله دارد. بخش دوم درباره همین فاصله است، از نگاه اقتصاد بازارساز.
۹. تمرین این درس
گزینه مناسب هر سؤال را انتخاب کن و در پایان نتیجه را ببین. دفتر سفارش همان دفتر درس ۱ است.
درس بعدی
در تمام این درس Mid Price را مرجع «ارزش» گرفتیم. ولی دیدی که بلافاصله بعد از معامله بزرگ، Mid ده دلار پرید فقط چون سمت فروش خالی شده بود؛ آیا ارزش بیتکوین واقعاً ده دلار بالا رفته بود؟ درس پنجم، شروع بخش دوم، درباره Fair Value و قیمتگذاری است: چرا آخرین قیمت معامله و Mid Price همیشه تخمین خوبی از ارزش منصفانه نیستند، و بازارساز قیمت مرجعش را از چه دادههایی میسازد.
این مطلب صرفاً آموزشی است و توصیه خرید، فروش یا سرمایهگذاری نیست.