← Back to blog

Our Polymarket Trading Results: An Early Snapshot, and a Correction

By ZenHodl. Dataset documentation, research and model evaluations are linked in the article. A separate filtered ledger of bot-attributed trades, including losses and its admission rules, is public at /results.

Correction — 6 August 2026

This post published a win rate that does not reconcile with our trade ledger, presented 100% win rates on four- and six-trade samples, called a 91-trade result statistically significant, and claimed every trade is verifiable on-chain. All four claims were wrong. They are corrected here rather than deleted.

Reconciled against our canonical trade ledger, live trades only (shadow mode and backfill excluded), using the same method that produces the figures on /results:

claimed here actual, same date (2026-04-13) actual, 6 Aug 2026 (frozen)
resolved live trades 335 398 2,214
win rate 55.9% 44.7% 45.9%
cumulative P&L not stated +$20.06 −$217.75

The "actual, 6 Aug 2026" column is frozen at the date this correction was written. Current figures update continuously on /results and the honest CLV aggregate is at /clv.

Same-date figures count live trades entered on or before 13 April 2026 that have since resolved — the same basis as the reconciliation on our strategy post.

The headline win rate is not arithmetically possible. 55.9% of 335 trades is 187.3 wins. 187 wins is 55.8%; 188 is 56.1%. No whole number of wins out of 335 produces 55.9%. Separately, the sport rows below imply 196 wins, which is 58.5%. Three numbers, none of them the one we put in the headline.

The entry-price and hour analyses describe more trades than the sample contains. The four entry-range rows sum to 730 trades, and the "toss-ups are a trap" section adds another 212 — 942 trades attributed to a 335-trade dataset. We cannot establish what window those tables were computed over, so they are retracted in place below rather than quietly removed.

The "P&L" column is per-share cents, not dollars. Summing per-share cents across positions of different sizes is not a profit figure. Dollar P&L is size-weighted (cents per share × shares ÷ 100) and can differ in both magnitude and sign. Dollar P&L is on /results.

The 100% rows are n=6 and n=4. At those sample sizes a perfect record is noise, not evidence. We now publish nothing as a conclusion below n≈30.

MLB at 91 trades was never "statistically significant". That sentence has been removed. MLB now has 574 resolved live trades and −$37.22.

"Verifiable on-chain via PolygonScan" was wrong. About 60% of resolved trades carry an execution identifier and 0.5% a direct on-chain transaction hash. Our trading wallet is public, but it is a separate evidence source, not a one-to-one mirror of the ledger.

The CS2 calibration figures (ECE 0.019 → 0.008) have been removed. We cannot reproduce them, and they sit below the real held-out calibration error of every sport we measure (1.4–9.2%). Any near-zero ECE we have published was an in-sample illusion and is retracted.

Where the account actually stands, as of 6 August 2026: 2,214 resolved live trades, 45.9% win rate, −$217.75 cumulative, mean −$0.098 per trade, −1.87 cents mean settlement CLV, beating the close 47.6% of the time. The highest cumulative P&L in the account's history is +$38.34. April 2026 sat near that peak: this post is a snapshot of the best fortnight the account ever had, and we presented it as evidence of durable edge. It was not.

The architecture and method sections are left intact — they describe the system accurately and are the useful part of this post. Every performance claim in it should be read as a system that has not been profitable. The live ledger, losses included, is at /results; the honest aggregate is at /clv.

Related corrections: the 78-pp CLV gap retraction, the whitepaper's clustered-significance correction, and the strategy post's P&L retraction.

We ran automated prediction bots on Polymarket for several weeks and published this early snapshot of 335 trades across 10 sports. Read the correction above first: the numbers below are a stale and unrepresentative window, and several of them were wrong when written.

Overall Numbers

Metric As published Corrected
Total live trades 335 398 resolved live trades
Win rate 55.9% 44.7%
Cumulative P&L not stated +$20.06
Sports covered 10 10
Bots running 5 (moneyline, tennis, lol, cs2, soccer) 5

Today the same ledger has kept growing — the snapshot above is frozen at 6 August 2026, and the current resolved-trade count, win rate, and cumulative P&L are on /results. Most sports now trade in shadow mode (paper only) while we collect evidence: only LoL, soccer, WNBA and WTA have taken a live fill in the last 30 days.

Trades are executed on Polymarket and our trading wallet is public, but roughly 60% of resolved trades carry an execution identifier and only 0.5% a direct on-chain transaction hash. The wallet is a separate evidence source, not a one-to-one mirror of the ledger.

Sport-by-Sport Breakdown

Here's how each sport looked in that window. Two things to hold in mind: the last two columns are per-share cents, not dollars, so they cannot be compared across sports of different position sizes; and cohorts under 30 trades are shown as raw win counts, because a percentage there is not an estimate of anything.

Sport Trades Win rate (raw wins under n=30) P&L (cents/share) Avg per trade (cents/share)
MLB 91 69.2% +736c +8.1c
ATP Tennis 27 17 of 27 +426c +15.8c
LoL 34 52.9% +336c +9.9c
NHL 62 64.5% +305c +4.9c
Tennis 6 6 of 6 +210c +35.0c
NCAAMB 4 4 of 4 +109c +27.3c
NCAAWB 4 3 of 4 +80c +20.0c
Soccer 8 4 of 8 +1c +0.1c
NBA 14 6 of 14 -252c -18.0c
CS2 85 41.2% -507c -6.0c

Retracted: this table originally showed 100% win rates for Tennis (n=6) and NCAAMB (n=4). Publishing a perfect record on four or six trades implies an edge that the sample cannot support, and we should not have done it. The rows are kept as raw counts so the retraction is visible.

Retracted: this section originally read "MLB's 69.2% win rate across 91 trades is our most statistically significant result — the sample size is large enough to be confident this isn't luck." That was false. 91 trades cannot distinguish a real edge from variance at this effect size, and the outcome settled it: MLB now has 574 resolved live trades and −$37.22 cumulative.

Underperformers: CS2 and NBA. CS2 was losing money due to model overconfidence — we recently recalibrated and tightened the entry criteria. NBA's small sample (14 trades) makes it hard to draw conclusions. Both remain negative today: CS2 −$42.38 over 378 live trades, NBA −$33.90 over 43.

What We Learned

1. Calibration matters more than accuracy

Our CS2 model had strong predictive accuracy but poor calibration — when it said 70% probability, the observed win rate was materially lower. This caused the bot to systematically overpay for positions, and we recalibrated it with isotonic regression.

Corrected: this paragraph originally quoted a calibration error falling from 0.019 to 0.008. We cannot reproduce those figures, and 0.008 is below the real held-out calibration error of every sport we measure (1.4–9.2%), so they have been removed rather than restated. Recalibration reduced the overconfidence; it did not make the model near-perfect.

Lesson: A well-calibrated 60% accurate model makes more money than a poorly-calibrated 75% accurate model. Read more about calibration →

2. Entry price range is everything — RETRACTED

Entry Range Trades Win Rate P&L
15-30c (underdogs) 77 20.8% -285c
30-45c (slight underdogs) 188 36.7% +46c
55-70c (slight favorites) 296 63.5% +624c
70-85c (favorites) 169 73.4% +53c

Retracted. These four rows sum to 730 trades, in a post whose sample is 335 trades. Adding the 212 trades claimed in the next section brings the total to 942. The table cannot describe this dataset, we cannot establish what it does describe, and the conclusion drawn from it — that slight favourites are the sweet spot — is therefore unsupported. It is left in place so the retraction is visible, not because the numbers should be used.

3. Toss-ups (45-55c) are a trap — RETRACTED

The 45-55c entry range — markets where neither team has a clear edge — was reported here as 212 trades at 43.4% WR and -1,102c P&L. That figure belongs to the same unreconcilable table as the section above and is retracted. The underlying design decision — that our models did not show enough edge in genuinely uncertain games to cover the spread, so we skip that range — still stands; the evidence quoted for it does not.

4. Tennis is our most profitable per-trade sport — RETRACTED

This section claimed ATP tennis produced our best risk-adjusted returns on the strength of +15.8c average P&L per trade across 27 trades. 27 trades is not a basis for that claim, and the claim did not survive. ATP is now the worst sport in the ledger: −$62.56 over 301 resolved live trades. WTA is −$30.08 over 399. All tennis has since been moved to shadow mode and trades no live money.

The method description is accurate and unchanged: the analytical model uses player-specific serve rates by surface (hard/clay/grass) and Elo ratings to generate fair probabilities.

5. Time of day matters — RETRACTED

UTC Hour Trades Win Rate P&L
03:00 19 89.5% +543c
23:00 31 74.2% +410c
19:00 17 70.6% +197c
22:00 12 16.7% -461c

Retracted. Every cell here is 12 to 31 trades. Picking the four most extreme hours out of 24 and reading a pattern into an 89.5%-versus-16.7% spread at n=19 and n=12 is selecting on noise. We have no evidence that hour of day predicts our results.

The Technology Stack

Every prediction goes through:

  1. XGBoost win probability model (trained on 40,000+ games per sport)
  2. Isotonic calibration (held-out ECE 1.4–9.2% by sport across calibrated models)
  3. Live injury overlays (58 NBA players, 44 NHL skaters tracked via ESPN)
  4. Dynamic position sizing (automatically sizes up on hot sports, sizes down on cold ones)
  5. Meta-model filter (ML classifier that predicts which edges are real vs noise; the "filters 28% of losing trades" figure originally quoted here is not reproducible and has been removed)
  6. Rolling recalibration (auto-corrects probability estimates every 25 resolved trades)

See the Live Data

Our results page updates every 60 seconds with new trades, including every loss. Each trade is logged with entry price, fair probability, edge and P&L. About 60% carry an execution identifier and 0.5% a direct on-chain transaction hash, so treat the public wallet as corroborating evidence rather than a line-by-line proof of the ledger.

The honest aggregate — mean settlement CLV and how often we beat the close — is at /clv. As of 6 August 2026 it read −1.87 cents, beating the close 47.6% of the time; the exchange-corrected figure updates live on that page.

Want to build something similar? Our prediction API provides the same fair probabilities our bots use — calibrated, real-time, covering 8 sports. Start a 7-day trial →

Or learn from scratch with our 6-module bot-building course.

Related reading

Get ZenHodl Weekly

Dataset releases, research notes, and public results, including corrections.

Research and dataset updates from ZenHodl.

Want the data behind this post?

Historical sports prediction-market datasets with measured coverage, documented schemas, and disclosed gaps.