آموزش Polymarket Bot · فصل 17 از 32
از عدمتعادل order book Polymarket بهعنوان یک سیگنال قیمتی کوتاهمدت استفاده کنید: نسبت حجم bid-ask، محاسبه microprice، نیمهعمر سیگنال، و اینکه چه زمانی imbalance botها از execution تصادفی بهتر عمل میکنند.
این فصل چه چیزهایی را پوشش میدهد
Order-book imbalance نسبت عمق سمت buy به عمق سمت sell در limit order book است. در Polymarket این شاخص یک edge واقعی اما کوتاهعمر دارد - معمولاً 5 تا 30 ثانیه قبل از اینکه mid حرکت کند. این فصل الگوی محاسبه و شرایطی را توضیح میدهد که در آن این سیگنال گمراهکننده میشود.
- Order book imbalance چیست
- محاسبه Microprice
- Imbalance بهعنوان سیگنال جهتدار
- نیمهعمر سیگنال در Polymarket
- چه زمانی imbalance signals گمراهکنندهاند
- Code: محاسبه imbalance در هر WS tick
Order book imbalance چیست
Order book imbalance نسبت کل عمق سمت buy به کل عمق سمت sell در limit order book است. این شاخص که در top-N levels محاسبه میشود (معمولاً N=5)، فشار تجمیعی معاملهگران را ثبت میکند؛ فشاری که mid-price هنوز آن را منعکس نکرده است.
Formula: imbalance = (Σ bid[i].price × bid[i].size for i in [0..N]) − (Σ ask[i].price × ask[i].size) / (Σ both). بازه از -1 تا +1 است؛ عدد مثبت یعنی فشار خرید بیشتر و عدد منفی یعنی فشار فروش بیشتر.
این سیگنال در عمل در Polymarket واقعی است اما نویزی هم هست. یک whale میتواند imbalance جعلی ایجاد کند و 30 تا 60 ثانیه قبل از اینکه arbed شود، بازار را فریب دهد. این شاخص بهعنوان یکی از چند feature مفید است، اما بهعنوان تنها trigger خطرناک است.
محاسبه Microprice
Microprice نسخه دقیقتر mid ساده است: یک میانگین وزنی از بهترین bid و بهترین ask، با وزندهی بر اساس اندازههای مربوط به هرکدام.
microprice = (best_bid × ask_size + best_ask × bid_size) / (bid_size + ask_size)
وقتی queue سمت bid خیلی بزرگتر از سمت ask باشد، microprice به ask نزدیکتر میشود. منطقش این است: وقتی خریداران بیشتری منتظرند، احتمال اینکه معامله بعدی ask را بردارد بیشتر است؛ پس fair value به ask نزدیکتر میشود.
Microprice یک leading indicator برای حرکت واقعی mid در بازه 5 تا 30 ثانیه است. botهای production از آن بهعنوان reference price برای تصمیمهای take-profit بهجای mid ساده استفاده میکنند.
Imbalance بهعنوان سیگنال جهتدار
بر اساس مشاهده در production: وقتی imbalance در 10 ثانیه از -0.3 به +0.5 میرسد و رویداد خبری همراه آن نیست، mid در 30 تا 60 ثانیه بعد در حدود 65٪ مواقع 1 تا 2 cent بالا میرود.
این یک edge واقعی است، اما با position sizeهای کوچک و بعد از fees از بین میرود. برای monetization، bot باید بهاندازهای size بگیرد که حرکت را منهای fees پوشش دهد، اما نه آنقدر زیاد که خودش book را جابهجا کند. Order bookهای Polymarket معمولاً آنقدر thin هستند که هر چیزی بالاتر از 50 shares میتواند market را حرکت دهد.
Imbalance را با ویژگیهای دیگر ترکیب کنید: trade velocity (هرچه trades بیشتر، سیگنال واقعیتر)، بالا رفتن واقعی best-bid (نه فقط جابهجایی depth)، و اینکه market در حالت news-driven نباشد.
نیمهعمر سیگنال در Polymarket
سیگنال imbalance decay میکند. دادههای production از trader ما: imbalance > 0.6 → حرکت مورد انتظار mid به اندازه 1.2c در 60 ثانیه، با نیمهعمر حدود 30 ثانیه. بعد از 90 ثانیه، ارزش پیشبینیکننده آن عملاً به صفر میرسد.
نتیجه برای طراحی bot: سریع واکنش نشان دهید یا اصلاً وارد نشوید. Botی که 15 ثانیه برای تصمیمگیری زمان صرف کند، پیش از ثبت order نیمی از edge را مصرف کرده است. Latency budget برای استراتژیهای imbalance باید از signal تا fire شدن FOK کمتر از 5 ثانیه باشد.
استراتژیهایی که position را بیشتر از نیمهعمر نگه میدارند (1 تا 2 دقیقه) در واقع روی سیگنال بعدی شرطبندی میکنند، نه سیگنال فعلی. این را شفاف مشخص کنید؛ بهاشتباه positionهای مبتنی بر imbalance را تا زمان resolution نگه ندارید.
چه زمانی imbalance signals گمراهکنندهاند
این سیگنال زمانی گمراهکننده میشود که یکی از سه شرط زیر برقرار باشد.
- حرکت ناشی از خبر: imbalance نتیجه خبری است که شما هنوز ندیدهاید. معامله خلاف آن ضرر میدهد؛ معامله همراه با آن news arbitrage است، یعنی یک strategy متفاوت.
- Whale spoofing: یک order بزرگ که سریع place و cancel میشود، برای مدت کوتاه imbalance جعلی ایجاد میکند. با بررسی اینکه imbalance حداقل 10 ثانیه پایدار بماند، آن را فیلتر کنید.
- End-of-period rebalancing: market makerها به دلایل inventory نه اطلاعات، quoteها را جمع میکنند. چند دقیقه بعد که MM دوباره quote میدهد، imbalance معکوس میشود.
فیلتر ترکیبی این است: imbalance > threshold AND trade velocity > baseline AND هیچ رویداد خبری در 5 دقیقه گذشته نباشد. هر فیلتر بهتنهایی false positive زیادی دارد.
Code: محاسبه imbalance در هر WS tick
Reference: به WebSocket book updates subscribe کنید و در هر tick دوباره imbalance را محاسبه کنید.
def on_book_message(msg):
bids = msg.get("bids", [])[:5]
asks = msg.get("asks", [])[:5]
bid_usd = sum(float(b["price"]) * float(b["size"]) for b in bids)
ask_usd = sum(float(a["price"]) * float(a["size"]) for a in asks)
total = bid_usd + ask_usd
if total < 100: return # illiquid
imb = (bid_usd - ask_usd) / total
state[msg["asset_id"]] = {
"imb": imb,
"best_bid": float(bids[0]["price"]) if bids else 0,
"best_ask": float(asks[0]["price"]) if asks else 1,
"ts": time.time()
}
# decision logic with cooldown + filters
if imb > 0.6 and time.time() - last_fired.get(msg["asset_id"], 0) > 60:
check_filters_and_maybe_fire(msg["asset_id"])
State برای هر token جداست. Cooldown از over-firing روی یک سیگنال جلوگیری میکند. Filters (news check، trade velocity) خودِ trade را gate میکنند.





