Why this platform exists
As a fan, this project came from the same questions fans ask all season: which teams are actually better, why certain matchups swing the way they do, and how differently the playoff picture might have looked if a few moments changed. The goal is to turn those questions into something you can explore with real context through rankings, team-by-team history, and matchup tools that make the season easier to break down.
System intent
This NFL Elo dashboard was created by me, a student at West Chester University of Pennsylvania, for the purpose of practicing and demonstrating full-stack development. The project loads season data, stores and computes Elo ratings in the backend, and generates a website that keeps charts and rankings easy to browse.
The goal is not just to display records, but to show the full path from raw game data to analytics output and a polished presentation.
Tech stack
Full methodology
Expected Score (Elo)
The probability that Team A beats Team B, derived from the standard Elo formula. A 200-point Elo gap gives the stronger team roughly 76% win probability.
- \(R_A, R_B\): Elo ratings of teams A and B
- 400: scale constant (standard Elo)
HFA Adjustment
Before computing win probability, the home team receives a temporary Elo point boost that is not stored in the rating. Two calibrated values are used: +55 pts for regular-season Elo computation (Glickman & Jones 1999), and +65 pts in the playoff bracket simulator (FiveThirtyEight NFL playoff calibration). The Super Bowl uses no HFA — it is played at a neutral site.
- \(\delta = 55\): regular-season Elo rating computation
- \(\delta = 65\): playoff bracket simulation (home = higher seed)
- \(\delta = 0\): Super Bowl (neutral site)
- Source: Glickman & Jones (1999), FiveThirtyEight NFL Elo
Rating Adjustment
After each game, both teams' ratings shift by the K-factor (25) scaled by the surprise of the result and a margin-of-victory multiplier. Blowout wins are worth more than narrow ones.
- \(S\): actual result (win=1, draw=0.5, loss=0)
- \(M\): margin-of-victory multiplier (see below)
MOV Multiplier
Straight Elo treats a 1-point win the same as a 40-point blowout. The FiveThirtyEight MOV multiplier scales the update by point differential while correcting for the fact that dominant teams already have high Elo ratings.
- \(PD\): absolute point differential
- \(\text{ELO}_W, \text{ELO}_L\): pre-game ratings of winner and loser
- Denominator shrinks the multiplier when the favored team wins big (autocorrelation correction)
OLS Margin Model
After computing all season Elo ratings, an ordinary least-squares regression is fit over every game, predicting point differential from pre-game Elo difference. This gives interpretable, calibrated margin estimates for any matchup.
- \(\alpha\): intercept (home-field bias in margins)
- \(\beta\): slope ≈ points per 100 Elo difference
- Fit on all 2024 regular-season games (n ≈ 272)
Score Simulation
To simulate a final score, the expected margin is used as the mean of a Normal distribution (σ = 13.45, the historical NFL game margin std dev). Total points are drawn from a separate Normal (μ = 43.5, σ = 10). Random draws use the Box-Muller transform for true Normal sampling.
- \(\sigma_m = 13.45\): historical NFL margin standard deviation
- 43.5 pts total: 2024 season average combined score
- Box-Muller: transforms two uniform random numbers into one Normal variate
Monte Carlo Confirmation
To validate the playoff simulator, 100,000 full bracket simulations were run using the 2024 seedings and Week 18 Elo ratings. Super Bowl win rates by seed were compared against historical NFL outcomes (1975–present). The simulator matches historical benchmarks closely — confirming the Elo engine, margin model, and HFA are well-calibrated.
| Seed | Simulated win % | Historical range | Result |
|---|---|---|---|
| 1 | 47.0% | ~35–40% | High — 2024 #1 seeds (Detroit 1711, KC 1631) were historically strong |
| 2 | 25.3% | ~20–25% | ✓ Match |
| 3 | 14.0% | ~10–15% | ✓ Match |
| 4 | 3.0% | ~8–10% | Low — Houston Texans (1511) were a weak 4-seed |
| 5 | 3.6% | ~5–8% | ✓ Match |
| 6 | 4.2% | ~3–5% | ✓ Match |
| 7 | 2.9% | ~1–2% | Slightly high — Denver Broncos (1616) were a strong 7-seed |
- N = 100,000 full bracket simulations
- Deviations at seeds 1, 4, and 7 reflect this specific 2024 bracket, not model error — higher/lower Elos than typical for those seed positions
- Adding HFA (+65) moved seeds 6 and 7 from significantly over-estimated into their historical bands
How it works
Data Store
- Fetch game data from ESPN API
- Normalize scores & metadata
- Persist games to SQLite
- Serve via
/gamesendpoint
Elo Pipeline
- Load all played games
- Compute weekly Elo ratings
- Apply MOV multiplier & HFA
- Fit OLS margin model
- Build win-probability matrix
- Export
elo_2024.json
Static Site
- Read Elo JSON artifact
- Render Jinja2 templates
- Team & leaderboard pages
- Matchup simulator
- Playoff bracket tool
- Output to
ui/dist/