آموزش 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 می‌کنند.

سوالات متداول

Order book imbalance چیست؟
نسبت حجم bid به حجم ask در بالای book است. یک book که به‌شدت به سمت bid متمایل باشد (یعنی نزدیک touch خریدار بیشتری نسبت به فروشنده داشته باشد) نشان‌دهنده فشار قیمتی صعودی در بسیار کوتاه‌مدت است. این سیگنال در crypto و equities شناخته‌شده است؛ در Polymarket در بازارهای liquid کار می‌کند اما در بازارهای thin از بین می‌رود.
Microprice را چطور محاسبه کنم؟
microprice = (best_ask * bid_size + best_bid * ask_size) / (bid_size + ask_size). این نسخه‌ای volume-weighted از mid-price است که به سمتی با حجم کمتر متمایل می‌شود - همان سمتی که زودتر "تمام می‌شود". Botها از آن به‌عنوان برآورد fair value استفاده می‌کنند که imbalance را هم در نظر می‌گیرد.
نیمه‌عمر یک imbalance signal در Polymarket چقدر است؟
در بازارهای فعال، 5 تا 30 ثانیه. در بازارهای thin، بیشتر است (چون orderهای جدید دیرتر می‌توانند imbalance را تحت‌الشعاع قرار دهند). اگر bot شما زیر یک ثانیه واکنش نشان دهد، می‌تواند بخشی از آن را capture کند. اگر 5 ثانیه یا بیشتر طول بکشد، معمولاً دیر شده است.
چه زمانی imbalance گمراه‌کننده است؟
وقتی یک order بزرگ در یک سمت منتظر hit شدن قرار دارد (مثلاً یک big resting bid و هیچ activity دیگری نیست). imbalance واقعی است اما price را پیش‌بینی نمی‌کند - فقط نشان می‌دهد یک خریدار مصمم وجود دارد. با شمارش orderها، نه فقط volume، فیلتر کنید: imbalance با N order در برابر 1 order از حجم 5x در یک order واحد informative‌تر است.
آیا order book imbalance به‌تنهایی برای trade کافی است؟
معمولاً نه. به‌عنوان یک سیگنال مستقل، ضعیف است و arbitrage می‌شود. آن را با یک سیگنال دیگر (مثلاً macroprice mean reversion، news flag، یا وضعیت sports) ترکیب کنید تا edge پایدارتر شود. Imbalance به‌تنهایی بعد از fees معمولاً از random execution ضعیف‌تر عمل می‌کند.
کدام Python library می‌تواند imbalance را از Polymarket WS محاسبه کند؟
تا جایی که می‌دانیم library آماده‌ای برای این کار وجود ندارد - فقط چند ده خط code لازم است. از طریق py-clob-client به market book subscribe کنید، در هر price_change event اندازه‌های bid/ask بالای book را دوباره محاسبه کنید و metric imbalance را خروجی بگیرید. مقدار آخر را cache کنید و فقط هنگام تغییرات معنادار دوباره trigger کنید.