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 হিসেবে কাজ করে।





