Polymarket Bot Tutorial · Глава 11 из 32
Как работают рынки NegRisk с multiple outcomes на Polymarket: механика sum-to-1, флаг negRisk в CLOB orders, почему YES legs в NegRisk не взаимозаменяемы и лучшие практики исполнения.
Что покрывает эта глава
Рынки NegRisk - это механизм Polymarket для mutually exclusive multi-outcome событий: кандидаты на выборах 2024 года, победитель Premier League, tournament brackets. Большинство bots с первой попытки обрабатывают их неправильно, потому что размещение order требует флага, который silently dropped, если его не указать. В этой главе мы разбираем механику и production code path.
- Что означает NegRisk (mutually exclusive Yes legs)
- Почему сумма YES остается около 1 USD
- Параметр neg_risk при размещении order
- Хеджирование across NegRisk legs
- Когда NegRisk arb работает (и когда нет)
- Граничные случаи resolution
- Code: размещение NegRisk order
Что означает NegRisk (mutually exclusive Yes legs)
NegRisk (сокращение от "negative risk") - это механизм Polymarket для событий с несколькими mutually exclusive outcomes: только один может resolve YES. Presidential Election 2024 была одним событием с NegRisk: позиция Trump-YES и позиция Harris-YES не могут обе принести payout.
Под капотом: у одного NegRisk event есть один parent question_id и N child markets, у каждого свой YES/NO. Exchange enforces sum-to-1 across the YES legs при resolution - ровно один resolves to 1.0, а остальные to 0.0.
С точки зрения bot, YES leg каждого outcome торгуется как отдельный token, со своей book и price. Флаг negRisk при размещении order (ниже) направляет trade в NegRisk-specific exchange contract; если его не указать, order отправится в standard 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, и других серьезных candidates нет, недостающие 0.05 - это примерно implied probability "any other outcome." Когда недостающая доля превышает implied tail probability, возникает arb opportunity: buy all YES legs proportionally, sum to less than 1.0, зафиксировать разницу.
На практике arb очень конкурентный - visible discount обычно составляет 1-2 cents на liquid events и исчезает в течение минут после открытия. Кроме того, arb ограничен liquidity: можно lock in $1k discount, но не $20k.
Большинство bots не занимаются NegRisk arb; они торгуют отдельные legs и им нужно просто корректно учитывать флаг negRisk для execution.
Параметр neg_risk при размещении order
В CLOB v2 SDKs размещение 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 bots:
{ op: 'buy', tokenID, price, size, neg_risk: true, order_type: 'FOK' }
Source of truth: market.negRisk из Gamma API. Всегда читайте его; никогда не hardcode. Рынок BTC-up/down - это negRisk: false (binary); рынок победителя турнира - это negRisk: true (multi-outcome). Перепутать это значит отправить order в неправильный exchange и получить transfer failures при settlement.
Хеджирование across NegRisk legs
Если у вас есть Trump-YES по 0.50 и вы хотите hedge против проигрыша Trump, внутри NegRisk есть два варианта.
Buy competing NO leg (например, Harris-NO по 0.45). Это pays out, если Harris проиграет, а значит в том числе и при победе Trump. Asymmetric - payoff при победе Trump, но worthless, если Trump проиграет третьему candidate.
Buy all competing YES legs в соответствующих пропорциях. Если ваш portfolio полностью сбалансирован across NegRisk legs, exposure хеджировано: ровно один leg принесет payout. Это synthetic-cash position.
Hedging instrument, который работает не так, как ожидается: NO leg в вашем existing market. Trump-NO коррелирует с другими YES legs, но не идеально - если resolution это "Other", и ваш Trump-YES, и ваш Trump-NO оба уходят в 0. NegRisk legs - это не pure binaries.
Когда NegRisk arb работает (и когда нет)
NegRisk arb "sum to less than 1.0" работает, когда выполняются три условия.
- Все legs liquid: у каждого leg, который нужно купить, есть как минимум $1k depth по нужной цене. Arb требует одновременно hit multiple books; один illiquid leg ломает всю сделку.
- Spread достаточно узкий: cumulative spread-tax across all legs должна быть меньше discount. Пять legs со spread 0.5c каждый - это 2.5c cost; если discount 1.5c, arb отрицательный.
- Вы можете удерживать до resolution: NegRisk arb - это settlement arb. Вы получаете payout, когда parent event resolves; если это через 6 месяцев, ваш capital locked.
Для 95% bots NegRisk arb - не стратегия. Остальные стратегии торгуют отдельные legs, а флаг negRisk нужен только для корректной маршрутизации order.
Граничные случаи resolution
Два edge cases, о которых стоит помнить, удерживая NegRisk позиции до resolution.
Outcomes "None of the above": некоторые NegRisk events включают явный leg "Other" или "None of the above". Если фактический ответ не совпадает ни с одним named leg, победителем становится он. Bots, которые не моделируют явный Other leg, иногда считают это degenerate case и пропускают payout.
Disputed resolutions: resolution в NegRisk проходит через UMA, как и у любого другого market. Если есть dispute, market может оставаться unresolved 24-72 hours. В этот период 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);
Самый распространенный bug у начинающих builders: не указать negRisk: true на NegRisk market. Order принимается CLOB, но settlement fails. Всегда читайте market.negRisk из Gamma и передавайте его дальше; никогда не полагайтесь на догадки по названию question.










