آموزش 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 بهصورت دستی متوجه شود، پول از دست میدهد - و این همیشه بیشتر از چیزی طول میکشد که فکر میکنید.





