Kurs budowy bota na Polymarket · Rozdział 17 z 32

Wykorzystaj nierównowagę arkusza zleceń Polymarket jako krótkoterminowy sygnał cenowy: stosunek wolumenu ofert kupna do sprzedaży, obliczanie microprice, okres półtrwania sygnału oraz to, kiedy boty na nierównowagę biją losową realizację.

Co obejmuje ten rozdział

Nierównowaga arkusza zleceń to stosunek głębokości po stronie kupna do głębokości po stronie sprzedaży w arkuszu zleceń z limitem. Na Polymarket ma ona realną, ale krótkotrwałą przewagę prognostyczną - zwykle 5-30 sekund, zanim cena środkowa się przesunie. Ten rozdział dotyczy wzorca obliczeń oraz warunków, w których sygnał bywa mylący.

To rozdział 17 naszej 32-częściowej serii o budowie bota tradingowego na Polymarket. Szczegółowo omawiamy temat w sekcjach poniżej. Treść każdej sekcji jest pisana i publikowana rozdział po rozdziale; odpowiedzi FAQ i sekcje referencyjne są już kompletne i odzwierciedlają doświadczenie produkcyjne z prowadzenia naszego własnego bota.

  • Czym jest nierównowaga arkusza zleceń
  • Obliczanie microprice
  • Nierównowaga jako sygnał kierunkowy
  • Okres półtrwania sygnału na Polymarket
  • Kiedy sygnały nierównowagi kłamią
  • Kod: obliczanie nierównowagi przy każdym ticku WebSocket

Czym jest nierównowaga arkusza zleceń

Nierównowaga arkusza zleceń to stosunek całkowitej głębokości po stronie kupna do całkowitej głębokości po stronie sprzedaży w arkuszu zleceń z limitem. Obliczana na N najlepszych poziomach (zwykle N=5) uchwytuje skumulowaną presję traderów, której cena środkowa jeszcze nie odzwierciedliła.

Wzór: imbalance = (Σ bid[i].price × bid[i].size for i in [0..N]) − (Σ ask[i].price × ask[i].size) / (Σ both). Zakres -1 do +1; wartość dodatnia oznacza większą presję kupna, ujemna - większą presję sprzedaży.

Sygnał jest empirycznie realny na Polymarket, ale zaszumiony. Pojedynczy wieloryb może stworzyć fałszywą nierównowagę na 30-60 sekund, zanim zostanie zniwelowana przez arbitrażystów. Użyteczny jako jedna z kilku cech, niebezpieczny jako jedyny wyzwalacz.

Obliczanie microprice

Microprice to dopracowanie prostej ceny środkowej: średnia ważona najlepszej oferty kupna i najlepszej oferty sprzedaży, ważona ich odpowiednimi rozmiarami.

microprice = (best_bid × ask_size + best_ask × bid_size) / (bid_size + ask_size)

Gdy kolejka po stronie ofert kupna jest znacznie większa niż po stronie sprzedaży, microprice przesuwa się bliżej oferty sprzedaży. Intuicja: więcej czekających kupujących oznacza, że następna transakcja z większym prawdopodobieństwem podniesie ofertę sprzedaży, więc wartość godziwa jest bliżej oferty sprzedaży.

Microprice to wskaźnik wyprzedzający rzeczywistą cenę środkową o 5-30 sekund. Boty produkcyjne używają go jako ceny odniesienia do decyzji o realizacji zysku zamiast naiwnej ceny środkowej.

Nierównowaga jako sygnał kierunkowy

Z obserwacji produkcyjnych: gdy nierównowaga zmienia się z -0,3 na +0,5 w ciągu 10 sekund bez towarzyszącego wydarzenia newsowego, cena środkowa rośnie o 1-2 centy w kolejnych 30-60 sekundach w około 65% przypadków.

To realna przewaga, ale zanika przy małych wielkościach pozycji po uwzględnieniu opłat. Aby ją zmonetyzować, bot musi skalować pozycję na tyle, by złapać ruch minus opłaty, ale na tyle mało, by samemu nie poruszyć arkusza. Arkusze zleceń Polymarket są zwykle na tyle cienkie, że wszystko powyżej 50 udziałów porusza rynek.

Łącz nierównowagę z innymi cechami: prędkością transakcji (więcej transakcji = realny sygnał), tym, czy najlepsza oferta kupna faktycznie idzie w górę (a nie tylko przesuwa się głębokość), oraz tym, że rynek nie działa w trybie napędzanym newsami.

Okres półtrwania sygnału na Polymarket

Sygnał nierównowagi zanika. Dane produkcyjne z naszego bota: nierównowaga > 0,6 → oczekiwany ruch ceny środkowej o 1,2 centa w ciągu 60 s, okres półtrwania około ~30 s. Po 90 sekundach wartość predykcyjna spada do zera.

Implikacja dla projektu bota: reaguj szybko albo pomiń sygnał. Bot, który potrzebuje 15 sekund na decyzję, zużywa połowę przewagi, zanim złoży zlecenie. Budżet latencji dla strategii opartych na nierównowadze powinien wynosić mniej niż 5 sekund od sygnału do odpalonego FOK.

Strategie utrzymujące pozycje dłużej niż okres półtrwania (1-2 minuty) grają na kolejny sygnał, a nie na bieżący. Bądź w tym precyzyjny; nie trzymaj przypadkiem pozycji opartej na nierównowadze aż do rozstrzygnięcia.

Kiedy sygnały nierównowagi kłamią

Sygnał bywa mylący, gdy zachodzi jeden z trzech warunków.

  • Ruch napędzany newsami: nierównowaga jest konsekwencją newsów, których jeszcze nie widziałeś. Handel przeciwko temu przegrywa; handel zgodny z ruchem to arbitraż na newsach, czyli inna strategia.
  • Spoofing wieloryba: duże zlecenie złożone i szybko anulowane tworzy fałszywą nierównowagę na czas jego obecności. Filtruj to, sprawdzając, czy nierównowaga utrzymuje się przez 10+ sekund przed uruchomieniem.
  • Rebalansowanie na koniec okresu: animatorzy rynku wycofują kwoty z powodów zapasu, a nie informacji. Nierównowaga odwraca się kilka minut później, gdy maker ponownie wystawia kwoty.

Połączony filtr brzmi: nierównowaga > próg ORAZ prędkość transakcji > poziom bazowy ORAZ brak wydarzenia newsowego w ostatnich 5 minutach. Każdy filtr osobno daje zbyt wiele fałszywych sygnałów.

Kod: obliczanie nierównowagi przy każdym ticku WebSocket

Referencja: zasubskrybuj aktualizacje arkusza przez WebSocket, przeliczaj nierównowagę przy każdym ticku.

def on_book_message(msg):
    bids = msg.get("bids", [])[:5]
    asks = msg.get("asks", [])[:5]
    bid_usd = sum(float(b["price"]) * float(b["size"]) for b in bids)
    ask_usd = sum(float(a["price"]) * float(a["size"]) for a in asks)
    total = bid_usd + ask_usd
    if total < 100: return  # illiquid
    imb = (bid_usd - ask_usd) / total
    state[msg["asset_id"]] = {
        "imb": imb,
        "best_bid": float(bids[0]["price"]) if bids else 0,
        "best_ask": float(asks[0]["price"]) if asks else 1,
        "ts": time.time()
    }
    # decision logic with cooldown + filters
    if imb > 0.6 and time.time() - last_fired.get(msg["asset_id"], 0) > 60:
        check_filters_and_maybe_fire(msg["asset_id"])

Stan jest per token. Okres wyciszenia zapobiega zbyt częstemu odpalaniu na ten sam sygnał. Filtry (sprawdzenie newsów, prędkość transakcji) bramkują właściwą transakcję.

Często zadawane pytania

Czym jest nierównowaga arkusza zleceń?
To stosunek wolumenu po stronie ofert kupna do wolumenu po stronie ofert sprzedaży na szczycie arkusza. Silnie przechylony arkusz po stronie kupna (więcej kupujących niż sprzedających blisko najlepszej ceny) sugeruje krótkoterminową presję wzrostową ceny. Sygnał jest dobrze znany w krypto i na rynkach akcji; na Polymarket działa na rynkach płynnych, ale znika na cienkich.
Jak obliczyć microprice?
microprice = (best_ask * bid_size + best_bid * ask_size) / (bid_size + ask_size). To wersja ceny środkowej ważona wolumenem, która przechyla się w stronę mniej obsadzonej strony - tej, która pierwsza się „wyczerpuje". Boty używają jej jako oszacowania wartości godziwej uwzględniającego nierównowagę.
Jaki jest okres półtrwania sygnału nierównowagi na Polymarket?
Na aktywnych rynkach 5-30 sekund. Na cienkich rynkach dłużej (bo nowe zlecenia potrzebują więcej czasu, aby zdominować nierównowagę). Jeśli twój bot reaguje w mniej niż sekundę, możesz część tego uchwycić. Jeśli reaguje po 5+ sekundach, zwykle jest już za późno.
Kiedy nierównowaga kłamie?
Gdy po jednej stronie siedzi pojedyncze duże zlecenie czekające na wypełnienie (jedna duża spoczywająca oferta kupna, brak innej aktywności). Nierównowaga jest wtedy realna, ale nie przewiduje ceny - pokazuje tylko jednego zdecydowanego kupującego. Filtruj po liczbie zleceń, nie tylko po wolumenie: nierównowaga N zleceń do 1 zlecenia jest bardziej informatywna niż 5-krotny wolumen rozłożony na 1 zlecenie każdy.
Czy nierównowaga arkusza zleceń wystarczy, by handlować samodzielnie?
Zwykle nie. Jako samodzielny sygnał jest słaby i bywa arbitrażowany. Połącz go z innym sygnałem (np. powrotem do średniej macroprice, flagą newsową lub stanem meczu), aby uzyskać trwalszą przewagę. Sama nierównowaga zwykle wypada gorzej niż losowa realizacja po opłatach.
Jaka biblioteka Python potrafi obliczać nierównowagę z WebSocket Polymarket?
Nie znamy gotowej biblioteki - to kilka dziesiątek linii kodu. Subskrybuj arkusz rynku przez py-clob-client, przy każdym zdarzeniu price_change przelicz rozmiar ofert kupna/sprzedaży na szczycie arkusza i emituj swoją metrykę nierównowagi. Cache'uj ostatnią wartość i odpalaj ponownie tylko przy istotnych zmianach.