Prediction markets · what a price claims, and whether it was right

The prediction-markets work. Pup

A price is a forecast wearing a dollar sign. A market that says 62¢ is making exactly the kind of dated, checkable claim this site already grades models on — so the plan is to treat venues as forecasters, log what they said before the event, and score them on the same board as the models. That board already exists for NFL models on Receipts; nothing on the market side of it has been built.

No oracle lives here. Nothing in this section has established betting profitability, and nothing in it is advice. When market prices do land here they will be captured observations with a stated capture time — not closing lines. The site’s existing book-price surface already carries that limit and refuses to compute CLV from it; the same rule applies to anything added here.

Open markets, by money

The largest open binary markets on Polymarket right now. Price is the Yes side, read as a probability. Volume is lifetime, in dollars. Sort any column.

Loading live markets…

Source: gamma-api.polymarket.com, fetched client-side. 🤖 For machines

Did the price mean anything?

Take resolved markets. Look at what the price said some days before it resolved. Group those prices into buckets, and check how often the thing actually happened. A market that is telling the truth lands on the diagonal.

This runs in your browser and it is not instant. Each market needs a second request for its price history, so a pass fetches a few hundred URLs. Start small. Nothing is stored; refreshing re-runs it.
Nothing has been computed yet. Press Run the pass.
What this cannot tell you. The sample is the highest-volume resolved markets, which is not a random sample of anything — it skews politics and crypto. A market that resolved early, voided, or never traded near the lookback date is dropped, and dropped markets are counted and reported rather than hidden. One pass is a snapshot, not a study: the numbers will move between runs, and that movement is the honest measure of how little 60 markets tells you.

Is it politics, or is it everything?

The same markets as the calibration pass, split by what they are about. There is a live disagreement in the literature about which way prediction-market bias runs, and it may be that both sides are right about different subjects.

The claim being checked

One camp (Le, arXiv:2602.19520, Aug 2026 — 64.7M Kalshi trades, cross-checked on 288.7M Polymarket trades) finds politics badly miscalibrated and everything else nearly clean, with prices compressed toward 50% — meaning long shots are underpriced.

The other camp is the older, larger literature — and ElectionBettingOdds’ own 807-prediction record, where the 0–20% bucket predicted 5.4% and delivered 1.7%. That is the textbook favourite–longshot bias, and it points the opposite way: long shots overpriced.

Both cannot be right about the same markets. Different venues, eras and subjects are the obvious suspects. This panel is the cheapest honest test we can run.

Run the pass on the Calibration sheet first — this panel reuses those markets rather than fetching them again.
Expect this panel to say “does not separate them” for a long time — and that is the correct answer, not a broken tool. We tested the slope estimator against synthetic data with a known answer: it recovers the true slope to within ±0.05 at 4,000 markets, but at 150 markets the 95% interval is already ±0.29, and at 25 it is ±0.67. Telling a politics slope of 1.4 apart from a rest-of-market 1.0 needs intervals under about ±0.2 each — roughly 300 markets per subject. A single 60-market pass cannot get there. Run 240 and read the intervals, not the point estimates.
Read the sample size before the slope. Splitting a few hundred markets four ways leaves some buckets with a couple of dozen, and a slope fitted on 25 markets is nearly meaningless. Any bucket under 25 gets no slope at all rather than a decorative one. Subjects come from Polymarket’s own tags, matched to buckets by a fixed keyword list — a market tagged both “Politics” and “Crypto” lands in whichever comes first in that list, and markets matching nothing land in Other / untagged, which is therefore a grab bag and not a clean category. Note that the headline compares politics against all non-political markets — a larger set than the Other / untagged row.

Method, and what is missing

Written before the tools were interesting enough to be worth defending.

What is live. Two things, both computed in your browser from Polymarket’s public API at the moment you load the page: the open-market board, and the calibration pass. Neither has a cached copy on this site, so neither can go stale — but neither is reproducible either, because you and I will get slightly different numbers. That is the trade we made to ship something true on day one instead of something frozen.

What is not here yet, and why.

  • Kalshi. Their API sends no CORS header, so a browser cannot read it directly. It needs a proxy through our Worker. Until that exists, every number on this page is Polymarket only, and this page should not be read as a statement about prediction markets in general.
  • The domain split — politics vs. sports vs. crypto vs. weather. This is the interesting version of the calibration chart and it is the next thing built. There is a live disagreement in the literature about which direction the bias runs, and it looks resolvable with exactly the data this page already fetches.
  • Cross-venue basis, parlay markup, volume-vs-accuracy. Specced, not built.

The calculators already on this site — devig, expected value, hedging, odds conversion — are prediction-market tools that never had a live feed behind them. They are here. Connecting them to this page is a build, not a research question.

Tier: Pup. Live and useful, not yet validated. Nothing on this page has been checked against an independent implementation, and the calibration pass in particular has never been run against a known-answer test set. Treat every number as a first draft.

This section, for machines

One card per row in /data/surfaces.json carrying domain: "markets". The count is the file’s count, not a number typed into this page. Every tool here computes in your browser from a third party’s public API, so none publishes a machine surface of its own — each card says exactly that, and the panels above name the upstream every number comes from.

reading /data/surfaces.json…
Reading the surfaces map…