Polymarket Bot Tutorial · Bab 22 dari 32
Bot NegRisk multi-outcome di Polymarket: mekanika sum-to-1, leg arbitrage saat YES legs tidak berjumlah 1, hedging lintas leg, dan jebakan eksekusi yang spesifik untuk multi-outcome markets.
Apa yang dibahas dalam bab ini
Multi-outcome NegRisk markets bersifat mutually exclusive - tepat satu yang akan resolve YES. Bab ini adalah lapisan strategi di atas mekanika eksekusi bab 11: bagaimana melakukan hedge lintas leg, kapan sum-to-1 arb benar-benar nyata, dan bug yang paling sering ditemui bot NegRisk saat deployment pertama.
- Rekap NegRisk vs binary
- Invariant sum-to-1 dan arbitrage
- Konstruksi hedge leg-by-leg
- Eksekusi: flag neg_risk dalam order
- Bug umum dalam bot NegRisk
- Code: snapshot semua leg dan deteksi sum di bawah 1.00
Rekap NegRisk vs binary
Binary: satu market yes/no, dua token, jumlah 1.0. NegRisk: N outcomes yang mutually exclusive, N token, semua YES leg berjumlah ~1.0 di seluruh event.
Dari sisi eksekusi, NegRisk membutuhkan negRisk: true pada setiap order (bab 11) dan diarahkan melalui exchange contract terpisah. Dari sisi strategi, NegRisk menawarkan dua peluang unik yang tidak dimiliki binary: cross-leg arb saat jumlah melenceng dari 1.0, dan konstruksi hedge dengan membeli beberapa YES leg.
Biaya yang unik pada NegRisk: semakin banyak leg = semakin besar spread tax (setiap leg yang Anda trade memakan spread ~0.5-1c), deviasi sum-to-1 yang lebih lebar pada event yang illiquid (arb lebih sering tersedia tetapi lebih kecil).
Invariant sum-to-1 dan arbitrage
Premis arb: jika membeli semua N YES leg biaya totalnya kurang dari $1.00, Anda mengunci profit yang terjamin saat resolution (satu leg pasti membayar $1.00; yang lain menjadi $0).
Dalam praktiknya, gap arb biasanya 0-3c, habis dimakan spread + fees pada tiap leg, dan hilang dalam hitungan menit setelah pembukaan. Kapasitas dibatasi oleh liquidity leg yang paling tipis.
Arb juga tunduk pada mode kegagalan resolution tertentu: outcome "none of the above" yang secara eksplisit resolve YES ketika tidak ada kandidat bernama yang memenuhi syarat. Jika event memiliki leg seperti itu dan Anda tidak membelinya, "complete hedge" Anda tidak mencakup payout yang sebenarnya.
Konstruksi hedge leg-by-leg
Jika Anda memegang posisi pada satu leg NegRisk, Anda bisa hedge dengan membeli YES pada leg kompetitor secara proporsional. Jika Anda memegang Trump-YES di 0.50 dan ingin hedge terhadap kekalahan Trump, Anda membeli portofolio leg bernama lainnya.
Bobot hedge per leg ≈ implied probability leg saat ini bersyarat pada Trump kalah. Aproksimasi: weight_i = price_i / (1 - trump_price).
Hedge ini tidak sempurna karena harga yang dipakai adalah point-in-time dan conditional probabilities bergeser saat berita datang. Rebalance hedge mingguan atau saat ada berita besar. Jangan over-engineer; tujuan hedge adalah mengurangi variance, bukan menghilangkannya.
Eksekusi: flag neg_risk dalam order
Bug paling umum yang spesifik untuk NegRisk: lupa negRisk: true di payload placement order. Order diterima oleh API tetapi settle dengan salah karena diarahkan ke standard CTF exchange alih-alih NegRisk exchange.
// CORRECT for NegRisk markets:
await client.createAndPostOrder(
{ tokenID, price, size, side: Side.BUY },
{ tickSize: '0.01', negRisk: true }, // <-- REQUIRED
OrderType.FOK
);
Source of truth: market.negRisk dari Gamma API. Baca itu; teruskan apa adanya. Jangan pernah hardcode flag berdasarkan tebakan.
Bug umum dalam bot NegRisk
Dari production debug logs di berbagai bot.
- Flag negRisk hilang: order diterima, settlement gagal. Solusi: enforce flag di setiap wrapper.
- Hedging tanpa leg "Other": pada event dengan outcome "None of the above", portofolio hedge yang mengecualikannya menjadi tidak lengkap. Solusi: selalu cek leg Other saat membangun hedge.
- Under-sizing sum-to-1 arb: arber menangkap edge 1c tetapi hanya trading 5 shares per leg; total profit 5 cents sebelum spread, net-nya negatif. Solusi: size arb agar menghasilkan dollar absolut yang berarti, jangan mengejar persentase headline.
- Stale leg pricing: bot mengambil harga 3 leg, total butuh 200ms, harga leg terakhir berubah selama pengambilan. Solusi: fetch semua leg secara paralel + perlakukan snapshot sebagai satu observasi.
Code: snapshot semua leg dan deteksi sum di bawah 1.00
Referensi: snapshot semua YES leg dari event NegRisk secara paralel, deteksi arb.
import asyncio, aiohttp
async def fetch_leg_ask(session, token_id):
async with session.get(f"https://clob.polymarket.com/book?token_id={token_id}") as r:
d = await r.json()
asks = d.get("asks", [])
return float(asks[0]["price"]) if asks else None
async def check_arb(event_slug):
event = await fetch_event(event_slug)
if not event["markets"][0]["negRisk"]: return None
legs = []
for m in event["markets"]:
toks = json.loads(m["clobTokenIds"])
yes_token = toks[0]
legs.append(yes_token)
async with aiohttp.ClientSession() as s:
asks = await asyncio.gather(*[fetch_leg_ask(s, t) for t in legs])
if any(a is None for a in asks): return None
total = sum(asks)
if total < 0.97:
return {"edge": 1 - total, "legs": list(zip(legs, asks))}
return None
Eksekusi atomik semua leg adalah masalah yang lebih sulit dan membutuhkan FOK per leg + rollback saat partial fill (pola yang mirip dengan code stat-arb bab 16).





