NFL prop market analytics

Compare simulated NFL projections to prop markets.

How do you compare a receiver averaging 70 yards a game with a market asking whether he clears 110? His last 12 games can’t answer that. We run 5,000 simulations and count how often he hits the 110 mark.

Every simulation runs from the down, distance, score and clock as they stand, so the question works in the third quarter as well as before kickoff.

DK Metcalf to get 60+ yards receiving
SimulationPIT @ CLE · Thursday
Engine
Neutral Zone Labs
Games
5,000
Run
9/29 16:14 ET
Margin
±1.4pp
060200
Games < 6053.5%
Games ≥ 6046.5%
Kalshi < 6068.5%
Kalshi ≥ 6031.5%

Running simulations

In-game simulations

Simulate from the down, distance, score and clock a game is actually in, not from a season average. Accuracy rises as a game runs: the engine is weakest before kickoff and strongest in the fourth quarter, which is when a line is worth re-reading.

Weekly reports

One sorted table for the whole slate instead of sixteen games read a card at a time: every player at a position, with the simulated figure beside the listed price. Metered at 3 credits for each source and target band you pick, and you see how many targets that is before you spend anything.

Custom simulations

Rule a player out, set how likely he is to suit up, or edit a roster, and play the game out under that assumption. A modifier is what the engine cannot answer from the shared run, so those are the ones credits are for.

How it works

  1. 01

    Configure

    A simulation has three settings: the targets it answers, the assumptions it runs under, and how many times it plays out.

    • Targets. A target asks for the probability that one player reaches one number, the same shape as a prop market: DK Metcalf, 60+ receiving yards. Take the line from a listed market or type your own, up to 110 in a run.
    • Modifiers. Judgement calls the simulation takes as given. Set a questionable player to 50% to play and he suits up in half the simulated games: the answer carries both outcomes rather than guessing at a diminished one. Rule him out, or edit a roster, and his work goes to the players who would actually take it.
    • Simulation count. Every run plays the game out 5,000 times from where it actually stands. There is no faster or slower setting to choose, and no way to buy a bigger number: it is the same run for everybody, every time.
  2. 02

    Run

    Each game is played out snap by snap from the down, distance, score and clock it is actually in. Play calling reads the score and the clock, starters rest once a game is decided, and a leading team kneels out the end. It takes seconds.

  3. 03

    Analyze

    Each target comes back as a probability with its interval, beside the listed price for the same line where one exists, from prediction markets like Kalshi and sportsbooks like FanDuel. DK Metcalf, 60+ receiving yards came back at 46.5% against a market price of 31.5%. The difference is stated and left there: nothing is ranked by it and nothing is flagged as worth acting on.

How we report it

We report differences. We do not interpret them.

Where our number and a listed price disagree, the difference is stated and left there. Nothing is ranked by it, nothing is flagged as worth acting on, and no output on this site is advice.

A probability never ships without its interval

Simulation error at our standard sample size is around 1.7 points. A bare percentage beside a market price invites a precision that does not exist, so we show the band.

An absent number means we could not estimate it

Unstable tails and stats with no shape to report are withheld rather than published at zero. A figure we are not confident in is worse than none, because it gets trusted.

Every release is measured the same way

We replay a full season, rebuilding the model each week from only what was known at the time, and publish every figure it produces. The weak ones are published too.

The current release is 2.3.0, measured across the 272 games of a full season against each player’s own average. Every figure, including the weak ones.

Technical details

A Markov chain over game states

A game is a sequence of states (down, distance, field position, score, clock, possession) and every play moves it to the next one. Nothing is projected in closed form: the engine walks that chain one snap at a time until the clock runs out, and a player's line is whatever fell out of it.

Monte Carlo, not a point estimate

The chain is walked 5,000 times per run, and every target is read off those same walks, so each answer is a distribution rather than a number with error bars bolted on. Seeds are hashed rather than incremented, because adjacent seeds correlate in some generators and correlated runs understate variance, which is the quantity being measured.

Every snap is drawn from real ones

Each play samples the call, the personnel grouping, who is on the field and then the outcome, conditioned on the situation and on fitted team and player quality, from 3 seasons of play-by-play. Teams throw when they are behind, rest starters once a game is decided, and kneel out a lead.

Create an account to run a simulation

Baseline projections for every player in every game come with the account, at no cost. Credits are only for simulating situations you configure yourself.

Create an account
Neutral Zone Labs