Polymarket Bot Tutorial · Rozdział 22 z 32

Boty NegRisk multi-outcome na Polymarket: mechanika sumy do 1, leg arbitrage, gdy YES legs nie sumują się do 1, hedging między legami oraz pułapki wykonawcze specyficzne dla rynków multi-outcome.

Co obejmuje ten rozdział

Rynki NegRisk multi-outcome są wzajemnie wykluczające się — dokładnie jeden wynik rozlicza się jako YES. Ten rozdział to warstwa strategii nad mechaniką wykonania z rozdziału 11: jak hedgować między legami, kiedy arb sum-to-1 jest realny i jakie bugi najczęściej łapią boty NegRisk przy pierwszym wdrożeniu.

To jest rozdział 22 z naszej 32-częściowej serii o budowie Polymarket trading bota. Omawiamy temat dogłębnie w sekcjach poniżej. Treść dla każdej sekcji jest pisana i publikowana rozdział po rozdziale; odpowiedzi w FAQ i reference są już kompletne i odzwierciedlają doświadczenie produkcyjne z uruchamiania naszego własnego tradera.

  • NegRisk vs binary recap
  • Inwariant sum-to-1 i arbitrage
  • Budowa hedga leg po legu
  • Execution: flaga neg_risk w orders
  • Najczęstsze bugi w botach NegRisk
  • Code: snapshot wszystkich legów i wykrywanie sumy poniżej 1.00

NegRisk vs binary recap

Binary: jeden market yes/no, dwa tokeny, suma do 1.0. NegRisk: N wzajemnie wykluczających się wyników, N tokenów, wszystkie YES legs sumują się do około 1.0 w ramach wydarzenia.

Od strony execution, NegRisk wymaga negRisk: true w każdym orderze (rozdział 11) i przechodzi przez osobny exchange contract. Od strony strategii, NegRisk daje dwie unikalne możliwości, których binary nie ma: cross-leg arb, gdy suma odjeżdża od 1.0, oraz budowę hedga przez kupowanie wielu YES legs.

Koszty specyficzne dla NegRisk: więcej legów = większy spread tax (każdy traded leg kosztuje około 0.5-1c spreadu), szersze odchylenia sum-to-1 na mało płynnych wydarzeniach (arb jest wtedy częściej dostępny, ale mniejszy).

Inwariant sum-to-1 i arbitrage

Założenie arbitrażu: jeśli kupno wszystkich N YES legs kosztuje mniej niż $1.00, masz zablokowany gwarantowany profit przy rozliczeniu (jeden leg musi wypłacić $1.00; pozostałe spadają do $0).

W praktyce luka arbitrażowa to zwykle 0-3c, zjadana przez spread + fees na każdym legu, i znika w ciągu minut od otwarcia. Pojemność ogranicza leg o najcieńszej płynności.

Arb podlega też specyficznym failure mode'om rozliczenia: wynik typu "none of the above", który wyraźnie rozlicza się jako YES, gdy żaden nazwany kandydat nie kwalifikuje się. Jeśli event ma taki leg i go nie kupiłeś, twój "pełny hedge" nie obejmuje rzeczywistej wypłaty.

Budowa hedga leg po legu

Trzymając pozycję na jednym legu NegRisk, możesz hedgować, kupując YES na konkurencyjnych legach w odpowiednich proporcjach. Jeśli masz Trump-YES po 0.50 i chcesz zabezpieczyć się przed porażką Trumpa, kupujesz portfel pozostałych nazwanych legów.

Waga hedga na leg ≈ bieżące implied probability tego legu pod warunkiem, że Trump przegrywa. Aproksymacja: weight_i = price_i / (1 - trump_price).

Hedge jest niedoskonały, bo użyte ceny są punktowe, a conditional probabilities zmieniają się wraz z napływem newsów. Rebalance hedga rób co tydzień albo po dużych newsach. Nie over-engineeruj tego; celem hedga jest redukcja variance, a nie jego eliminacja.

Execution: flaga neg_risk w orders

Najczęstszy bug specyficzny dla NegRisk: zapomnienie o negRisk: true w payloadzie do złożenia ordera. Order jest akceptowany przez API, ale rozlicza się nieprawidłowo, bo trafia do standardowego CTF exchange zamiast do 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 z Gamma API. Odczytaj to i przekaż dalej. Nigdy nie hardcoduj flagi na podstawie zgadywania.

Najczęstsze bugi w botach NegRisk

Z produkcyjnych logów debugowania z wielu botów.

  1. Brak flagi negRisk: ordery są akceptowane, settlement failuje. Naprawa: wymuś flagę w każdym wrapperze.
  2. Hedging bez legu "Other": w eventach z wynikiem "None of the above" portfel hedge, który go pomija, jest niekompletny. Naprawa: zawsze sprawdzaj leg Other przy budowie hedga.
  3. Under-sizing arb sum-to-1: arber zauważa edge 1c, ale handluje 5 shares na leg; całkowity profit to 5 centów przed spreadem, netto ujemnie. Naprawa: skaluj arb tak, by wyciągać sensowne kwoty absolutne, a nie gonić procenty z nagłówka.
  4. Stale leg pricing: bot pobiera ceny 3 legów, zajmuje to łącznie 200ms, a cena ostatniego legu zmieniła się podczas fetchowania. Naprawa: pobieraj wszystkie legi równolegle + traktuj snapshot jako jedną obserwację.

Code: snapshot wszystkich legów i wykrywanie sumy poniżej 1.00

Reference: snapshot wszystkich YES legs wydarzenia NegRisk równolegle, wykrycie arbitrażu.

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 wszystkich legów to trudniejszy problem i wymaga per-leg FOK + rollback przy partial fill (podobny pattern jak w code stat-arb z rozdziału 16).

Najczęściej zadawane pytania

Czym jest inwariant sum-to-1 na rynkach NegRisk?
We wszystkich YES legs rynku NegRisk multi-outcome suma cen YES pozostaje blisko 1 USD, ponieważ dokładnie jeden wynik wygrywa. Jeśli suma spadnie poniżej 1.00 netto po fees, kupno każdego legu w odpowiedniej proporcji blokuje profit arbitrażowy. Arb jest rzadki i szybko znika — traktuj go jako ciekawostkę, nie główną strategię.
Czym pricing NegRisk różni się od binary?
Binary: cena YES to twoja bezpośrednia estymacja prawdopodobieństwa. NegRisk: cena YES dla jednego legu to prawdopodobieństwo, że ten konkretny wynik wygra spośród N alternatyw. Wraz ze wzrostem N pojedyncze ceny maleją (prawdopodobieństwa sumują się do 1). Trading NegRisk wymaga myślenia w kategoriach względnych prawdopodobieństw, a nie absolutnego Yes/No.
Jaki jest najczęstszy bug bota NegRisk?
Zapomnienie o fladze neg_risk: true przy składaniu ordera. Order albo zostaje odrzucony, albo trafia do niewłaściwej pozycji CTF. Mieliśmy to w produkcji — commit 06deaef w historii naszego tradera był właśnie poprawką tego problemu. Zawsze ustawiaj neg_risk=true (Python) albo negRisk: true (Node) dla orderów NegRisk.
Czy mogę zarabiać na NegRisk przez hedging legów?
Teoretycznie tak (zablokowanie spreadu między dwoma legami). W praktyce fees zjadają edge hedga dla większości retail botów. Hedging działa do utrzymywania neutral inventory podczas market makingu, a nie jako samodzielna strategia.
Jak znaleźć markets NegRisk?
Filtruj gamma /events po eventach z liczbą markets > 2 i ustawioną flagą negRisk. Typowe kategorie: championship winners (NBA Finals MVP), election fields (next Speaker), tournament brackets. Każdy event w gamma zawiera tablicę child markets.
Czy markets NegRisk są bardziej czy mniej płynne niż binary?
Mniej na leg, więcej łącznie. Event NBA Champion z 30 drużynami może mieć 50K total 24h volume, ale każdy market drużyny tylko 1.6K — przez co trading per-leg jest trudniejszy. Łączna płynność jest realna, tylko rozproszona.