Polymarket Bot Tutorial · Capitolo 29 di 32
Costruisci un motore di paper trading per Polymarket prima di andare live: simula gli ordini contro i prezzi reali, traccia P&L, applica la regola dei 30 trade (>=55% di win rate, PnL positivo) prima di impegnare capitale reale, con scheletro di codice.
Cosa copre questo capitolo
Il paper trading è il passaggio non negoziabile tra l'idea di strategia e il deployment live. Questo capitolo presenta il semplice motore paper che ha fatto da gate a ogni bot live che abbiamo pubblicato — meno di 200 righe di Python, traccia ogni trade in un diario JSONL, applica gli stessi fee e slippage del percorso live.
Questo è il capitolo 29 della nostra serie in 32 parti sulla costruzione di un trading bot per Polymarket. Trattiamo l'argomento in profondità nelle sezioni qui sotto. Il corpo di ogni sezione viene scritto e rilasciato capitolo dopo capitolo; le risposte FAQ e i riferimenti sono già completi e riflettono l'esperienza di produzione del nostro trader interno.
- Perché paper prima di live (sempre)
- Il gate dei 30 trade (verificato +55% WR + PnL positivo)
- Costruire un motore paper semplice
- Tracciare il diario paper accanto al diario live
- Quando paper diverge da live (e perché)
- Passare al live: primo deposito piccolo
- Codice: motore paper minimale
Perché paper prima di live (sempre)
Il gate paper dei 30 trade è la singola disciplina che separa il 7,6% di trader Polymarket profittevoli dall'84,1% che perde. La maggior parte dei builder lo salta e paga il prezzo della scuola. La ragione onesta per cui funziona: il paper trading rivela il vero win rate della strategia su un campione abbastanza ampio da distinguere il segnale dalla fortuna.
Saltare il paper costa più di quanto risparmi. Una strategia che sembra profittevole in backtest ma in realtà è un lancio di moneta brucerà 200-500 $ di capitale live prima di produrre un campione di 30 trade reali. Fare paper trading degli stessi 30 trade costa 0 $.
Il motore paper non deve essere sofisticato. Deve essere onesto — stessi fee, stesso slippage, stessa latenza di fill del percorso live. Più semplice è, meglio è, perché tutto ciò che è opzionale viene tagliato e il bot va live prima del dovuto.
Il gate dei 30 trade (verificato +55% WR + PnL positivo)
Il gate è binario: 30 trade paper chiusi, criteri di successo scritti in anticipo (tipicamente WR ≥ 55% su una strategia a EV positivo), oppure nessun deployment live.
30 è la dimensione minima del campione in cui l'intervallo di confidenza al 95% sul vero win rate è abbastanza stretto da distinguere segnale da rumore. Sotto 30, un tasso osservato del 60% potrebbe corrispondere a un tasso reale tra 45 e 75%. A 30+, l'intervallo si restringe a ~50-70% — ancora ampio, ma sufficiente a escludere "la strategia è un lancio di moneta".
I criteri di successo vanno fissati PRIMA che il paper run inizi. Fissarli dopo produce razionalizzazione a posteriori (troverai un modo per interpretare qualsiasi insieme di 30 trade come "abbastanza buono").
Costruire un motore paper semplice
Il motore paper è essenzialmente il codice di trading live con la funzione di piazzamento ordine sostituita da un fill simulato. La simulazione:
- Leggere il book live: stessa chiamata che farebbe il bot live.
- Simulare il fill: se compri in FOK con prezzo ≥ best ask, riempi l'ordine alla media ponderata per volume degli ask consumati; registra il fill nel diario paper.
- Applicare i fee: sottrai gli stessi fee che pagherebbe il percorso live.
- Tracciare l'inventario: mantieni un dizionario paper-balance e paper-positions parallelo.
L'intero motore sta in 100-200 righe di Python. La disciplina chiave: ogni assunzione del percorso live (fill rate, latenza, fee) deve essere riprodotta in paper, anche se leggermente peggio della realtà — il paper deve essere il pavimento, non il soffitto.
Tracciare il diario paper accanto al diario live
Il paper run produce un diario JSONL indistinguibile per struttura dal diario live che il bot scriverà più avanti. Stessi campi: timestamp, action, market_slug, side, size, price, expected_fill_price, simulated_pnl_at_exit.
Due ragioni per usare lo stesso formato. Primo, gli strumenti di analisi che leggono i trade live (report PnL, calcolatori di win rate) funzionano su paper senza modifiche. Secondo, confrontare paper con live più avanti cattura divergenze che indicano bug.
Consiglio di produzione: fai scrivere al motore paper in per_trade_paper.jsonl nella stessa directory di per_trade.jsonl live. Un singolo comando confronta entrambi: diff -y <(jq -r .market_slug per_trade.jsonl) <(jq -r .market_slug per_trade_paper.jsonl).
Quando paper diverge da live (e perché)
Divergenze inevitabili tra paper e live. Tre comuni.
- Slippage: paper riempie allo snapshot dell'ask; live cammina sul book e può riempire 1-2c peggio su mercati sottili. Soluzione: simula slippage in paper aggiungendo per ogni trade una penalità pari a metà spread.
- Latenza di fill: paper riempie istantaneamente; live impiega 200-500ms durante i quali il prezzo può muoversi. Soluzione: simula aspettando e rileggendo il book prima di "riempire" in paper.
- Selezione avversa: paper assume che ottieni il best ask; live compete con altri bot che possono aver già sollevato quell'ask. Soluzione: più difficile da simulare; disclosure onesta a te stesso che paper sovrastima.
Quando paper dice +5%/mese e live gira a -2%/mese, il gap è di solito uno di questi. Esaminali uno per uno invece di assumere che la strategia stessa fosse sbagliata.
Passare al live: primo deposito piccolo
Paper supera i 30 trade. Piano di deployment live:
- Deposita 25-50 $ come capitale smoke-test. Trattalo come tassa di studio; se lo perdi, la lezione è valsa la pena.
- Lancia il bot in modalità live per 5-10 trade con posizioni alla size minima (5 share).
- Verifica che ogni fill corrisponda alle aspettative paper entro 2c. Indaga ogni gap maggiore prima di continuare.
- Se 5-10 trade live combaciano con paper, deposita 200-500 $ e gira con posizioni di size normale.
- Se non combaciano, ferma, debug, fix, riparti dal punto 1.
Il gap live-paper più comune al primo deployment è un fee mancante o una stima sbagliata di slippage. Risolverli è semplice; la disciplina sta nel catturare il gap prima di scalare il capitale.
Codice: motore paper minimale
Riferimento: motore paper semplice che legge il book live + simula fill FOK.
import json, time
PAPER_BAL = 10_000.0 # USD starting
positions = {} # token_id -> shares
def paper_fok_buy(token_id, max_price, size):
book = fetch_book(token_id)
# Walk asks, fill what we can within max_price
filled = 0; cost = 0
for level in book.asks:
px = float(level["price"])
if px > max_price: break
avail = float(level["size"])
take = min(avail, size - filled)
filled += take
cost += take * px
if filled >= size: break
if filled < size:
return {"status":"rejected","filled":0} # FOK semantics
global PAPER_BAL
PAPER_BAL -= cost
positions[token_id] = positions.get(token_id, 0) + filled
log_paper({"ts": int(time.time()), "action":"buy",
"token": token_id, "size": filled, "price": cost/filled})
return {"status":"matched","filled":filled,"cost":cost}
Aggiunte di produzione: funzione paper sell (specchio del buy), simulazione paper GTC (post sul book a prezzo, simula fill quando il mid raggiunge il prezzo), riconciliazione tra diario paper e diario live "would-have-been".











