পলিমার্কেট বট টিউটোরিয়াল · অধ্যায় 13 / 32
পলিমার্কেট-এ market making: কীভাবে bid এবং ask quote করতে হয়, spread capture করতে হয়, maker rebates (taker fees-এর 20-25%), inventory risk math, এবং prediction markets-এ কখন MM কাজ করে।
এই অধ্যায়ে কী আছে
পলিমার্কেট-এ market making মানে হলো market book-এর দুই পাশই continuously quote করা এবং প্রতিটি round trip-এ spread earning করা। Traditional finance-এ এই strategy well-understood; পলিমার্কেট-এর জন্য আলাদা জিনিস হলো maker-rebate program এবং prediction markets-এর adverse-selection profile, যা CFD venues-এর তুলনায় বেশি। এই অধ্যায়টি হলো honest math।
- সহজ বাংলায় মার্কেট মেকিং
- স্প্রেড + রিবেট প্রান্ত
- ইনভেন্টরি ঝুঁকি ও স্কিউ
- পলিমার্কেট-এ কখন MM কাজ করে (এবং কখন না)
- Code skeleton: উভয় পাশকে +/- N cents-এ quote করা
- নিউজ ফ্লো অনুযায়ী কোট সমন্বয় করা
- অ্যাডভার্স সিলেকশন বেড়ে গেলে বট বন্ধ করা
সহজ ভাষায় মার্কেট মেকিং
একজন market maker continuously একটি buy price (bid) এবং একটি sell price (ask) quote করে, যা mid-এর চেয়ে fixed spread-এ wider থাকে। কেউ যখন bid hit করে, maker সস্তায় buy করে; কেউ যখন ask lift করে, maker বেশি দামে sell করে; bid এবং ask-এর পার্থক্যটাই হলো প্রতি round trip-এ maker-এর revenue।
এই strategy order-flow-driven, directional নয়। Maker-এর কোনো opinion থাকে না যে YES জিতবে কি না; তারা এই position নেয় যে flow চলতেই থাকবে এবং spread paid হতে থাকবে।
রিস্ক হলো adverse selection: যারা আপনার bid hit করছে, তাদের কাছে এমন information থাকতে পারে যা আপনার নেই। সময়ের সঙ্গে MM profit নির্ভর করে spread কি যথেষ্ট wide যাতে informed traders-এর slippage cover করা যায় কি না।
স্প্রেড + রিবেট প্রান্ত
একজন পলিমার্কেট maker-এর জন্য দুটি revenue stream।
Spread capture: ধরুন mid 0.46-এর আশেপাশে bid 0.45 এবং ask 0.47 quote করা হলো। Bid-এ যেকোনো fill, যা আপনি পরে ask-এ exit করতে পারেন, 2 cents earn করে। Net edge fill imbalance এবং price drift-এর ওপর depend করে।
Maker rebate: পলিমার্কেট-এর liquidity-rewards program eligible markets-এ maker fills-এর ওপর per-share rebate দেয়। সংখ্যা বদলাতে পারে; বর্তমান values-এর জন্য official rewards page দেখুন। Rebate trade নিজে থেকে আলাদা, periodicভাবে pUSD-এ paid হয়।
বেশিরভাগ market-এ spread capture-ই বড় revenue stream। Rebate তখন meaningful যখন আপনি wide markets quote করতে পারেন (election year, major sports playoffs), যেখানে liquidity attract করতে পলিমার্কেট rebate বাড়ায়।
ইনভেন্টরি ঝুঁকি ও স্কিউ
একজন MM যে বারবার bid-এ hit হচ্ছে, সে long position accumulate করে। রিস্ক হলো mid নিচে নেমে যাওয়া যখন inventory long; maker spread revenue পেলেও position-এ loss realize করে।
প্রতিরক্ষা: quote skew (inventory long হলে bid lower করা, short হলে ask higher করা, যাতে one-sided fills discourage হয়); inventory cap (যে side-এ আপনি already too long, সেখানে quoting বন্ধ রাখা); active rebalancing (inventory limit-এ থাকলে position কমাতে কখনও spread cross করা)।
Math: যদি bid-এ 60% fills price 2 cents adverse move হওয়ার আগে exit না করে, তাহলে শুধু ওই fills-এই strategy loss-making। fill imbalance > 65/35 হলে aggressively skew করুন।
পলিমার্কেট-এ কখন MM কাজ করে (এবং কখন না)
যখন তিনটি শর্ত পূরণ হয়, পলিমার্কেট-এ MM works করে।
- Liquid book: যথেষ্ট quote competition আছে যাতে আপনার spread competitive থাকে কিন্তু zero না হয়। 2024 election markets, major NFL/NBA games, BTC up/down 5m-সবই qualify করে।
- Two-sided flow: buyer এবং seller-দু’পক্ষই active। One-sided markets (0.95+ এ resolve-ish) market maker-এর জন্য capture করার মতো কিছুই দেয় না।
- Bounded price moves: spread captures 5-cent jumps-এ eaten up হয় না। Stable mid-range markets (0.40-0.60) সবচেয়ে friendly।
MM fail করে news-driven markets-এ, যেখানে mid আপনি re-quote করার আগেই jump করে; illiquid books-এ, যেখানে আপনি একাই quote দেন এবং next trade 5 levels walk করে; resolution-imminent markets-এ, যেখানে এক side 0 বা 1-এর দিকে converge করছে।
Code skeleton: উভয় পাশকে +/- N cents-এ quote করা
সবচেয়ে সহজ viable maker-এর pseudocode।
SPREAD_CENTS = 2
INVENTORY_CAP_SHARES = 50
def make_loop(token_id):
while True:
book = fetch_book(token_id)
mid = (book.best_bid + book.best_ask) / 2
inv = chain_balance(token_id)
# Skew: pull the side we are too long on
bid_px = mid - SPREAD_CENTS/200 - (0.005 if inv > INVENTORY_CAP_SHARES * 0.6 else 0)
ask_px = mid + SPREAD_CENTS/200 + (0.005 if inv < -INVENTORY_CAP_SHARES * 0.6 else 0)
cancel_my_existing_quotes(token_id)
if inv < INVENTORY_CAP_SHARES:
place_gtc(token_id, side="BUY", price=bid_px, size=5)
if inv > -INVENTORY_CAP_SHARES:
place_gtc(token_id, side="SELL", price=ask_px, size=min(5, inv))
time.sleep(2)
Production makers আরও যোগ করে: per-side inventory tracking, cancel-before-place ordering, re-quote interval-এ jitter, adverse selection-এর ওপর kill-switch (next section)।
নিউজ ফ্লো অনুযায়ী কোট সমন্বয় করা
যখন কোনো news event hit করে, fair value আপনার quotes-এর আগে move করে। যে MM news flow-এর সময় quotes pull করে না, সে picked off হয়।
Signal: 30 সেকেন্ডের মধ্যে incoming fills-এর cancel rate baseline-এর প্রায় 3x-এর ওপরে jump করা, অথবা আরও বিস্তৃত event-stream cross-check (পলিমার্কেট Twitter/Discord, Bloomberg headline feed)। ধরা পড়লে maker 60-120 সেকেন্ডের জন্য সব quotes pull করে, নতুন mid stabilize হতে দেয়, তারপর নতুন center-এর চারপাশে re-quote করে।
সবচেয়ে সহজ implementation token-এর last-trade-price stream watch করে। rolling-window mean থেকে 2 standard deviations-এর বেশি jump হলে pause trigger হয়। Price 30+ সেকেন্ড stable থাকলে bot আবার engage করে।
অ্যাডভার্স সিলেকশন বেড়ে গেলে বট বন্ধ করা
Hard exit। যদি bot-এর শেষ 50 fills-এর fill PnL sharply negative হয়ে যায়, তাহলে কিছু না কিছু ভুল আছে: হয় market এখন news-driven এবং আপনাকে make করা উচিত নয়, অথবা current adverse-selection level-এর জন্য আপনার spread খুব tight।
Encode করার জন্য kill conditions:
- টানা 5টি bid fill, কোনো ask fill নেই, এবং first fill-এর পর থেকে mid > 1c down।
- শেষ 25টি round-trip fills-এর realized PnL expected-এর -25%-এর নিচে।
- WebSocket disconnect বা stale book detected।
- কোনো এক side-এ inventory cap-এ 5 মিনিটের বেশি।
Trigger হলে সব cancel করুন, market-এ inventory flatten করুন, 15+ মিনিট halt করুন। যেসব market maker-এর kill switch নেই, তারা volatile period-এ manual notice হওয়া পর্যন্ত টাকা হারাবে - আর সেটা সবসময়ই আপনি যতটা ভাবেন তার চেয়ে বেশি সময় নেয়।


