New to these reports? Start here
  • Dotted-underlined words have a plain-English definition — hover or tap them. Every term is also on the glossary page.
  • "Null" means we found nothing, not that something broke. Most reports here are negative results, on purpose — knowing an idea doesn't work is the point.
  • Two questions get asked separately. First, is the effect real? Second, is it already priced into the betting odds? An effect can be completely real and still useless to bet on.
  • A "calibration" row is a self-check. It runs the same method on something already known to be true. If that fails, the whole report is unreliable — so it's reported alongside the findings.
  • If a confidence interval includes zero, the real effect might be nothing at all, so no claim gets made.

Kalshi in-game NFL moneylines: overreaction and model vs market (2026-10-31)

Answer: no edge. Kalshi's in-game price is as accurate as nflverse's win-probability model. It doesn't overreact to big plays by enough to pay after fees and spread.

Data

  • Prices: Kalshi KXNFLGAME home-team markets with 1-minute yes bid/ask, from 20 minutes before kickoff to settlement. That's 385 usable games: 2025 regular season and playoffs (from the /historical archive) plus 2026 weeks 1–8 (live endpoint). Free, no key. Median spread 1¢.
  • Plays: nflverse play-by-play 2025–26 with each play's wall-clock start time (time_of_day) and vegas_home_wp. The win-probability model was trained on older seasons, so these seasons are out-of-sampleout-of-sampleTested on data that was not used to build or tune the idea. This is the honest test; results on the data you built with are almost always flattering. for it.
  • Alignment check: Kalshi jumps in the minute a big play starts and settles within 2 minutes.

Tests (fixed before looking at results)

T1, overreaction. Plays where nflverse win probability moves 10+ points (1,275 events, 319 games). The price 2 minutes after the play is compared with what happened.

Measure Result
Kalshi's move vs the model's move 11.2¢ vs 14.6¢ (Kalshi moves less)
Final result minus price, signed by the move's direction −0.38¢ ± 1.18 (no overreaction against outcomes)
Drift back after 10 minutes −0.73 ± 0.40¢
Drift back after 20 minutes −1.97 ± 0.64¢

The drift back is small and real. Trading it means two taker fees plus the spread, about 4¢, which is more than the 2¢ drift.

T2, model vs market. Each Kalshi minute is compared with the model's view after the last play that started at least 45 seconds earlier, and only if no new play has started since (30,114 minutes, 385 games).

Log losslog lossA score for probability forecasts that punishes confident wrong answers harshly. Lower is better. Brier
Kalshi 0.4804 0.1610
nflverse model 0.4809 0.1606

They tie in every quarter. In overtime the model is much worse.

Trading rule: buy the side the model favours when the model's probability minus (price + fee 0.07·p·(1−p)) clears a threshold.

Threshold First bet per game All qualifying bets
2¢ +0.2¢ ± 2.3 +2.5¢ ± 2.7
5¢ +1.7¢ ± 2.8 +3.8¢ ± 4.1
10¢ +7.9¢ ± 4.0 (127 bets) −1.5¢ ± 6.5
  • The 10¢ first-bet row is one of six variants. Half its bets came in the last minutes of the 4th quarter, where a one-minute closing quote can't be traded, and a few long winners carry it. A forward test would get about 45 bets this season (SE about 7¢), so it isn't pre-registered.
  • biasbiasWhether the misses lean consistently one way. A projection can have a good average error size but still be biased if it is almost always too high. Bias is often the more fixable problem." data-def="Accidentally using information that was not available at the time. It makes predictions look brilliant and is the single most common way a backtest fools you.">Look-aheadlook-ahead biasAccidentally using information that was not available at the time. It makes predictions look brilliant and is the single most common way a backtest fools you. trap: the first version paired each play with the price from just before the play started. That gave the model the previous play's result before the price could show it, and inflated the 10¢ row to +10.8¢ ± 3.1. Any in-game test needs price timestamps after the information is public.

Run: python3 backtests/kalshi_ingame/fetch.py && python3 backtests/kalshi_ingame/analyze.py

On this page

Terms in this report

Source

backtests/kalshi_ingame/FINDINGS.md
updated 2026-10-31 21:38