Polymarket Bot Tutorial · 32개 챕터 중 11장
Polymarket에서 NegRisk multi-outcome markets가 작동하는 방식: sum-to-1 메커니즘, CLOB orders의 negRisk flag, NegRisk 전반의 YES legs가 서로 대체 불가능한 이유, 그리고 실행 best practices.
이 장에서 다루는 내용
NegRisk markets는 Polymarket의 mutually exclusive multi-outcome events를 위한 메커니즘입니다. 예: 2024년 election candidates, Premier League winner, tournament brackets. 대부분의 bot은 첫 시도에서 이를 올바르게 처리하지 못하는데, order placement에 필요한 flag가 빠져 있으면 조용히 drop되기 때문입니다. 이 장에서는 그 mechanics와 production code path를 다룹니다.
- NegRisk의 의미 (mutually exclusive Yes legs)
- YES totals가 1 USD 근처를 유지하는 이유
- order placement의 neg_risk parameter
- NegRisk legs 간 hedging
- NegRisk arb가 작동하는 경우와 그렇지 않은 경우
- resolution edge cases
- Code: NegRisk order 배치
NegRisk의 의미 (mutually exclusive Yes legs)
NegRisk("negative risk"의 줄임말)는 여러 mutually exclusive outcomes를 가진 이벤트를 위한 Polymarket의 메커니즘입니다. 즉, YES로 resolve될 수 있는 outcome은 하나뿐입니다. 2024년 Presidential Election은 NegRisk 이벤트의 한 예였으며, Trump-YES position과 Harris-YES position은 둘 다 payout될 수 없습니다.
내부적으로는 하나의 NegRisk event가 하나의 parent question_id와 N개의 child markets를 가지며, 각 child market은 자체 YES/NO를 갖습니다. exchange는 resolution 시 YES legs 전체에 대해 sum-to-1을 강제합니다. 정확히 하나는 1.0으로 resolve되고 나머지는 0.0으로 resolve됩니다.
bot의 관점에서 각 outcome의 YES leg는 자체 token처럼 거래되며, 자체 book과 price를 가집니다. order placement에서의 negRisk flag는 아래에서 설명하는 것처럼 거래를 NegRisk 전용 exchange contract로 라우팅합니다. 이 flag가 없으면 standard CTF exchange로 보내지며, settlement 시 올바르게 settle되지 않고 조용히 실패합니다.
YES totals가 1 USD 근처를 유지하는 이유
arbitrageurs는 모든 NegRisk legs의 YES 가격 합계를 지속적으로 ≈ 1.0으로 유지합니다. 예를 들어 Trump-YES가 0.55이고 Harris-YES가 0.40이며 다른 경쟁 후보가 없다면, 부족한 0.05는 대략 "다른 어떤 outcome"의 implied probability입니다. 누락된 부분이 implied tail probability를 초과하면 arb opportunity가 생깁니다. 모든 YES legs를 비례적으로 매수해 합계가 1.0 미만이 되도록 만들고, 그 차이를 고정하는 것입니다.
실전에서는 이 arb가 매우 경쟁적입니다. 유동성이 있는 이벤트에서 보이는 discount는 보통 1~2센트 수준이며, 열린 뒤 몇 분 안에 사라집니다. 또한 arb는 liquidity-bound이기도 해서, $1k의 discount는 잡을 수 있어도 $20k는 불가능할 수 있습니다.
대부분의 bot은 NegRisk arb를 하는 것이 아니라 개별 legs를 거래하며, 실행 정확성을 위해 negRisk flag를 준수해야 합니다.
order placement의 neg_risk parameter
CLOB v2 SDK에서 order placement는 boolean negRisk를 포함하는 flags object를 받습니다. 이 값은 market type과 일치해야 합니다:
// 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
);
이 flag는 대부분의 production bot이 사용하는 daemon op signature의 parameter이기도 합니다:
{ op: 'buy', tokenID, price, size, neg_risk: true, order_type: 'FOK' }
source of truth는 Gamma API의 market.negRisk입니다. 반드시 읽어야 하며, hardcode하면 안 됩니다. BTC-up/down market은 negRisk: false (binary)이고, tournament-winner market은 negRisk: true (multi-outcome)입니다. 이 둘을 혼동하면 order가 잘못된 exchange로 전송되어 settlement 시 transfer failure가 발생합니다.
NegRisk legs 간 hedging
Trump-YES를 0.50에 보유하고 있고 Trump loss에 대비해 hedge하고 싶다면, NegRisk 안에서 두 가지 옵션이 있습니다.
경쟁하는 NO leg를 매수합니다. 예: Harris-NO를 0.45에 매수. 이는 Harris가 지는 경우에 payout되며, 여기에는 Trump의 승리도 포함됩니다. 비대칭적입니다. Trump가 이기면 payoff가 있지만, Trump가 세 번째 후보에게 지면 무가치합니다.
경쟁하는 모든 YES leg를 비례적으로 매수합니다. 포트폴리오가 NegRisk legs 전반에서 완전히 균형을 이루면 exposure가 hedge됩니다. 정확히 하나가 payout되기 때문입니다. 이것이 synthetic-cash position입니다.
예상과 다르게 작동하는 hedging instrument는 기존 market의 NO leg입니다. Trump-NO는 다른 YES legs와 상관관계가 있지만 완벽하지는 않습니다. resolution이 "Other"인 경우 Trump-YES와 Trump-NO가 모두 0이 됩니다. NegRisk legs는 pure binary가 아닙니다.
NegRisk arb가 작동하는 경우와 그렇지 않은 경우
"합계가 1.0보다 작다"는 NegRisk arb는 다음 세 조건이 충족될 때 작동합니다.
- 모든 legs가 유동적일 것: 매수해야 하는 각 leg에 원하는 price에서 최소 $1k의 depth가 있어야 합니다. Arb는 여러 books를 동시에 hit해야 하므로, 한 leg라도 illiquid하면 전체 trade가 깨집니다.
- spread가 충분히 좁을 것: 모든 legs에 걸친 누적 spread-tax가 discount보다 작아야 합니다. 각 leg당 0.5c spread인 다섯 개 legs면 비용이 2.5c입니다. discount가 1.5c라면 arb는 negative입니다.
- resolution까지 보유할 수 있을 것: NegRisk arb는 settlement arb입니다. parent event가 resolve될 때 payout을 받으며, 그 시점이 6개월 뒤라면 자본은 묶입니다.
대부분의 bot, 즉 95%에게 NegRisk arb는 전략이 아닙니다. 나머지 전략은 개별 legs를 거래하며, negRisk flag는 order가 올바르게 route되도록 보장하기 위해서만 존재합니다.
resolution edge cases
NegRisk positions를 resolution까지 보유할 때 주의해야 할 edge case가 두 가지 있습니다.
"None of the above" outcomes: 일부 NegRisk events에는 명시적인 "Other" 또는 "None of the above" leg가 있습니다. 실제 답이 이름 붙은 어떤 leg와도 일치하지 않으면 이것이 winner입니다. 명시적 Other leg를 모델링하지 않는 bot은 이를 종종 degenerate case로 처리해 payout을 놓칩니다.
disputed resolutions: NegRisk resolution은 다른 시장과 마찬가지로 UMA를 거칩니다. dispute가 발생하면 market이 24~72시간 동안 unresolved 상태로 남을 수 있습니다. 이 기간 동안 front-end는 "resolved"로 표시할 수 있지만 on-chain payout은 아직 설정되지 않았을 수 있습니다. 이를 확인하는 안전한 방법은 CTF contract의 payoutNumerators를 읽는 것입니다.
Code: NegRisk order 배치
NegRisk YES leg buy를 배치하는 전체 Node 예제입니다.
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);
새로 만드는 builder가 가장 흔히 저지르는 버그 하나는 NegRisk market에서 negRisk: true를 생략하는 것입니다. order는 CLOB에서 수락되지만 settlement가 실패합니다. 항상 Gamma에서 market.negRisk를 읽어 전달하고, question title만 보고 추측해서는 안 됩니다.










