Polymarket Bot Tutorial · บทที่ 11 จาก 32
วิธีการทำงานของตลาด NegRisk แบบ multi-outcome บน Polymarket: กลไก sum-to-1, flag negRisk ใน CLOB orders, ทำไม YES legs ภายใน NegRisk จึงใช้แทนกันไม่ได้ และแนวปฏิบัติที่ดีที่สุดในการ execution.
บทนี้ครอบคลุมอะไร
ตลาด NegRisk คือกลไกของ Polymarket สำหรับเหตุการณ์แบบ multi-outcome ที่เป็น mutually exclusive-เช่น ผู้สมัครเลือกตั้งปี 2024, ผู้ชนะ Premier League, สายการแข่งขันใน tournament. บอทส่วนใหญ่จัดการมันผิดในครั้งแรก เพราะการส่งออเดอร์ต้องใช้ flag ที่ถ้าขาดไปจะถูกละไว้แบบเงียบๆ บทนี้จะอธิบายทั้งกลไกและ production code path.
- NegRisk หมายถึงอะไร (mutually exclusive Yes legs)
- ทำไมยอดรวม YES จึงอยู่ใกล้ 1 USD
- พารามิเตอร์ neg_risk ในการส่งออเดอร์
- การ hedge ข้าม NegRisk legs
- เมื่อไรที่ NegRisk arb ใช้ได้ผล (และเมื่อไรที่ไม่ได้ผล)
- กรณีขอบของการ resolution
- โค้ด: ส่ง NegRisk order
NegRisk หมายถึงอะไร (mutually exclusive Yes legs)
NegRisk (ย่อมาจาก "negative risk") คือกลไกของ Polymarket สำหรับเหตุการณ์ที่มีหลายผลลัพธ์ซึ่ง mutually exclusive-มีได้เพียงหนึ่งผลลัพธ์เท่านั้นที่ resolve เป็น YES ได้ การเลือกตั้งประธานาธิบดีปี 2024 เป็นหนึ่งเหตุการณ์แบบ NegRisk: ตำแหน่ง Trump-YES และ Harris-YES ไม่สามารถจ่ายผลตอบแทนพร้อมกันได้
เบื้องหลังการทำงาน: เหตุการณ์ NegRisk หนึ่งรายการมี parent question_id เดียว และมี N child markets โดยแต่ละตัวมี YES/NO ของตัวเอง exchange จะบังคับให้ sum-to-1 ในบรรดา YES legs ตอน resolution-มีเพียงหนึ่งตัวที่ resolve เป็น 1.0 และที่เหลือเป็น 0.0
จากมุมมองของบอท YES leg ของแต่ละผลลัพธ์จะเทรดเป็น token ของตัวเอง พร้อม order book และราคาของตัวเอง flag negRisk ใน order placement (ด้านล่าง) จะ route การเทรดไปยัง exchange contract เฉพาะของ NegRisk; ถ้าขาด flag นี้ ระบบจะส่งไปยัง standard CTF exchange และจะ fail ในการ settle อย่างถูกต้องแบบเงียบๆ
ทำไมยอดรวม YES จึงอยู่ใกล้ 1 USD
Arbitrageurs จะคอยทำให้ผลรวมของราคา YES ในทุก NegRisk legs อยู่ใกล้ ≈ 1.0 อย่างต่อเนื่อง ถ้า Trump-YES อยู่ที่ 0.55 และ Harris-YES อยู่ที่ 0.40 และไม่มีผู้สมัครรายอื่นที่แข่งขันได้ ส่วนที่ขาดไป 0.05 คือความน่าจะเป็นโดยนัยของ "ผลลัพธ์อื่นใด" เมื่อสัดส่วนที่ขาดมากกว่าความน่าจะเป็นหางที่โดยนัย จะเกิดโอกาส arb: ซื้อ YES legs ทุกตัวตามสัดส่วน ผลรวมต่ำกว่า 1.0 แล้วล็อกส่วนต่างไว้
ในทางปฏิบัติ arb นี้แข่งขันสูง-ส่วนลดที่เห็นได้มักอยู่ที่ 1-2 เซนต์ในเหตุการณ์ที่สภาพคล่องดี และหายไปภายในไม่กี่นาทีหลังเปิดตลาด arb นี้ยังถูกจำกัดด้วยสภาพคล่องด้วย: คุณอาจล็อกส่วนลดได้ $1k แต่ไม่ใช่ $20k
บอทส่วนใหญ่ไม่ได้ทำ NegRisk arb; แต่กำลังเทรด legs รายตัว และต้องเคารพ flag negRisk เพื่อให้ execution ถูกต้อง
พารามิเตอร์ neg_risk ในการส่งออเดอร์
ใน CLOB v2 SDK การส่งออเดอร์จะรับ flags object ที่มี boolean negRisk ค่านี้ต้องตรงกับประเภทของตลาด:
// 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 นี้ยังเป็นพารามิเตอร์ใน daemon op signature ที่บอท production ส่วนใหญ่ใช้:
{ op: 'buy', tokenID, price, size, neg_risk: true, order_type: 'FOK' }
source of truth คือ market.negRisk จาก Gamma API ต้องอ่านเสมอ; ห้าม hardcode เด็ดขาด ตลาด BTC ขึ้น/ลงคือ negRisk: false (binary); ตลาดผู้ชนะทัวร์นาเมนต์คือ negRisk: true (multi-outcome) การสลับสายส่งออเดอร์จะทำให้ออเดอร์ไปผิด exchange และเกิด transfer failure ตอน settlement
การ hedge ข้าม NegRisk legs
ถ้าคุณถือ Trump-YES ที่ 0.50 และอยาก hedge ความเสี่ยงหาก Trump แพ้ มีสองทางเลือกภายใน NegRisk
ซื้อ competing NO leg (เช่น Harris-NO ที่ 0.45) วิธีนี้จะจ่ายผลตอบแทนถ้า Harris แพ้ ซึ่งรวมถึงกรณีที่ Trump ชนะด้วย-เป็นแบบ asymmetric คือได้ payoff หาก Trump ชนะ แต่จะไร้ค่าถ้า Trump แพ้ให้ผู้สมัครคนที่สาม
ซื้อ competing YES legs ทั้งหมด ตามสัดส่วน หากพอร์ตของคุณบาลานซ์ครบถ้วน across the NegRisk legs ความเสี่ยงจะถูก hedge: จะมีเพียงหนึ่งตัวเท่านั้นที่จ่ายผลตอบแทน นี่คือสถานะ synthetic-cash
เครื่องมือ hedge ที่ ไม่ได้ ทำงานตามที่คาด: NO leg ของตลาดที่คุณถืออยู่เอง Trump-NO มีความสัมพันธ์กับ YES legs อื่นๆ แต่ไม่สมบูรณ์-ถ้าผลการตัดสินคือ "Other" ทั้ง Trump-YES และ Trump-NO ของคุณจะกลายเป็น 0 ทั้งคู่ NegRisk legs ไม่ใช่ binary ล้วนๆ
เมื่อไรที่ NegRisk arb ใช้ได้ผล (และเมื่อไรที่ไม่ได้ผล)
NegRisk arb แบบ "ผลรวมต่ำกว่า 1.0" ใช้ได้ผลเมื่อมีเงื่อนไขสามข้อ
- ทุก leg มีสภาพคล่อง: แต่ละ leg ที่คุณต้องซื้อมี depth อย่างน้อย $1k ที่ราคาที่ต้องการ Arb ต้องยิงหลาย order book พร้อมกัน; ถ้ามี leg ใด illiquid จะพังทั้งดีล
- spread แคบพอ: spread-tax สะสมรวมทุก leg ต้องน้อยกว่าส่วนลด ถ้ามีห้า legs ที่ spread 0.5c ต่อ leg ก็เท่ากับต้นทุน 2.5c; ถ้าส่วนลดมีแค่ 1.5c arb จะติดลบ
- คุณถือจนถึง resolution ได้: NegRisk arb คือ settlement arb คุณจะได้รับ payout ตอน parent event resolve; ถ้ามันอีก 6 เดือนข้างหน้า ทุนของคุณจะถูกล็อกไว้
สำหรับบอท 95% แล้ว NegRisk arb ไม่ใช่กลยุทธ์หลัก กลยุทธ์ที่เหลือจะเทรด legs รายตัว และ flag negRisk มีไว้เพื่อให้การ route order ถูกต้องเท่านั้น
กรณีขอบของการ resolution
มีสองกรณีขอบที่ควรรู้เมื่อถือสถานะ NegRisk จนถึง resolution
ผลลัพธ์แบบ "None of the above": บางเหตุการณ์ NegRisk มี leg "Other" หรือ "None of the above" แบบชัดเจน หากคำตอบจริงไม่ตรงกับ leg ที่ตั้งชื่อไว้ใดๆ ตัวนี้จะเป็นผู้ชนะ บอทที่ไม่ได้ model explicit Other leg บางครั้งจะมองว่าเป็นกรณีผิดปกติและพลาด payout
การ dispute resolution: การ resolve ของ NegRisk จะผ่าน UMA เหมือนตลาดอื่นๆ หากมีการ dispute ตลาดอาจค้าง unresolved 24-72 ชั่วโมง ในช่วงนี้ front-end อาจแสดงว่า "resolved" ทั้งที่ on-chain payouts ยังไม่ถูกตั้งค่า การอ่าน payoutNumerators บน CTF contract คือวิธีเดียวที่ปลอดภัยในการยืนยัน
โค้ด: ส่ง NegRisk order
ตัวอย่างเต็มใน Node สำหรับการส่งคำสั่งซื้อ YES leg ของ NegRisk
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);
บั๊กที่พบบ่อยที่สุดสำหรับผู้เริ่มสร้างบอท: ละเว้น negRisk: true ในตลาด NegRisk ออเดอร์จะถูกยอมรับโดย CLOB แต่ settlement จะล้มเหลว ต้องอ่าน market.negRisk จาก Gamma เสมอแล้วส่งต่อไปด้วย; ห้ามเดาจากชื่อคำถามอย่างเดียว












