Prediction Calibration
prediction_calibrationREALIZED win rate by shown price and minutes elapsed for short-horizon crypto up/down markets, net of taker fee — read from our own settled-outcomes archive, not from live prices. Answers the one question no venue will: "a side shown at 82 with five minutes left, how often did it ACTUALLY win?" Returns a grid of (price bucket x minute elapsed) -> n, realized_win_rate_pp, mean_shown_price_pp, calibration_gap_pp (realized minus shown — zero means the book is calibrated), breakeven_win_rate_pp (the shown price plus the taker fee that was actually in force for that market), and net_edge_pp (realized minus breakeven, which is what a taker would have kept). WHY AN ARCHIVE EXISTS AT ALL: a settled 15-minute window is exactly what these venues stop serving. Measured 2026-10-22, a polymarket.com window drops out of the default market listing within minutes of closing (its trade tape and resolution stay retrievable by a closed-market lookup, which the collector now uses), and the other venues serve settled windows only briefly or thinly. So this tool reads a local archive collected window-by-window as they settle. THE THREE VENUES ARE NEVER POOLED. all three compare an END 60-second average with a START 60-second average, but on different feeds: polymarket.com on a Chainlink TWAP, polymarket-us and Kalshi on a CF Benchmarks BRTI simple average. The feeds disagree near the threshold (measured 2026-10-24 on btc: polymarket.com and Kalshi settled differently on 1.6% of windows both hold, polymarket-us and Kalshi on none), so venue:"all" returns one grid PER VENUE and venues_pooled is always false. EVERY RATE CARRIES ITS 95% INTERVAL, AND EVERY EDGE SAYS WHETHER IT SURVIVES IT. Each cell gives realized_win_rate_ci95_lo/hi_pp (Wilson, so it never reports an impossible win rate above 100), the same interval carried onto net_edge_ci95_lo/hi_pp, and net_edge_distinguishable_from_zero. READ THAT BOOLEAN BEFORE net_edge_pp: at these sample sizes most cells are false, meaning the interval straddles zero and a net_edge_pp of +4pp is NOT evidence of an edge. For scale, at a 90% win rate even n=300 gives a 95% half-width of ~3.4pp while net edges here run +2 to +4pp — so a comfortable-looking sample still cannot call a small edge real. verdict says it per cell in plain words, and the first note says how many cells survived. A THIN CELL WITHHOLDS ITS RATE ENTIRELY. Any bucket holding fewer than 30 settled windows reports status "thin" with realized_win_rate_pp and every interval null rather than printing a rate from a sample too small to mean anything — a 2-sample "100% win rate" is the most misleading thing this tool could say. ALWAYS READ coverage BEFORE THE GRID: it gives the first and last window held, windows_total vs windows_settled, every UTC day inside the span with no windows at all, and the longest run of consecutive missing windows. A grid over a store with a three-day hole looks entirely normal and is measuring a different population. mean_fill_price_pp and fill_vs_shown_pp are populated for polymarket.com only — it is the one venue of the three that publishes a trade tape for these markets, so it is the only place realized FILL can be compared with the shown price instead of assumed equal to it.
Example tool call
This call uses example arguments supplied in the tool’s input schema.
{
"id": 1,
"jsonrpc": "2.0",
"method": "tools/call",
"params": {
"arguments": {
"asset": "btc",
"venue": "polymarket",
"minute": 5,
"horizon": "15m"
},
"name": "prediction_calibration"
}
}Input Schema
| Name | Required | Description | Default |
|---|---|---|---|
| asset | No | btc (default) | eth | sol | xrp | bnb. Coverage differs by venue: polymarket and polymarket-us carry btc/eth/sol/xrp, Kalshi carries btc/eth/bnb. | |
| venue | No | polymarket | polymarket-us | kalshi | all (default polymarket). "all" returns one grid per venue, never a merged one. | |
| minute | No | Minutes elapsed since window open, 0-based. Omit for the full grid; pass 5 for the "five minutes in" row only, which is also the cheapest query. | |
| horizon | No | 15m (default). 5m | 1h | 1d are accepted but only 15m is collected today, so another value returns coverage.windows_total 0 rather than an error. | |
| bucket_pp | No | Price-bucket width in percentage points: 5 | 10 (default) | 20 | 25 | 50. Must divide 100, so the last bucket is never narrower than the rest. | |
| side_convention | No | "favorite" (default) folds each window onto whichever side was the favorite — the frame published claims about early favorites use. "yes" keeps the venue own YES/Up side. |