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.

  1. Nawawalang negRisk flag: orders tinanggap, settlement nabigo. Lunas: ipatupad ang flag sa bawat wrapper.
  2. 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.
  3. 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.
  4. 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).

Mga madalas na tanong

Ano ang sum-to-1 invariant sa NegRisk markets?
Sa kabuuan ng lahat ng YES legs ng NegRisk multi-outcome market, ang sum ng YES prices ay nananatiling malapit sa 1 USD dahil eksaktong isang outcome ang nananalo. Kung ang sum ay bumaba sa ibaba ng 1.00 net ng fees, ang pagbili ng bawat leg sa proporsyon ay nag-lock ng arbitrage profit. Ang arb ay bihira at nakukuha nang mabilis - tratuhin bilang curiosity, hindi pangunahing strategy.
Paano naiiba ang NegRisk pricing sa binary?
Binary: ang YES price ay ang iyong direct probability estimate. NegRisk: ang YES price para sa isang leg ay ang probability ng partikular na outcome na nananalo sa kabuuan ng N alternatives. Habang lumalaki ang N, ang individual prices ay lumiliit (ang probabilities ay nagsa-sum sa 1). Ang pag-trade ng NegRisk ay nangangailangan ng pag-iisip sa relative probabilities, hindi absolute Yes/No.
Ano ang pinakakaraniwang NegRisk bot bug?
Pagkalimot sa neg_risk: true flag sa order placement. Ang order ay alinman tumatanggi o nag-ro-route sa maling CTF position. Tumama kami dito sa production - commit 06deaef sa aming trader history ay partikular na fix. Palaging i-set ang neg_risk=true (Python) o negRisk: true (Node) sa NegRisk orders.
Maaari ba akong kumita sa NegRisk sa pamamagitan ng paghedge ng legs?
Sa teorya oo (i-lock ang spread sa pagitan ng dalawang legs). Sa praktika ang fees ay kumakain sa hedge edge para sa karamihan ng retail bots. Ang hedging ay gumagana para sa pagpapanatili ng inventory neutral habang nag-market making, hindi bilang standalone strategy.
Paano ako maghahanap ng NegRisk markets?
I-filter ang gamma /events para sa events na may markets count > 2 at ang negRisk flag set. Common categories: championship winners (NBA Finals MVP), election fields (next Speaker), tournament brackets. Bawat gamma event ay kasama ang child markets array nito.
Mas liquid ba o mas hindi liquid ang NegRisk markets kaysa sa binary?
Mas mababa bawat leg, mas marami sa aggregate. Ang 30-team NBA Champion event ay maaaring may 50K total 24h volume ngunit ang bawat team market ay 1.6K lamang - na nagpapahirap sa per-leg trading. Ang aggregate liquidity ay totoo, fragmented lang.