Skip to content
Membangun Trading Bot Polymarket: Dari Data ke ML

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 clobTokenIds

Setiap 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) dan ohlcv_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_30m saja → 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

  1. ETH memiliki edge di kondisi spike besar — terbukti baik dari rule-based maupun ML
  2. ML ensemble + confidence threshold bisa tembus break-even secara signifikan
  3. Fitur price action murni tidak cukup untuk prediksi setiap window
  4. Pretrain Binance membantu sedikit tapi bukan game-changer
  5. 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:

  1. Setup wallet Polygon + USDC.e
  2. Paper trading 2–3 minggu untuk validasi out-of-sample
  3. Live trading dengan size kecil (10–20 shares per trade)
  4. Monitoring win rate live vs backtest, dengan hard limit max loss per hari

Semua kode tersedia … lihat di GitHub.