Research
Findings, with
the script attached.
Every hypothesis that was registered, the verdict it came back with, and the committed script that produces it. The nulls are published with the rest.
Brier gap, model − market · positive is worse
+0.0142
The interval excludes zero, only just: its low end is +0.0007.
95% interval 0.0007 to 0.0263.
How a number gets onto a page
Four layers. Each one can only use what the layer before it hands over.
Facts
Source rows as published. A fact may be corrected, and a correction arrives as a new row rather than an edit in place.
Features
Derived from the facts layer and from nothing else, so every feature can be rebuilt from the record that produced it.
Beliefs
Distributions, never scalars. A median is read off the distribution rather than fitted beside it.
Decisions
Immutable and timestamped, so what a model said at the time survives being wrong.
The four layers, reconciled with the market findings: coming once kalshi-board-and-structural-findings.md is written and the layer rules are reconciled with it.
What a colour means here
Signed figures (CLV, the model minus market bias) are the only ones drawn in green or red, because there the colour is the sign. Categorical series never take those colours: a green bar in a category chart would read as a positive number. That rule is enforced in the token layer, not left to review.
Every figure carries an as-of time, a sample count and a source. Where one of those is missing, the figure is not filled in: the section says in one line what it is waiting on, and Sources lists it.
Settled by evidence
Targets, rush attempts, receptions.
Negative binomial for counts, zero-inflated gamma for yardage. Overdispersion, right skew and non-trivial zero mass all confirmed on an unseen holdout.
Pinned against real box scores: a tackle made with an assist (def_tackles_with_assist) counts as a solo tackle in the official record.
A backfilled row carries the timestamp of the event, so a window on it deletes purchased history on arrival. Every time-based policy keys on when the row was written.
How this is computed
Anything here has a committed script behind it. A finding that cannot be re-run is a number someone remembers.
Not settled
Open questions, stated so they cannot quietly become assumptions.
2023 is no different from its price (−0.37pp, −1.59pp to +0.89pp); 2024 is overpriced (−2.68pp, −3.76pp to −1.56pp); 2025 is overpriced (−3.75pp, −5.01pp to −2.57pp). The file publishes no interval for the change between seasons, so none is stated.
Pinnacle is absent from historical US-region props, so “beat the sharp close” has no sharp to beat. The stand-in is a three-book de-vigged median covering about half of what settled.
Whether anything worth capturing happens between game end and settlement, sampled at 600 seconds. If it is near-zero the question closes.
The main line
The main line is one posted line per player, game and market: of the lines posted for that claim, the one whose de-vigged probability of the over was closest to 0.5 at the close. Where sportsbook closing prices exist (2023-2025, via The Odds API) they are used: the median de-vigged price across DraftKings, FanDuel and BetMGM, or across every book quoting when none of those three did, taken at the last snapshot at or before kickoff. Where no sportsbook price exists the exchange mid is used - Kalshi, else Polymarket - from the last quote in the hour before kickoff with both a bid and an ask; an exchange mid is already a probability and is not de-vigged. Sportsbook and exchange prices are never mixed within one game's ladder. Quarter lines (0.25, 0.75), which settle as two half bets, are not candidates. Ties go to the lower line. Every row carries the source and the capture time of the price that chose it. A push or a void (the player took no snap) is shown and is not counted as cleared or missed; a player who played and recorded nothing settles at 0, which is a miss on an over.
The execution map
Median quoted spread runs 1¢ to 63¢ across 5 series and 6 timing buckets.
Quoted spread and touch size
research/sweep/h3_lifecycle.py (brief 022) · generated Tue, Sep 15, 5:22 PM ETCross game lines 1-6h before kickoff; never cross a prop in-game.
| Series | >72h | 24-72h | 6-24h | 1-6h | 0-1h | in-game |
|---|---|---|---|---|---|---|
| KXNFLREC | 9¢ · — | 4¢ · — | 3¢ · — | 3¢ · 50 | 2¢ · — | 16¢ · 2 |
| KXNFLRSHATT | 6¢ · — | 13¢ · — | 10¢ · — | 9¢ · 3 | 9¢ · — | 63¢ · 1 |
| KXNFLSPREAD | 2¢ · — | 1¢ · — | 1¢ · — | 1¢ · 7,943 | 1¢ · — | 1¢ · 89 |
| KXNFLTOTAL | 2¢ · — | 1¢ · — | 1¢ · — | 1¢ · — | 1¢ · — | 1¢ · — |
| KXNFLGAME | 1¢ · — | 1¢ · — | 1¢ · — | 1¢ · — | 1¢ · — | 1¢ · — |
| Series | Ratio |
|---|---|
| CHAMP | 3.88 |
| WINSWEEK | 2.76 |
| KXNFLRSHATT | 2.51 |
| WINS | 2.13 |
| DIVISION | 1.18 |
| KXNFLREC | 1.05 |
| KXNFLTOTAL | 0.31 |
| KXNFLSPREAD | 0.30 |
| KXNFLGAME | 0.30 |
How this is computed
What it costs to trade, by how long before kickoff.