← Back to Blog

We Built a Monte Carlo NFL Simulation Engine. Here's How It Works.

·Chris
simulationmonte-carlonflanalyticscadence-model

In our last post, we introduced 60+ NFL statistics that power our analytics. But stats alone don't tell you who wins. You need a model.

So we built one: a Monte Carlo simulation engine we call the Cadence Model. It turns those 60+ stats into probability distributions by simulating thousands of games.

Here's how it works.

The Core Idea

Every NFL game is a sequence of drives. Each drive ends in one of a few outcomes: touchdown, field goal, punt, turnover, or the clock running out.

If you know the rate at which each outcome occurs, you can simulate games by sampling from those rates. Do it 10,000 times, and you get a distribution of final scores—and probabilities for each team winning.

The challenge is: event rates aren't constant. They vary by team, by opponent, and by game situation.

Step 1: Calculate League Averages

First, we compute league-wide baseline rates for every event type using 27 years of play-by-play data:

  • Offensive TD rate — How often does a drive end in a touchdown?
  • Field goal rate — How often does a drive end in a made field goal?
  • Interception rate — How often does a drive end in a pick?
  • Punt rate — How often does a drive end in a punt?
  • Fumble rate — How often is possession lost via fumble?

These league averages establish the baseline. The average NFL team, against the average defense, in a neutral situation, produces TDs at rate λtd\lambda_{td}, punts at rate λpunt\lambda_{punt}, etc.

Step 2: Calculate Team Multipliers

This is where the 60+ statistics come in.

Each team gets offensive and defensive multipliers that adjust the league baseline. The multipliers are ratios: how does this team compare to average?

For offense, the touchdown rate multiplier blends two signals:

TD Multiplier=0.6×Points per DriveLeague Avg PPD+0.4×EPA Factor\text{TD Multiplier} = 0.6 \times \frac{\text{Points per Drive}}{\text{League Avg PPD}} + 0.4 \times \text{EPA Factor}

Points per Drive is the most direct measure of scoring efficiency. EPA (Expected Points Added) captures play-level quality. We blend them for robustness.

Similarly for other events:

Multiplier Primary Signal
TD Rate Points per Drive + EPA
INT Rate Turnover Differential
Punt Rate 3rd Down Conversion %
Explosive Rate Explosive Plays
Red Zone Efficiency Red Zone TD %

For defense, the logic inverts. A good defense reduces the opponent's rates:

TD Allowed Multiplier=0.6×Points Allowed per GameLeague Avg PAPG+0.4×Def EPA Factor\text{TD Allowed Multiplier} = 0.6 \times \frac{\text{Points Allowed per Game}}{\text{League Avg PAPG}} + 0.4 \times \text{Def EPA Factor}

Lower points allowed → lower multiplier → opponent scores less often.

Step 3: Calculate Matchup Rates

Here's the key insight: both teams' multipliers apply independently.

When Team A has the ball against Team B:

Effective Rate=λleague×A’s Offense Mult×B’s Defense Mult\text{Effective Rate} = \lambda_{\text{league}} \times \text{A's Offense Mult} \times \text{B's Defense Mult}

Let's say DEN is playing BUF:

DEN offense vs BUF defense:

  • DEN's offensive stats are close to league average → offensive multiplier ≈ 1.0
  • BUF's defensive stats are also close to average → defensive multiplier ≈ 1.0
  • Result: λleague×1.0×1.0=λleague\lambda_{\text{league}} \times 1.0 \times 1.0 = \lambda_{\text{league}}

DEN's rates come out at league average because their stats are league average. The model doesn't "pick the better team"—it reflects what the data shows.

BUF offense vs DEN defense:

  • BUF's offensive stats are ~9% better than average → offensive multiplier ≈ 1.09
  • Result: λleague×1.09×defMult\lambda_{\text{league}} \times 1.09 \times \text{defMult} = 9% above league rate

Step 4: Game State Adjustments

Rates aren't constant throughout a game. Teams behave differently when trailing by 17 vs leading by 3 with 2 minutes left.

We define game state buckets:

State Description
Neutral Within 8 points
Leading Small +9 to +16
Leading Big +17 or more
Trailing Small -9 to -16
Trailing Big -17 or more
Q4 Late Q4 with ≤5 minutes remaining
Q4 Trailing Late "Comeback mode"
Q4 Leading Late "Clock kill mode"

Each state has its own multipliers. In Q4 Trailing Late, pass rates spike, punt rates drop, and interception rates increase. The model captures this.

Step 5: Monte Carlo Simulation

Now we simulate.

Starting from kickoff:

  1. Determine who has the ball
  2. Sample drive duration and outcome based on effective rates
  3. Update score and clock
  4. Repeat until clock expires

We run 10,000 iterations. Each produces a final score. The distribution gives us:

  • Win probability — What % of simulations did each team win?
  • Score distribution — Expected point totals and spreads
  • Margin of victory — How often does each team win by X?

Why This Matters for Edge Detection

The simulation output is a probability distribution, not a point estimate.

If the simulation says BUF wins 62% of the time but the prediction market prices them at 55%, that's a 7-point edge. You're not guessing—you're comparing two quantitative models.

The edge compounds when you combine it with:

The simulation gives you a forward-looking estimate. The edge calculations give you historical base rates. When they both agree and diverge from market pricing? That's signal.

Try It Yourself

The NFL Game Simulator is live. Pick any two teams, run the simulation, and see the full probability distribution.

Behind the scenes, it's loading the Cadence Model, pulling each team's 60+ stat profile, calculating matchup-specific event rates, and running 10,000 game simulations in your browser.

All free, no sign-up required.


Related:

All trading involves risk. This is a research tool, not financial advice.