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:

  1. Deposita 25-50 $ come capitale smoke-test. Trattalo come tassa di studio; se lo perdi, la lezione è valsa la pena.
  2. Lancia il bot in modalità live per 5-10 trade con posizioni alla size minima (5 share).
  3. Verifica che ogni fill corrisponda alle aspettative paper entro 2c. Indaga ogni gap maggiore prima di continuare.
  4. Se 5-10 trade live combaciano con paper, deposita 200-500 $ e gira con posizioni di size normale.
  5. 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".

Domande frequenti

Cos'è il gate dei 30 trade?
La nostra regola interna di gate per passare da paper a live: almeno 30 trade paper chiusi, win rate >= 55% e PnL netto positivo al netto dello slippage. Mancare uno qualsiasi di questi significa restare paper. Abbiamo inventato questa regola dopo diversi tentativi prematuri di go-live che hanno spazzato via account nel 2025.
Perché 30 trade e non 100?
Potenza statistica. Con 30 trade, un win rate del 55% ha circa il 70% di probabilità di essere edge reale (non rumore). Con 100 trade, quella confidenza cresce al 90%+. Abbiamo scelto 30 come barra minima perché periodi paper più lunghi spesso inducono overfitting — i trader ritoccano la strategia troppo a lungo invece di testarla.
Posso saltare il paper trading se sono sicuro?
La sicurezza è esattamente il momento in cui non dovresti saltarlo. I bot che vanno meglio su Polymarket sono gestiti da persone che hanno sbagliato in passato. Il gate dei 30 trade esiste per catturare strategie che sembrano giuste ma non lo sono. La maggior parte delle nostre strategie ha fallito il paper all'inizio — quello è il valore.
I risultati paper combaciano con i risultati live?
Di solito sì per strategie lente (politica, meteo), no per quelle veloci (5-min crypto, microstruttura sportiva). Il gap è "il paper trading non paga slippage" — i fill reali sono peggiori del prezzo che vedevi. Scontiamo i ritorni paper del 30-50% prima di crederci per il live, specialmente per strategie veloci.
Come implemento un motore paper in Python?
Sottoscrivi il vero CLOB WebSocket per i mercati che tradi. Quando la strategia decide di "piazzare un ordine", loggalo in un file JSONL con il prezzo di fill ipotetico (current bid per buy, current ask per sell). Traccia le posizioni virtualmente. Marca a mercato contro il prezzo live. L'intero motore è ~200 righe di Python.
Quanto tempo dovrei fare paper trading prima di andare live?
Finché il gate dei 30 trade non è soddisfatto, o 2-4 settimane, il maggiore dei due. Se stai raggiungendo il gate troppo in fretta, stai facendo overfitting; rallenta e verifica che il win rate sia robusto a piccoli cambi di parametri. Se non riesci a raggiungere il gate dopo mesi, la strategia probabilmente non ha edge e dovresti chiuderla.