آموزش Polymarket Bot · فصل 13 از 32

Market making در Polymarket: چطور bid و ask را quote کنید، spread را capture کنید، maker rebates (20-25% از taker fees) به دست بیاورید، mathِ inventory risk را بفهمید، و اینکه MM چه زمانی روی prediction markets جواب می‌دهد.

این فصل چه چیزهایی را پوشش می‌دهد

Market making در Polymarket یعنی اینکه هر دو سمت market book را به‌طور مداوم quote کنید و از هر round trip، spread را به دست بیاورید. این استراتژی در traditional finance کاملاً شناخته‌شده است؛ تفاوت‌های مخصوص Polymarket شامل maker-rebate program و adverse-selection profile در prediction markets است که از CFD venues بالاتر است. این فصل، math واقعی و بی‌تعارف ماجراست.

  • Market making به زبان ساده
  • Spread + rebate edge
  • Inventory risk و skew
  • MM چه زمانی روی Polymarket جواب می‌دهد (و چه زمانی نه)
  • Code skeleton: هر دو سمت را با +/- N cents quote کنید
  • Adjusting quotes بر اساس news flow
  • Killing the bot وقتی adverse selection spike می‌کند

Market making به زبان ساده

یک market maker به‌طور پیوسته هر دو قیمت خرید (bid) و فروش (ask) را quote می‌کند، به‌گونه‌ای که این قیمت‌ها نسبت به mid با یک spread ثابت فاصله داشته باشند. وقتی کسی bid را hit می‌کند، maker ارزان می‌خرد؛ وقتی کسی ask را lift می‌کند، maker گران می‌فروشد؛ و اختلاف bid و ask، درآمد maker در هر round trip است.

این استراتژی بر پایه order flow است، نه جهت‌گیری قیمتی. maker هیچ نظری درباره اینکه YES برنده می‌شود یا نه نمی‌دهد؛ فرضش این است که flow ادامه پیدا می‌کند و spread همچنان پرداخت می‌شود.

ریسک اصلی adverse selection است: کسانی که bid شما را hit می‌کنند ممکن است اطلاعاتی داشته باشند که شما ندارید. در طول زمان، سود MM بستگی دارد به اینکه spread آن‌قدر wide باشد که slippage ناشی از traderهای informed را جبران کند.

Spread + rebate edge

دو جریان درآمدی برای یک Polymarket maker.

Spread capture: bid را روی 0.45 و ask را روی 0.47 اطراف mid برابر 0.46 quote کنید. هر fill روی bid که بعداً بتوانید روی ask از آن خارج شوید، 2 cents سود دارد. edge خالص به عدم‌تعادل fillها و حرکت قیمت بستگی دارد.

Maker rebate: برنامه liquidity-rewards Polymarket یک rebate به‌ازای هر سهم روی maker fillها در بازارهای واجد شرایط پرداخت می‌کند. اعداد تغییر می‌کنند؛ برای مقدار فعلی، صفحه رسمی rewards را بررسی کنید. این rebate به‌صورت دوره‌ای در pUSD پرداخت می‌شود و جدا از خود trade است.

برای بیشتر marketها، spread capture جریان درآمدی بزرگ‌تر است. rebate زمانی معنی‌دار می‌شود که بتوانید marketهای wide quote کنید (سال انتخابات، playoffهای بزرگ ورزشی)؛ جایی که Polymarket برای جذب liquidity، rebate را افزایش می‌دهد.

Inventory risk و skew

یک MM که repeatedly روی bid hit می‌شود، long position جمع می‌کند. ریسک این است که mid در حالی پایین بیاید که inventory شما long است؛ در این صورت maker حتی بعد از درآمد spread هم روی position ضرر می‌کند.

راه‌های دفاع: quote skew (وقتی inventory long است bid را پایین‌تر ببرید و وقتی short هستید ask را بالاتر ببرید تا fill یک‌طرفه کمتر شود)؛ inventory cap (روی سمتی که از قبل بیش از حد long هستید، quoting را متوقف کنید)؛ active rebalancing (گاهی spread را cross کنید تا وقتی inventory به limit رسیده، position را کاهش دهید).

math این است: اگر 60% از fillهای bid قبل از اینکه قیمت 2 cents علیه شما حرکت کند، اصلاً exit نشوند، همان fillها به‌تنهایی strategy را زیان‌ده می‌کنند. وقتی عدم‌تعادل fillها بیشتر از 65/35 شد، aggressive skew کنید.

MM چه زمانی روی Polymarket جواب می‌دهد (و چه زمانی نه)

MM زمانی روی Polymarket جواب می‌دهد که سه شرط برقرار باشد.

  • Liquid book: آن‌قدر quote competition وجود داشته باشد که spread شما competitive باشد اما صفر نباشد. marketهای انتخابات 2024، بازی‌های بزرگ NFL/NBA، و BTC up/down 5m همگی مناسب‌اند.
  • Two-sided flow: هم buyer و هم seller فعال باشند. marketهای یک‌طرفه (تقریباً resolved در 0.95+) چیزی برای capture کردن به maker نمی‌دهند.
  • Bounded price moves: spread captures با جهش‌های 5-cent خورده نشوند. marketهای باثبات با mid در بازه 0.40-0.60 بهترین گزینه‌اند.

MM در این حالت‌ها شکست می‌خورد: marketهای خبرمحور که mid سریع‌تر از توان re-quote شما حرکت می‌کند؛ bookهای illiquid که شما تنها quote موجود هستید و trade بعدی 5 level جلو می‌رود؛ marketهایی که زمان resolution آن‌ها نزدیک است و یک سمت در حال همگرا شدن به 0 یا 1 است.

Code skeleton: هر دو سمت را با +/- N cents quote کنید

Pseudocode برای ساده‌ترین maker قابل‌اجرا.

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، makerها این موارد را هم اضافه می‌کنند: tracking جداگانه برای هر side، ترتیب cancel-before-place، jitter در re-quote interval برای اینکه قابل‌پیش‌بینی نباشند، و kill-switch برای adverse selection (بخش بعد).

Adjusting quotes بر اساس news flow

وقتی یک رویداد خبری رخ می‌دهد، fair value قبل از quoteهای شما جابه‌جا می‌شود. یک MM که در زمان news flow quoteها را جمع نکند، picked off می‌شود.

نشانه‌ها: نرخ cancel برای incoming fillها که ظرف 30 ثانیه بیش از حدود 3 برابر baseline می‌شود، یا cross-check گسترده‌تر با event-stream (Polymarket Twitter/Discord، Bloomberg headline feed). وقتی این وضعیت تشخیص داده شد، maker همه quoteها را برای 60-120 ثانیه برمی‌دارد، اجازه می‌دهد mid جدید تثبیت شود، سپس دوباره اطراف مرکز جدید quote می‌کند.

ساده‌ترین implementation جریان last-trade-price token را زیر نظر می‌گیرد. جهشی بیش از 2 standard deviation از میانگین rolling-window یک pause فعال می‌کند. bot وقتی دوباره وارد می‌شود که قیمت برای 30 ثانیه یا بیشتر پایدار مانده باشد.

Killing the bot وقتی adverse selection spike می‌کند

خروج سخت. اگر fill PnL بات در 50 fill اخیر به‌طور شدید منفی شود، یک چیزی اشتباه است: یا market الآن خبرمحور شده و نباید maker باشید، یا spread شما برای سطح فعلی adverse selection خیلی تنگ است.

شرایط kill که باید پیاده‌سازی شوند:

  • 5 bid fill پیاپی بدون هیچ ask fill، و mid از اولین fill تاکنون بیش از 1c پایین آمده باشد.
  • Realized PnL روی 25 round-trip fill اخیر کمتر از -25% مقدار expected باشد.
  • WebSocket disconnect یا stale book تشخیص داده شود.
  • Inventory در هر سمت بیش از 5 دقیقه روی cap باقی بماند.

وقتی فعال شد، همه‌چیز را cancel کنید، inventory را با market flatten کنید، و برای 15+ دقیقه متوقف شوید. market maker‌ای که kill switch ندارد، در دوره‌های volatile تا وقتی trader به‌صورت دستی متوجه شود، پول از دست می‌دهد - و این همیشه بیشتر از چیزی طول می‌کشد که فکر می‌کنید.

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

آیا یک bot خُرد واقعاً می‌تواند با market making در Polymarket پول دربیاورد؟
گاهی اوقات، در بعضی marketهای منتخب. maker rebate (20-25% از taker fees) به‌علاوه spread یک تا سه سنتی در هر round trip می‌تواند به بازده واقعی تبدیل شود. اما در Polymarket، news flow می‌تواند در چند ثانیه یک market را 20+ cents جابه‌جا کند - یک market maker بدون news feed سریع، adverse selection می‌خورد. بهترین جا برای این کار، marketهای liquid ورزشی قبل از بازی و در دوره‌های کم‌خبر است.
روی Polymarket چقدر wide باید quote کنم؟
حداقل آن‌قدر wide که بدترین adverse selection مورد انتظار را پوشش دهد. برای sports/politics liquid: 1 تا 3 cents در هر side نسبت به mid. برای marketهای thin: 5+ cents. اگر نتوانید آن‌قدر tight quote کنید که با دیگر makerها رقابت کنید، ولی آن‌قدر wide هم نباشید که حرکت قیمت شما را نابود نکند، آن market برای market making مناسب نیست.
چه inventory limitهایی باید بگذارم؟
تا وقتی که طی چند ماه profitability خود را ثابت نکرده‌اید، inventory هر market را به 50 تا 200 دلار محدود کنید. quoteها را skew کنید تا inventory به سمت neutral برود - اگر Yes جمع کرده‌اید، Yes bid خود را پایین بیاورید و No ask را پایین بیاورید تا خرید No تشویق شود. هرگز نگذارید یک market بیش از 20% bankroll شما را درگیر کند.
آیا برای market making روی Polymarket به یک VPS سریع نیاز دارم؟
بله. Market making حساس‌ترین strategy از نظر latency در Polymarket است. یک VPS پرنوسان باعث می‌شود quoteهای stale ارائه دهید و picked off شوید. ما برای MM botهای خود از TradingVPS استفاده می‌کنیم، دقیقاً چون jitter آن به‌طور مداوم پایین است. cloudهای معمولی مثل DO/Vultr برای paper trading MM مناسب‌اند، اما برای live نه.
Polymarket MM چه تفاوتی با crypto MM دارد؟
دو تفاوت بزرگ: (1) Polymarket رویدادهای outcome قطعی دارد (news، فینال‌های ورزشی) که می‌توانند قیمت را در لحظه 30 تا 100 cents تکان دهند - خیلی شدیدتر از crypto. (2) marketهای Polymarket در نهایت resolve می‌شوند، بنابراین برخلاف crypto pairs، positionهای MM expiration قطعی دارند. هر دو باعث می‌شوند نگهداری position کوتاه‌تر و limitهای risk سخت‌گیرانه‌تر باشند.
آیا می‌توانم marketهای 5-minute crypto را روی Polymarket market-make کنم؟
ممکن است، اما بسیار سخت است. marketهای 5-minute حدود 288 expiration در روز برای هر pair دارند، تحت سلطه botهای سریع‌تر هستند، و spreadهای تنگ‌تری دارند. بیشتر botهای MM خُرد در آن‌جا به خاطر adverse selection پول از دست می‌دهند. strategy مربوط به crypto 5-minute را به‌درستی در فصل 23 این مجموعه پوشش می‌دهیم.