Polymarket Bot Tutorial · Sura ya 22 kati ya 32
NegRisk multi-outcome bots kwenye Polymarket: sum-to-1 mechanics, leg arbitrage wakati YES legs hazijumlika kwa 1, kuhedge katika legs, na execution pitfalls maalum kwa multi-outcome markets.
Sura hii inafunika nini
Multi-outcome NegRisk markets ni mutually exclusive - exactly moja inaresolve YES. Sura hii ni strategy layer juu ya execution mechanics ya sura ya 11: jinsi ya kuhedge katika legs, wakati sum-to-1 arb ni real, na bugs nyingi NegRisk bots zinahit kwenye first deploy.
- NegRisk vs binary recap
- Sum-to-1 invariant na arbitrage
- Leg-by-leg hedge construction
- Execution: neg_risk flag katika orders
- Common bugs katika NegRisk bots
- Code: snapshot legs zote na detect under-1.00 sum
NegRisk vs binary recap
Binary: yes/no market moja, tokens mbili, sum kwa 1.0. NegRisk: N mutually exclusive outcomes, N tokens, YES legs zote zinajumlika hadi ~1.0 katika event.
Execution-wise, NegRisk inahitaji negRisk: true kwenye kila order (sura ya 11) na inaroute kupitia separate exchange contract. Strategy-wise, NegRisk inatoa opportunities mbili unique ambazo binaries hazitoi: cross-leg arb wakati sum inadrift away kutoka 1.0, na hedge construction kwa kununua YES legs nyingi.
Costs unique kwa NegRisk: legs zaidi = spread tax zaidi (kila leg unayotrade inacost ~0.5-1c spread), wider sum-to-1 deviations kwenye illiquid events (arb iko available mara nyingi zaidi lakini ndogo).
Sum-to-1 invariant na arbitrage
Arb premise: ikiwa kununua YES legs zote N kunacost chini ya $1.00, umeilock guaranteed profit kwenye resolution (leg moja lazima ilipe $1.00; nyingine zinaenda kwa $0).
Kivitendo, arb gap kawaida ni 0-3c, inaliwa na spread + fees kwenye kila leg, na inadisappear ndani ya dakika za opening. Capacity inalimited na thinnest leg liquidity.
Arb pia iko subject kwa specific resolution failure modes: "none of the above" outcome inayoresolve YES explicitly wakati hakuna named candidate inaqualify. Ikiwa event ina leg kama hiyo na hukununua, "complete hedge" yako inakosa actual payout.
Leg-by-leg hedge construction
Kushikilia position kwenye NegRisk leg moja, unaweza kuhedge kwa kununua YES kwenye competing legs proportionally. Ikiwa unashikilia Trump-YES kwa 0.50 na unataka kuhedge dhidi ya Trump loss, unanunua portfolio ya named legs nyingine.
Hedge weight per leg ≈ implied probability ya sasa ya leg conditional kwa Trump kupoteza. Approximation: weight_i = price_i / (1 - trump_price).
Hedge ni imperfect kwa sababu prices zinazotumiwa ni point-in-time na conditional probabilities zinashift kadiri news inavyofika. Rebalance hedge weekly au kwenye major news. Usimuengineer; kusudi la hedge ni kupunguza variance, sio kuieliminate.
Execution: neg_risk flag katika orders
NegRisk-specific bug ya kawaida zaidi: kusahau negRisk: true katika order placement payload. Order inakubaliwa na API lakini inasettle incorrectly kwa sababu inaroute kwa standard CTF exchange badala ya NegRisk exchange.
// CORRECT for NegRisk markets:
await client.createAndPostOrder(
{ tokenID, price, size, side: Side.BUY },
{ tickSize: '0.01', negRisk: true }, // <-- REQUIRED
OrderType.FOK
);
Source of truth: market.negRisk kutoka Gamma API. Soma; pasi. Kamwe usihardcode flag based on guessing.
Common bugs katika NegRisk bots
Kutoka production debug logs katika bots wengi.
- Missing negRisk flag: orders zinakubaliwa, settlement inashindwa. Cure: enforce flag katika kila wrapper.
- Kuhedge bila "Other" leg: katika events na "None of the above" outcome, hedge portfolio inayoiexclude ni incomplete. Cure: daima check kwa Other leg unapojenga hedges.
- Sum-to-1 arb under-sizing: arber inarealize 1c edge lakini inatrade shares 5 per leg; total profit ni 5 cents kabla ya spread, negative net. Cure: size arb kuextract meaningful absolute dollars, sio kuchase headline percentages.
- Stale leg pricing: bot inafetch leg prices 3, inachukua 200ms jumla, price ya last leg ilibadilika wakati wa fetch. Cure: fetch legs zote katika parallel + treat snapshot kama observation moja.
Code: snapshot legs zote na detect under-1.00 sum
Reference: snapshot YES legs zote za NegRisk event katika parallel, detect arb.
import asyncio, aiohttp
async def fetch_leg_ask(session, token_id):
async with session.get(f"https://clob.polymarket.com/book?token_id={token_id}") as r:
d = await r.json()
asks = d.get("asks", [])
return float(asks[0]["price"]) if asks else None
async def check_arb(event_slug):
event = await fetch_event(event_slug)
if not event["markets"][0]["negRisk"]: return None
legs = []
for m in event["markets"]:
toks = json.loads(m["clobTokenIds"])
yes_token = toks[0]
legs.append(yes_token)
async with aiohttp.ClientSession() as s:
asks = await asyncio.gather(*[fetch_leg_ask(s, t) for t in legs])
if any(a is None for a in asks): return None
total = sum(asks)
if total < 0.97:
return {"edge": 1 - total, "legs": list(zip(legs, asks))}
return None
Atomic execution ya legs zote ni harder problem na inahitaji per-leg FOK + rollback kwenye partial fill (similar pattern kwa stat-arb code ya sura ya 16).





