Polymarket Bot Tutorial · Chapter 17 of 32

Polymarket order book imbalance-কে একটি short-term price signal হিসেবে ব্যবহার করুন: bid-ask volume ratio, microprice computation, signal half-life, এবং কখন imbalance bots random execution-কে হারায়।

এই অধ্যায়ে কী কী আছে

Order-book imbalance হলো limit order book-এ buy-side depth এবং sell-side depth-এর অনুপাত। Polymarket-এ এর একটি বাস্তব কিন্তু স্বল্পস্থায়ী predictive edge আছে - সাধারণত mid move হওয়ার 5-30 seconds আগে। এই অধ্যায়ে computation pattern এবং সেই পরিস্থিতিগুলো দেখানো হয়েছে যেখানে signal ভুল হতে পারে।

  • Order book imbalance কী
  • Microprice computation
  • Directional signal হিসেবে imbalance
  • Polymarket-এ signal half-life
  • কখন imbalance signals ভুল হয়
  • Code: প্রতিটি WS tick-এ imbalance compute করুন

Order book imbalance কী

Order book imbalance হলো limit order book-এ total buy-side depth এবং total sell-side depth-এর অনুপাত। Top-N levels-এ compute করা হলে (সাধারণত N=5), এটি aggregate trader pressure ধরতে পারে যা mid-price এখনও reflect করেনি।

Formula: imbalance = (Σ bid[i].price × bid[i].size for i in [0..N]) − (Σ ask[i].price × ask[i].size) / (Σ both). Range -1 to +1; positive মানে বেশি buy pressure, negative মানে বেশি sell pressure।

Polymarket-এ signal empirically real, কিন্তু noisy। একক whale 30-60 seconds পর্যন্ত fake-print imbalance তৈরি করতে পারে, তারপর arbed out হয়ে যায়। এটি একাধিক feature-এর মধ্যে একটি feature হিসেবে useful, কিন্তু sole trigger হিসেবে dangerous।

Microprice computation

Microprice হলো simple mid-এর একটি refined version: best bid এবং best ask-এর weighted average, যেখানে weighting হয় তাদের respective size অনুযায়ী।

microprice = (best_bid × ask_size + best_ask × bid_size) / (bid_size + ask_size)

যখন bid-side queue ask side-এর তুলনায় অনেক বড় হয়, microprice ask-এর কাছাকাছি থাকে। যুক্তিটি হলো: বেশি buyer অপেক্ষা করলে পরবর্তী trade ask lift করার সম্ভাবনা বেশি, তাই fair value ask-এর কাছাকাছি।

Microprice আসল mid move হওয়ার 5-30 second আগে একটি leading indicator হিসেবে কাজ করে। Production bots এটি naive mid-এর বদলে take-profit সিদ্ধান্তের reference price হিসেবে ব্যবহার করে।

Directional signal হিসেবে imbalance

Production observation অনুযায়ী: কোনো news event ছাড়া 10 seconds-এর মধ্যে যখন imbalance -0.3 থেকে +0.5-এ flip করে, তখন পরবর্তী 30-60 seconds-এর মধ্যে mid 1-2 cents উপরে যায় প্রায় 65% সময়।

এটি একটি real edge, কিন্তু fee বাদ দিলে ছোট position size-এ তা মিলিয়ে যায়। Monetize করতে হলে bot-কে move minus fees ধরার মতো যথেষ্ট size নিতে হবে, কিন্তু book নিজেই না নাড়িয়ে। Polymarket-এর books সাধারণত এতটাই thin যে 50 shares-এর বেশি কিছু বাজারকে move করে।

Imbalance-কে অন্য feature-এর সাথে combine করুন: trade velocity (trade বেশি মানে signal সত্যি), best-bid বাস্তবে উপরে উঠছে কি না (শুধু depth shift নয়), market news-driven mode-এ নেই কি না।

Polymarket-এ signal half-life

Imbalance signal decay হয়। আমাদের trader-এর production data: imbalance > 0.6 → 60s-এর মধ্যে expected mid move 1.2c, half-life প্রায় ~30s। 90 seconds পরে predictive value শূন্যে নেমে যায়।

Bot design-এর implication: দ্রুত react করুন অথবা skip করুন। যে bot সিদ্ধান্ত নিতে 15 seconds নেয়, order place করার আগেই edge-এর অর্ধেক খরচ করে ফেলে। Imbalance strategies-এর latency budget signal থেকে FOK fired হওয়া পর্যন্ত 5 seconds-এর নিচে হওয়া উচিত।

যে strategies half-life-এর চেয়ে বেশি সময় position ধরে রাখে (1-2 minutes), তারা বর্তমান signal নয়, পরের signal-এর উপর gambling করছে। এটা স্পষ্ট রাখুন; ভুল করে imbalance-driven positions resolution পর্যন্ত ধরে রাখবেন না।

কখন imbalance signals ভুল হয়

নিচের তিনটি condition-এর যেকোনো একটি থাকলে signal বিভ্রান্ত করতে পারে।

  • News-driven move: imbalance এমন কোনো news-এর ফল যা আপনি দেখেননি। এর বিপরীতে trade করলে ক্ষতি হয়; এর সাথে trade করা হলো news arbitrage, যা আলাদা strategy।
  • Whale spoofing: বড় order দিয়ে দ্রুত cancel করলে পুরো duration জুড়ে fake imbalance তৈরি হয়। Trigger করার আগে imbalance 10+ seconds স্থায়ী কি না দেখে filter করুন।
  • End-of-period rebalancing: তথ্যের কারণে নয়, inventory কারণে market makers quote তুলে নিচ্ছে। কিছু minutes পরে MM re-quote করলে imbalance উল্টে যায়।

Combined filter হলো: imbalance > threshold AND trade velocity > baseline AND গত 5 minutes-এ কোনো news event নেই। প্রতিটি filter আলাদাভাবে যথেষ্ট false positive দেয়।

Code: প্রতিটি WS tick-এ imbalance compute করুন

Reference: WebSocket book updates subscribe করুন, এবং প্রতিটি tick-এ imbalance recompute করুন।

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-per-token। Cooldown একই signal-এ বারবার fire হওয়া রোধ করে। Filters (news check, trade velocity) actual trade-এ gate হিসেবে কাজ করে।

প্রায়শই জিজ্ঞাসিত প্রশ্ন

Order book imbalance কী?
Book-এর top-এ bid volume এবং ask volume-এর অনুপাত। একপাশে খুব বেশি bid-skewed book (touch-এর কাছে buyer seller-এর চেয়ে বেশি) খুব স্বল্পমেয়াদে price upward pressure-এর ইঙ্গিত দেয়। এই signal crypto এবং equities-এ সুপরিচিত; Polymarket-এ এটি liquid market-এ কাজ করে, কিন্তু thin market-এ হারিয়ে যায়।
Microprice কীভাবে compute করব?
microprice = (best_ask * bid_size + best_bid * ask_size) / (bid_size + ask_size). এটি mid-price-এর একটি volume-weighted version, যা volume কম এমন side-এর দিকে ঝুঁকে থাকে - যে side প্রথমে "শেষ হয়ে যাচ্ছে"। Bots এটিকে imbalance-সহ fair-value estimate হিসেবে ব্যবহার করে।
Polymarket-এ imbalance signal-এর half-life কত?
Active market-এ 5-30 seconds। Thin market-এ বেশি, কারণ new orders imbalance overwhelm করতে বেশি সময় নেয়। আপনার bot যদি 1 second-এর মধ্যে react করে, কিছুটা capture করা যায়। 5+ seconds লাগলে সাধারণত দেরি হয়ে যায়।
কখন imbalance ভুল হয়?
যখন একদিকে একটি বড় order বসে থাকে hit হওয়ার অপেক্ষায় (একটি বড় resting bid, অন্য activity নেই)। Imbalance বাস্তব, কিন্তু price predict করে না - শুধু একজন motivated buyer দেখায়। Volume নয়, order count গুনে filter করুন: N orders to 1 order imbalance, 1 order each-এর 5x volume-এর চেয়ে বেশি informative।
Order book imbalance alone trade করার জন্য যথেষ্ট কি?
সাধারণত না। Standalone signal হিসেবে এটি দুর্বল এবং arbitrage হয়ে যায়। আরেকটি signal-এর সাথে combine করুন (যেমন, macroprice mean reversion, news flag, বা sports state) যাতে edge বেশি durable হয়। Imbalance alone সাধারণত fees-এর পরে random execution-এর চেয়ে খারাপ performance দেয়।
Polymarket WS থেকে imbalance compute করার জন্য কোন Python library আছে?
আমরা জানি এমন কোনো off-the-shelf library নেই - এটি কয়েক ডজন lines of code। py-clob-client দিয়ে market book-এ subscribe করুন, প্রতিটি price_change event-এ top-of-book bid/ask sizes recompute করুন, এবং আপনার imbalance metric emit করুন। Last value cache করুন এবং meaningful change হলেই শুধু re-trigger করুন।