Polymarket Bot Tutorial · Sura ya 29 kati ya 32
Jenga Polymarket paper trading engine kabla ya kwenda live: simulate orders dhidi ya real prices, track P&L, enforce 30-trade gate (>=55% win rate, +PnL) kabla ya live capital yoyote, na code skeleton.
Sura hii inafunika nini
Paper trading ni non-negotiable step kati ya strategy idea na live deployment. Sura hii ni simple paper engine ambayo imegateed kila live bot tuliyoship - chini ya mistari 200 ya Python, inatrack kila trade katika JSONL diary, inaapply fees/slippage sawa na live path.
- Kwa nini paper kabla live (daima)
- 30-trade gate (verified +55% WR + positive PnL)
- Kujenga simple paper engine
- Kutrack paper diary pamoja na live diary
- Wakati paper inadiverge kutoka live (na kwa nini)
- Graduating kwenda live: small first deposit
- Code: minimal paper engine
Kwa nini paper kabla live (daima)
30-trade paper gate ni single discipline inayotenga 7.6% ya profitable Polymarket traders kutoka 84.1% ambao wanapoteza. Builders wengi wanairuka na wanalipa tuition. Honest reason inafanya kazi: paper trading inafichua true win rate ya strategy juu ya samples za kutosha kutofautisha signal kutoka luck.
Kuruka paper kunacost zaidi kuliko kinachofidia. Strategy inayoonekana profitable katika backtest lakini actually ni coin flip itaburn $200-500 ya live capital kabla ya kuzalisha 30-sample size ya live data. Kupaper-trade trades 30 sawa kunacost $0.
Paper engine haitahitaji kuwa sophisticated. Lazima iwe honest - same fees, same slippage, same fill latency kama live path. Simpler ni better, kwa sababu kitu chochote optional kinakatwa na bot inaship live mapema kuliko inavyopaswa.
30-trade gate (verified +55% WR + positive PnL)
Gate ni binary: 30 closed paper trades, written-in-advance success criteria (typically WR ≥ 55% kwenye positive-EV strategy), au hakuna live deployment.
30 ni minimum sample size ambapo 95% confidence interval kwenye true win rate ni narrow enough kutofautisha signal kutoka noise. Chini ya 30, 60% observed rate inaweza correspond na true rate ya 45-75%. Kwa 30+, interval inanarrow hadi ~50-70% - bado wide, lakini ya kutosha kurule out "strategy ni coin flip."
Success criteria lazima zisetwe KABLA paper run inanza. Kuzisetting baada inazalisha post-hoc rationalization (utapata njia ya kuinterpret trades 30 yoyote kama "good enough").
Kujenga simple paper engine
Paper engine essentially ni live trading code na order-placement function imewekwa na simulated fill. Simulation:
- Soma live order book: call sawa na live bot ingelifanya.
- Simulate fill: ikiwa unanunua kwenye FOK na price ≥ best ask, fill order kwa volume-weighted average ya asks zilizoconsumedwa; record fill katika paper diary.
- Apply fees: subtract fees sawa ambazo live path ingelipa.
- Track inventory: dumisha parallel paper-balance na paper-positions dictionary.
Whole engine inafit katika mistari 100-200 ya Python. Key discipline: kila assumption live path inafanya (fill rate, latency, fee) lazima ireproducedwe katika paper, hata kama slightly worse kuliko reality - paper inapaswa kuwa floor, sio ceiling.
Kutrack paper diary pamoja na live diary
Paper trading run inazalisha JSONL diary indistinguishable katika structure kutoka live diary bot itakayoandika baadaye. Fields sawa: timestamp, action, market_slug, side, size, price, expected_fill_price, simulated_pnl_at_exit.
Sababu mbili kutumia format sawa. Kwanza, analysis tools zinazosoma live trades (PnL reports, win-rate calculators) zinafanya kazi kwenye paper bila modification. Pili, kulinganisha paper na live baadaye inakamata divergences zinazoindicate bugs.
Production tip: fanya paper engine iandike kwa per_trade_paper.jsonl katika directory sawa na live per_trade.jsonl. Single command inalinganisha both: diff -y <(jq -r .market_slug per_trade.jsonl) <(jq -r .market_slug per_trade_paper.jsonl).
Wakati paper inadiverge kutoka live (na kwa nini)
Inevitable divergences kati ya paper na live. Tatu za kawaida.
- Slippage: paper inafill kwenye ask snapshot; live inawalk book na inaweza kufill 1-2c worse kwenye thin markets. Solution: simulate slippage katika paper kwa kuongeza per-trade penalty equal kwa half ya spread.
- Fill latency: paper inafill instantly; live inachukua 200-500ms ambapo price inaweza kuhama. Solution: simulate kwa kusubiri na ku-re-read book kabla ya "kufill" katika paper.
- Adverse selection: paper inadhani unapata best ask; live inashindana na bots wengine ambao wanaweza tayari kuwa wamelift ask hiyo. Solution: harder kusimulate; honest disclosure kwako mwenyewe kwamba paper inaoverestimates.
Wakati paper inasema +5%/month na live inaendesha kwa -2%/month, gap kawaida ni moja ya hizi. Audit moja kwa moja badala ya kudhani strategy yenyewe ilikuwa wrong.
Graduating kwenda live: small first deposit
Paper inapita trades 30. Live deployment plan:
- Deposit $25-50 kama smoke-test capital. Treat kama tuition; ukipoteza, lesson ilikuwa worth it.
- Endesha bot katika live mode kwa trades 5-10 na positions kwenye minimum size (shares 5).
- Hakiki kila fill inamatch paper expectations ndani ya 2c. Investigate any larger gap kabla ya kuendelea.
- Ikiwa trades 5-10 za live zinamatch paper, deposit $200-500 na endesha normal-size positions.
- Ikiwa hazimatch, halt, debug, fix, anza tena kutoka step 1.
Most common live-paper gap kwenye first deployment ni missing fee au slippage misestimate. Kuzifix ni rahisi; discipline ni kukamata gap kabla ya kuscale capital.
Code: minimal paper engine
Reference: simple paper engine inayosoma live book + simulates FOK fill.
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}
Production additions: paper sell function (mirror ya buy), paper GTC simulation (post kwenye book kwa price, simulate fill wakati mid inafikia price), reconciliation kati ya paper diary na "would-have-been" live diary.





