Polymarket Bot Tutorial · Chapter 11 of 32
Як працюють multi-outcome markets NegRisk на Polymarket: механіка sum-to-1, прапорець negRisk у CLOB orders, чому YES legs у межах NegRisk не є взаємозамінними, і найкращі практики виконання.
Що охоплює цей розділ
NegRisk markets - це механізм Polymarket для взаємовиключних multi-outcome подій - кандидати на виборах 2024 року, переможець Premier League, tournament brackets. Більшість bot'ів на першій спробі обробляють їх неправильно, тому що placement order потребує прапорця, який мовчки відкидається, якщо його не вказати. У цьому розділі ми розглядаємо механіку та production code path.
- Що означає NegRisk (взаємовиключні Yes legs)
- Чому сума YES тримається близько 1 USD
- Параметр neg_risk під час placement order
- Hedging між NegRisk legs
- Коли NegRisk arb працює (а коли ні)
- Краєві випадки resolution
- Code: розмістити NegRisk order
Що означає NegRisk (взаємовиключні Yes legs)
NegRisk (скорочення від "negative risk") - це механізм Polymarket для подій із кількома взаємовиключними outcome - лише один може resolve YES. Presidential Election 2024 була однією подією з NegRisk: позиція Trump-YES і позиція Harris-YES не можуть обидві отримати payout.
Під капотом: одна NegRisk event має один parent question_id і N child markets, кожен зі своїми YES/NO. Exchange enforce'ить sum-to-1 across the YES legs під час resolution - рівно один отримує 1.0, а решта 0.0.
З погляду bot'а YES leg кожного outcome торгується як окремий token, зі своїм book і price. Прапорець negRisk у placement order (нижче) маршрутизує trade до NegRisk-specific exchange contract; якщо його не вказати, trade піде до стандартного CTF exchange і silently fails to settle correctly.
Чому сума YES тримається близько 1 USD
Arbitrageurs безперервно тримають суму YES prices across all NegRisk legs на рівні ≈ 1.0. Якщо Trump-YES = 0.55, Harris-YES = 0.40 і немає інших конкурентних кандидатів, відсутні 0.05 - це приблизно implied probability "any other outcome". Коли цей missing slice перевищує implied tail probability, виникає arb opportunity: купити всі YES legs пропорційно, сума буде меншою за 1.0, а різницю - зафіксувати.
На практиці arb дуже конкурентний - видимий discount зазвичай становить 1-2 центи на liquid events і зникає протягом кількох хвилин після відкриття. Arb також обмежений ліквідністю: ви можете зафіксувати $1k discount, але не $20k.
Більшість bot'ів не займаються NegRisk arb; вони торгують окремими legs і потребують дотримання прапорця negRisk для коректного execution.
Параметр neg_risk під час placement order
У CLOB v2 SDKs placement order приймає flags object з boolean negRisk. Значення має відповідати типу market:
// Node (CLOB v2)
await client.createAndPostOrder(
{ tokenID, price: 0.45, size: 10, side: Side.BUY },
{ tickSize: '0.01', negRisk: true }, // <-- TRUE for NegRisk
OrderType.FOK
);
Цей прапорець також є параметром у daemon op signature, який використовують більшість production bot'ів:
{ op: 'buy', tokenID, price, size, neg_risk: true, order_type: 'FOK' }
Source of truth: market.negRisk з Gamma API. Завжди читайте його; ніколи не hardcode'ьте. BTC-up/down market має negRisk: false (binary); tournament-winner market має negRisk: true (multi-outcome). Якщо переплутати, orders підуть на неправильний exchange і спричинять transfer failures під час settlement.
Hedging між NegRisk legs
Якщо ви тримаєте Trump-YES за 0.50 і хочете захеджуватися від Trump loss, у межах NegRisk є два варіанти.
Купити конкуруючу NO leg (наприклад, Harris-NO за 0.45). Вона виплатить, якщо Harris програє, а це включає перемогу Trump. Нерівномірно - payout є, якщо Trump перемагає, але він нічого не вартий, якщо Trump програє третьому кандидату.
Купити всі конкуруючі YES legs пропорційно. Якщо ваш portfolio повністю збалансований across the NegRisk legs, ваша exposure hedged: рівно одна позиція отримає payout. Це synthetic-cash позиція.
Інструмент hedging, який НЕ працює так, як очікується: NO leg на вашому існуючому market. Trump-NO корелює з іншими YES legs, але не ідеально - якщо resolution буде "Other", і ваш Trump-YES, і ваш Trump-NO підуть до 0. NegRisk legs - це не чисті binaries.
Коли NegRisk arb працює (а коли ні)
NegRisk arb "сума менша за 1.0" працює, коли виконуються три умови.
- Усі legs ліквідні: кожна leg, яку потрібно купити, має щонайменше $1k depth на потрібному вам price. Arb вимагає одночасного hitting кількох books; одна illiquid leg ламає всю угоду.
- Spread достатньо вузький: сукупний spread-tax across all legs має бути меншим за discount. П’ять legs по 0.5c spread кожна - це 2.5c cost; якщо discount становить 1.5c, arb є негативним.
- Ви можете тримати до resolution: NegRisk arb - це settlement arb. Ви отримуєте payout, коли parent event resolves; якщо це через 6 місяців, ваш capital заблокований.
Для 95% bot'ів NegRisk arb - це не strategy. Решта strategy торгують окремими legs, а прапорець negRisk існує лише для того, щоб order правильно маршрутизувався.
Краєві випадки resolution
Два edge cases, про які варто пам’ятати, коли ви тримаєте NegRisk positions до resolution.
Варіанти "None of the above": деякі NegRisk events містять явну leg "Other" або "None of the above". Якщо фактична відповідь не збігається з жодною названою leg, саме вона і є winner. Bot'и, які не моделюють явну Other leg, іноді трактують це як degenerate case і пропускають payout.
Спірні resolution: NegRisk resolution проходить через UMA, як і будь-який інший market. Якщо є dispute, market може залишатися unresolved 24-72 години. У цей проміжок front-end може показувати "resolved", хоча on-chain payouts ще не встановлені. Читання payoutNumerators у CTF contract - єдиний безпечний спосіб підтвердження.
Code: розмістити NegRisk order
Повний Node приклад розміщення buy для NegRisk YES leg.
import { ClobClient, Side, OrderType } from "@polymarket/clob-client-v2";
import { Wallet } from "ethers";
const c = new ClobClient({
host: "https://clob.polymarket.com", chain: 137,
signer: new Wallet(process.env.PRIVATE_KEY),
creds: { key: K, secret: S, passphrase: P },
signatureType: 2,
funderAddress: process.env.POLY_FUNDER,
});
// market.negRisk === true (verified via Gamma earlier)
const resp = await c.createAndPostOrder(
{ tokenID: "<YES_TOKEN_ID>", price: 0.42, size: 25, side: Side.BUY },
{ tickSize: "0.01", negRisk: true },
OrderType.FOK
);
console.log(resp.status, resp.orderID);
Найпоширеніша помилка для нових builders: не вказати negRisk: true на NegRisk market. Order приймається CLOB, але settlement fails. Завжди читайте market.negRisk з Gamma і передавайте його далі; ніколи не покладайтесь на здогадки з назви question.














