Membangun Trading Bot Polymarket: Dari Data ke ML
Latar Belakang
Polymarket adalah prediction market — platform di mana orang trading probabilitas suatu event terjadi atau tidak. Berbeda dari exchange crypto biasa, kamu tidak trading harga BTC secara langsung, melainkan keyakinan apakah suatu event akan terjadi. Harga share merepresentasikan probabilitas (0.00–1.00), collateral menggunakan USDC.e di Polygon, dan semua transaksi bersifat non-custodial.
Proyek ini mendokumentasikan perjalanan riset untuk membangun trading bot di crypto Up/Down 5-minute markets — market binary yang resolve setiap 5 menit berdasarkan apakah harga naik atau turun.
Fase 1 — Memahami Struktur Polymarket
Struktur Data
Event
└── Market (satu atau lebih)
├── Yes/Up Token → token_id[0] dari clobTokenIds
└── No/Down Token → token_id[1] dari clobTokenIdsSetiap market 5 menit memiliki format slug: {coin}-updown-5m-{unix_timestamp}, di mana timestamp adalah kelipatan 300 detik. Coin yang tersedia: BTC, ETH, SOL, XRP, DOGE, BNB, HYPE.
Resolusi via Chainlink
Temuan kritis di fase ini: Polymarket bukan menggunakan harga Binance atau spot market biasa untuk resolusi. Market resolve menggunakan Chainlink Data Streams ETH/USD — feed premium dengan latensi sub-second yang tidak bisa diakses publik secara gratis.
“This market will resolve to ‘Up’ if the Ethereum price at the end of the time range is greater than or equal to the price at the beginning of that range, according to Chainlink data stream ETH/USD.”
Ini menjadi temuan fundamental yang mempengaruhi seluruh pendekatan riset.
Fee Structure
Fee dihitung dengan formula: fee = C × 0.072 × p × (1 - p), di mana C adalah jumlah shares dan p adalah harga share. Fee maksimum di harga $0.50 (probabilitas 50-50) dan simetris ke kedua ekstrem. Break-even win rate setelah fee taker: ~54.6%.
Strategi maker (pasang order, menunggu diambil) bebas fee dan mendapat rebate 20% dari fee taker.
Fase 2 — Pengumpulan Data & Backtesting Awal
Dataset yang Dikumpulkan
- Polymarket windows: ~25,000–28,000 windows per coin (~90 hari), dengan outcome resolved (Up/Down)
- Binance 1m OHLCV: 2.6 juta candle per coin, ~5 tahun ke belakang
- Database: SQLite dengan tabel
windows(outcome Polymarket) danohlcv_1m(candle Binance)
Temuan: Korelasi Binance vs Polymarket
Pertanyaan kunci: seberapa besar agreement antara arah candle Binance dan hasil resolve Polymarket?
ETH: 77.73% agreement (25,832 windows)
BTC: 77.35% agreement (27,884 windows)
SOL: 77.18% agreement (25,826 windows)~77% agreement — cukup tinggi untuk dijadikan basis fitur, tapi ada 23% “noise” yang berasal dari perbedaan timing dan sumber harga (Chainlink vs Binance).
ETH Reversal Edge
Backtesting manual menemukan edge yang menarik di ETH:
| Kondisi | n | Win Rate | Signifikan vs Break-even? |
|---|---|---|---|
| Return 0.003~0.010 → bet Down | 107 | 66.4% | ✓ (p=0.009) |
| Return 0.004~0.010 → bet Down | 49 | 81.6% | ✓ (p=0.0001) |
| Return 0.005~0.010 → bet Down (SOL) | 27 | 77.8% | ✓ (p=0.011) |
Interpretasi: setelah spike naik signifikan dalam 1 menit, market cenderung revert — Chainlink yang lag dari Binance bisa menjadi mekanisme di balik fenomena ini.
Fase 3 — Investigasi Sumber Data
Validasi: Apakah Binance Bisa Jadi Proxy?
Untuk ETH reversal 0.003~0.010, win rate di Binance 5 tahun adalah 52.5% — jauh dari 66.4% di Polymarket. Ini mengkonfirmasi bahwa edge bukan dari price action Binance murni, melainkan dari sesuatu yang spesifik di Polymarket (kemungkinan besar Chainlink lag).
Binance Sweep: Semua Hipotesis A1-F5
Dilakukan sweep exhaustive 200+ hipotesis price action di 2.6 juta candle Binance (A: Momentum, B: Mean Reversion, C: Volatility, D: Time-of-Day, E: Kombinasi, F: Price Action). Tidak ada satu pun yang signifikan vs break-even 54.6% di Binance 5 tahun.
Kesimpulan: pola tidak ada secara fundamental di Binance — edge yang ada adalah spesifik Polymarket.
Fase 4 — Machine Learning
Feature Engineering
Dataset dibangun dari gabungan data Polymarket (outcome) dan Binance (fitur), dengan total 47 fitur:
Base features (23): prev_return, body_ratio, upper/lower wick, RSI-14, ATR-14, Bollinger Band width, volume ratio, streak, return percentiles, dll.
Extended features (24) yang ditambahkan:
- Time: minute_of_hour, session flags (Asia/London/NY), is_weekend
- Multi-candle: return_5m, return_15m, return_30m, return_1h
- Volatility: volatility_5m, volatility_1h
- Trend: trend_direction_5/10, candle_position, distance from high/low
- RSI multi-period: rsi_7, rsi_21, RSI divergence
- Volume: volume_trend_5, relative_volume_1h
- Polymarket serial: prev_outcome, streak_polymarket
Model yang Diuji
Semua model dengan setiap-5-menit wajib bet (coverage 100%) menghasilkan win rate 52–53% — tidak tembus break-even.
| Model | Win Rate | Signifikan? |
|---|---|---|
| Decision Tree | 52.75% | ✗ |
| Random Forest | 52.62% | ✗ |
| LightGBM | 52.93% | ✗ |
| SVM | 52.26% | ✗ |
| MLP (PyTorch) | 52.24% | ✗ |
| LSTM (PyTorch) | ~52% | ✗ |
Pretrain Binance → Finetune Polymarket
Karena ada 77% agreement Binance-Polymarket, dicoba transfer learning: pretrain MLP di 2.6 juta candle Binance (target: 5m direction), lalu finetune di 25k windows Polymarket.
| Mode | Win Rate |
|---|---|
| Freeze backbone + train head | 53.19% |
| Full finetune semua layer | 52.97% |
| Train dari scratch (baseline) | 52.55% |
Pretrain membantu sedikit, tapi masih jauh dari break-even.
Feature Selection: Forward, Backward, Exhaustive, Random Search
Dilakukan 4 metode feature selection (956 detik eksekusi):
- Forward selection: best di step 1 dengan
return_30msaja → 53.13% - Backward elimination: converge di 3 fitur → 52.56%
- Exhaustive subset (top 12 fitur, 4,095 kombinasi): max 52.81%
- Random search (500 trials): max 52.28%
Semua metode stuck di 52–53%. Masalah bukan di kombinasi fitur, tapi fitur tidak cukup prediktif.
Breakthrough: Confidence Threshold
Insight kunci: daripada memaksa model bet di setiap window, hanya bet kalau model yakin (probabilitas > threshold).
Model diubah dari predict() ke predict_proba(), lalu di-sweep berbagai threshold menggunakan ensemble 5 model LightGBM:
| Threshold | Coverage | Trades/hari | Win Rate | Signifikan? |
|---|---|---|---|---|
| 0.50 | 100% | 287 | 52.71% | ✗ |
| 0.54 | 26.7% | 76 | 55.19% | ✗ |
| 0.55 | 16.7% | 48 | 56.76% | ✗ |
| 0.56 | 9.4% | 27 | 61.13% | ✓ |
| 0.57 | 5.0% | 14 | 62.11% | ✓ |
| 0.58 | 2.3% | 6.5 | 58.86% | ✗ |
Sweet spot: threshold 0.56–0.57, dengan win rate 61–62% dan ~14–27 trades per hari.
Hasil & Kesimpulan
Apa yang Terbukti
- ETH memiliki edge di kondisi spike besar — terbukti baik dari rule-based maupun ML
- ML ensemble + confidence threshold bisa tembus break-even secara signifikan
- Fitur price action murni tidak cukup untuk prediksi setiap window
- Pretrain Binance membantu sedikit tapi bukan game-changer
- Kualitas fitur > kuantitas model — semua model stuck di angka yang sama dengan fitur yang sama
Perbandingan Pendekatan
| Pendekatan | Win Rate | Trades/hari | Signifikan? |
|---|---|---|---|
| ETH reversal rule-based | 66.4% | ~1 | ✓ |
| ML ensemble threshold 0.56 | 61.1% | ~27 | ✓ |
| ML ensemble threshold 0.57 | 62.1% | ~14 | ✓ |
| ML semua window (no threshold) | 52.9% | 288 | ✗ |
Next Steps: Setelah Data Chainlink Tersedia
Saat ini sedang dilakukan fetch Chainlink Price Feed historical dari Polygon via Alchemy RPC (web3.py), contract ETH/USD: 0xF9680D99D6C9589e2a93a78A04A279e509205945, disimpan ke SQLite.
Setelah data tersedia, rencana yang akan dilakukan:
X — Rekonstruksi fitur Chainlink lag:
Menghitung bn_vs_cl_diff — selisih antara harga Binance dan Chainlink pada saat yang sama. Kalau Binance sudah naik 0.5% tapi Chainlink belum update, itu adalah signal kuat bahwa Chainlink akan segera catch up dan resolve Up. Fitur ini berpotensi menjadi yang paling prediktif karena langsung memodelkan mekanisme edge yang sudah kita hipotesiskan.
Y — Rebuild dataset dengan Chainlink-based features: Mengganti fitur price action Binance dengan kombinasi fitur Binance + Chainlink. Diharapkan win rate model bisa naik signifikan — dari 62% menuju 65–70% — karena kita sekarang punya informasi yang lebih dekat dengan apa yang Polymarket gunakan untuk resolve.
Z — Walk-forward validation & live deployment: Setelah model dengan fitur Chainlink terbukti konsisten di semua walk-forward fold, langkah selanjutnya adalah:
- Setup wallet Polygon + USDC.e
- Paper trading 2–3 minggu untuk validasi out-of-sample
- Live trading dengan size kecil (10–20 shares per trade)
- Monitoring win rate live vs backtest, dengan hard limit max loss per hari
Semua kode tersedia … lihat di GitHub.