← Back to blog

First Insight: What's In the $9 MLB Matched Book Tryout

By the ZenHodl team — we run the trading bots this blog writes about, and the qualifying live-position record, including losses, is public with its admission rules at /results.

We sell a $9, two-day tryout of the MLB Matched Book archive — 28 dated games across 2026-06-21 and 2026-06-22, Polymarket and Kalshi quotes sampled together. We wrote a script that computes every number below, and a second script that checks this post against the first script's output line by line. Nothing here is a trading signal, an entry/exit rule, or a backtest of any strategy — it's a description of what's actually in the file you'd be paying for.

Download the exact script we ran: first_insight_mlb_matched_tryout.py. Point it at your own copy of the ZIP and you'll get the same output.

What's actually in the ZIP

Columns: ts, date, game, team, poly_bid, poly_ask, poly_mid, kalshi_yes_bid, kalshi_yes_ask, kalshi_mid, xvenue_spread, winner, won, settled. There is no trade-print table, no order-book depth, and no score-synced field in this product.

Insight 1 — cross-venue quote spread (Polymarket vs. Kalshi)

xvenue_spread = poly_mid - kalshi_mid, computed on every one of the 25,914 rows:

Stat Value
Mean -0.0011 (Polymarket mid runs about a tenth of a cent below Kalshi mid, on average)
Median 0.0000
5th / 95th percentile -0.0155 / +0.0150
Mean absolute spread 0.0067 (≈0.67c on a $1 contract)

Splitting each game's window into four equal time buckets and averaging the absolute spread:

Window quartile Mean |spread|
Q1 (earliest samples) 0.46c
Q4 (latest samples) 0.76c

Read: the two venues track each other closely — median spread is exactly zero, and 90% of rows sit within about ±1.5 cents. But the gap doesn't shrink toward the end of the window the way you'd expect if it were converging on a settled price; it's mildly wider late (0.76c vs 0.46c). That's consistent with the window extending well past game finality — once a game is decided, occasional stale or thin late-window quotes on one venue can widen the gap again. This describes what two captured quote streams did on 28 games; it's not a signal, and 28 games says nothing about any other day.

Data quality — manifest, hashes, book integrity, cadence

Check Result
Rows match manifest yes (25,914 = 25,914)
Crossed Polymarket / Kalshi book 0 rows each
Exact duplicate rows 0
Median inter-sample gap 30.6 seconds
Games with a gap over 300s 15 of 28
Largest single gap 11.66 hours

The file is internally consistent with its own manifest, and the two book-sanity checks (crossed quotes, duplicates) come back completely clean. But more than half the games have at least one gap over 5 minutes. Pulling each game's own largest-gap boundary shows the 11.66-hour gap is not per-game at all — it's a single shared, day-wide capture-pipeline gap from 2026-06-21T01:31:55Z to 2026-06-21T13:10:44Z, identical to the second across 14 of 15 of that day's games. 2026-06-22 has zero gaps over 300s. This looks like a one-off capture outage on the tryout's first day, not routine per-game pregame quietness — check the shipped per_game_cadence.csv for your exact game before relying on continuous coverage.

Settlement-label check — the last row is post-game, not a prediction

Read this caveat first. The capture window for each dated game runs from 00:00 UTC through just before 12:00 UTC the next day — well past any MLB game's actual final out. So for settled games, the last captured row is almost always sampled after the game ended, when the market has already collapsed to near 0 or near 1. Checking "does the last row's mid agree with the won label" is a data-quality / label-integrity check, not a prediction — a model that "predicts" the winner from a post-result quote is not measuring skill, it's measuring that markets converge to the truth once the truth is known. This is the same near-terminal-price tautology behind our retracted CLV whitepaper; see that history if you want the longer version.

With that read in mind: taking the last-captured row per settled game (26 games), the recorded won label agrees with which side of 0.50 the quote sat on 100.0% of the time on both poly_mid and kalshi_mid — a check on the data, not a forecast of anything.

What we are not claiming

How this guide was checked

Every number above was produced by first_insight_mlb_matched_tryout.py running against a clean, freshly-extracted copy of the ZIP, then verified with a second script that asserts every figure appears verbatim in this text.

Try it yourself: download the script, then get the $9 two-day tryout.

As always: this is research and backtest data, not a trading signal.

Related reading

Get ZenHodl Weekly

One weekly email with live results, one model insight, and product updates.

Tuesday mornings. No spam.

Want the data behind this post?

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

Join the community

Discuss strategies, share results, get help.

Join Discord