Polymarket Bot Tutorial · Kabanata 22 ng 32
NegRisk multi-outcome bots sa Polymarket: sum-to-1 mechanics, leg arbitrage kapag ang YES legs ay hindi nagsa-sum sa 1, hedging sa kabuuan ng legs, at execution pitfalls na specific sa multi-outcome markets.
Ano ang sinasaklaw ng kabanatang ito
Ang multi-outcome NegRisk markets ay mutually exclusive - eksaktong isa ang nag-re-resolve YES. Ang kabanatang ito ay ang strategy layer sa ibabaw ng execution mechanics ng kabanata 11: paano mag-hedge sa kabuuan ng legs, kailan totoo ang sum-to-1 arb, at ang mga bugs na natatamaan ng karamihan sa NegRisk bots sa unang deploy.
- NegRisk vs binary recap
- Sum-to-1 invariant at arbitrage
- Leg-by-leg hedge construction
- Execution: neg_risk flag sa orders
- Common bugs sa NegRisk bots
- Code: snapshot lahat ng legs at i-detect ang under-1.00 sum
NegRisk vs binary recap
Binary: isang yes/no market, dalawang tokens, sum sa 1.0. NegRisk: N mutually exclusive outcomes, N tokens, lahat ng YES legs ay nagsa-sum sa ~1.0 sa kabuuan ng event.
Execution-wise, ang NegRisk ay nangangailangan ng negRisk: true sa bawat order (kabanata 11) at nag-ro-route sa pamamagitan ng hiwalay na exchange contract. Strategy-wise, ang NegRisk ay nag-aalok ng dalawang natatanging oportunidad na hindi ginagawa ng binaries: cross-leg arb kapag ang sum ay nag-drift palayo sa 1.0, at hedge construction sa pamamagitan ng pagbili ng maraming YES legs.
Mga gastos na natatangi sa NegRisk: mas maraming legs = mas maraming spread tax (bawat leg na i-trade mo ay nagkakahalaga ng ~0.5-1c spread), mas malalapad na sum-to-1 deviations sa illiquid events (ang arb ay mas madalas available ngunit mas maliit).
Sum-to-1 invariant at arbitrage
Ang arb premise: kung ang pagbili ng lahat ng N YES legs ay nagkakahalaga ng wala pang $1.00, na-lock ka sa guaranteed profit sa resolution (isang leg ay dapat magbayad ng $1.00; ang iba ay napupunta sa $0).
Sa praktika, ang arb gap ay karaniwang 0-3c, kinakain ng spread + fees sa bawat leg, at nawawala sa loob ng ilang minuto ng pagbubukas. Ang kapasidad ay limitado ng liquidity ng pinakamanipis na leg.
Ang arb ay napapailalim din sa specific resolution failure modes: ang "none of the above" outcome na malinaw na nag-re-resolve YES kapag walang named candidate ang qualified. Kung ang event ay may ganoong leg at hindi mo binili, ang iyong "complete hedge" ay nawawala ang aktwal na payout.
Leg-by-leg hedge construction
Sa paghawak ng position sa isang NegRisk leg, maaari kang mag-hedge sa pamamagitan ng pagbili ng YES sa competing legs sa proportion. Kung mayroon kang Trump-YES sa 0.50 at gusto mong mag-hedge laban sa Trump loss, bumibili ka ng portfolio ng ibang named legs.
Ang hedge weight bawat leg ≈ kasalukuyang implied probability ng leg na conditional sa pagkatalo ni Trump. Approximation: weight_i = price_i / (1 - trump_price).
Ang hedge ay imperfect dahil ang mga presyo na ginamit ay point-in-time at ang conditional probabilities ay lumilipat habang dumadating ang news. I-rebalance ang hedge lingguhan o sa major news. Huwag i-over-engineer ito; ang layunin ng hedge ay pagbabawas ng variance, hindi pag-aalis nito.
Execution: neg_risk flag sa orders
Ang pinakakaraniwang NegRisk-specific bug: pagkalimot ng negRisk: true sa order placement payload. Ang order ay tinatanggap ng API ngunit nag-se-settle nang mali dahil nag-ro-route ito sa standard CTF exchange sa halip na 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 mula sa Gamma API. Basahin ito; ipasa ito. Huwag kailanman hardcode ang flag batay sa paghula.
Common bugs sa NegRisk bots
Mula sa production debug logs sa kabuuan ng maraming bots.
- Nawawalang negRisk flag: orders tinanggap, settlement nabigo. Lunas: ipatupad ang flag sa bawat wrapper.
- Hedging nang walang "Other" leg: sa events na may "None of the above" outcome, ang hedge portfolio na hindi kasama ito ay incomplete. Lunas: palaging suriin ang Other leg kapag bumubuo ng hedges.
- Sum-to-1 arb under-sizing: nakikilala ng arber ang 1c edge ngunit nag-tra-trade ng 5 shares bawat leg; total profit ay 5 cents bago spread, negative net. Lunas: sukatin ang arb upang makuha ang makabuluhang absolute dollars, hindi habulin ang headline percentages.
- Stale leg pricing: ang bot ay kumukuha ng 3 leg prices, kumukuha ng 200ms total, ang presyo ng huling leg ay nagbago sa panahon ng fetch. Lunas: kumuha ng lahat ng legs nang parallel + tratuhin ang snapshot bilang isang observation.
Code: snapshot lahat ng legs at i-detect ang under-1.00 sum
Reference: snapshot ang lahat ng YES legs ng NegRisk event nang parallel, i-detect ang 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
Ang atomic execution ng lahat ng legs ang mas mahirap na problema at nangangailangan ng per-leg FOK + rollback sa partial fill (katulad na pattern sa stat-arb code ng kabanata 16).





