NFL · How the numbers work
NFL Methods
The assumptions behind our football forecasts, pricing comparisons and estimated edge.
Other sports: NHL methods · NBA methods · MLB methods
This page describes how Fourth & Value models NFL player props and calculates "value." It's intentionally general (no week-specific numbers) so it stays accurate as we update models.
1) What we model
We focus on common player-prop markets, normalized to canonical keys (market_std):
- Normal/Gaussian:
rush_yds,recv_yds,pass_yds,receptions,rush_attempts,pass_attempts,pass_completions. - Poisson:
anytime_td,pass_tds,pass_interceptions.
We map sportsbook labels (e.g., "player_rushing_yards") to these keys so we can merge and compare across books.
2) Data sources (high level)
- Odds (per book): Player props and prices from multiple sportsbooks via The Odds API.
- Player game logs: Weekly player stats from nflverse (official NFL data).
- Schedule & kickoff: Used for display (ET) and filtering upcoming games.
- Defensive stats: Computed from opponent performance (yards allowed per game).
- Injury reports: Weekly nflverse designations are normalized with a recorded retrieval time, displayed in Eastern Time and converted to conservative availability inputs. The official NFL injury page is the confirmation source for late status changes.
3) Modeling approach
Family-based multi-market modeling (Oct 2024):
Instead of modeling each market independently, we now model linked market families through shared latent factors:
- Rush family:
rush_attemptsandrush_ydsare linked through:- Volume latent: expected carries (μ, σ)
- Efficiency latent: yards per carry (μ, σ) bounded [2.5, 6.5]
- Derived relationship:
rush_yds = rush_attempts × YPC
- Receive family:
receptionsandrecv_ydslinked through:- Volume latent: expected targets
- Catch rate: receptions/targets bounded [0.50, 0.95]
- Yards per reception: bounded [6.0, 18.0]
- Derived:
recv_yds = targets × catch_rate × YPR
- Pass family:
pass_attempts,pass_completions, andpass_ydslinked through:- Volume latent: expected attempts
- Completion percentage: bounded [0.50, 0.75]
- Yards per completion: bounded [5.0, 12.0]
- Derived:
pass_yds = attempts × comp% × Y/C
Why this matters: When a sportsbook moves the rush attempts line but not rush yards, our model detects the implied efficiency change. If a book prices 18 carries at 120 yards (6.67 YPC—above our max bound), that differs from our assumed efficiency range. Separate market lines are not jointly predicted outcomes, so this flags a hypothesis to investigate rather than proving mispricing or arbitrage.
Core methodology:
- Recency-weighted L4: Per player × market, current-season form uses the last 4 games (L4) with exponential weighting (alpha=0.4). With four complete observations, the most recent game receives about 61.6% of the total weight.
- Career baseline with shrinkage: Blend current-season recent form with recency-weighted prior career history and position-level pools. Only records available before the forecast week may be used. Historical benchmark figures from the earlier implementation are withdrawn pending an independent evaluation with the corrected cutoff logic. This method remains experimental.
- Normal markets: Estimate mean
μand standard deviationσ→ assume Normal(μ,σ). - Poisson markets: Estimate rate
λfor counts (TDs, INTs) → assume Poisson(λ). - Sanity guards: Efficiency metrics are bounded to realistic ranges; floor
σto avoid overconfidence.
Exponential weighting:
For four complete observations with decay factor 0.4, unnormalized weights from oldest to newest are 0.4³, 0.4², 0.4 and 1. After normalization, those weights are approximately 3.9%, 9.9%, 24.6% and 61.6%. Missing observations change the normalization. A smaller decay factor places more weight on recent games.
Injury adjustments:
For a current-week report, Out/IR maps to 0% availability, Doubtful to 15%, Questionable to 65%, and Probable to 90%. Limited or missed practice without an official game designation receives only a small provisional adjustment. The player’s μ or λ is scaled and the source status is carried into the parameter snapshot. These are starting priors, not calibrated probabilities of playing.
The totals research screen compares the injury-adjusted total with captured market movement. It labels a possible overreaction only when an opening snapshot exists and the market move materially exceeds the model’s injury impact. Missing movement history produces no signal.
Matchup adjustments:
We apply two layers of matchup adjustments to account for both opponent strength and game location:
A. Defensive adjustments
Player projections are adjusted based on opponent defensive strength.
Defensive rating calculation:
- Computed from current season yards allowed per game (weeks 1 to N-1)
- Normalized using z-scores to a 0.5–2.0 scale:
- 0.5 = Easiest defense (most yards allowed)
- 1.0 = League average defense
- 2.0 = Toughest defense (fewest yards allowed)
- Separate ratings for pass defense and rush defense
- Updated weekly as more games are played
- The opponent is the other team in the player's game. If the player's current team matches neither side (for example after a trade), no defensive adjustment is applied
Adjustment formula:
adjustment_factor = 1.0 - (def_rating - 1.0) × 0.3- Applied to μ after deriving from latent factors:
μ_adjusted = μ × adjustment_factor - Market mapping:
- Receptions, receiving yards: use pass_def_rating
- Rush yards, rush attempts: use rush_def_rating
- QB passing markets: use pass_def_rating
Examples:
- Easiest defense (0.5 rating) →
1.0 - (0.5 - 1.0) × 0.3 = 1.15→ +15% boost - Average defense (1.0 rating) →
1.0 - (1.0 - 1.0) × 0.3 = 1.00→ No change - Tough defense (1.5 rating) →
1.0 - (1.5 - 1.0) × 0.3 = 0.85→ -15% penalty
Note: In practice, defensive ratings typically range from 0.5 to ~1.5 early in the season, so actual adjustments are usually in the ±7% to ±15% range.
B. Home/Away adjustments
After defensive adjustments, the mean is multiplied by a home or away factor for the market. The factors are measured, not assumed: across every completed regular season from 2012 to 2025 (nflverse box scores), we compare what players produced at home and away with what the same baseline forecast expected, and divide each by the overall ratio so only the venue gap remains. Neutral-site games are left out of the fit.
The gap is real but small for yardage. Earlier versions used fixed multipliers of ±6% for passing and receiving yards, about four times the measured gap; on 2024–26 games held out from fitting, the measured values gave more accurate passing-yard and receiving-yard forecasts. Pass attempts and completions get no venue factor because their measured gaps are under 1% and indistinguishable from zero.
| Market | Home | Away | Home 95% interval | Previous fixed value |
|---|---|---|---|---|
| Pass Yards | +1.4% | −1.4% | +0.6% to +2.2% | ±6.0% |
| Pass TDs | +4.6% | −4.6% | +2.8% to +6.4% | ±6.0% |
| Interceptions | −1.8% | +1.8% | −5.1% to +1.2% | ∓5.0% |
| Rush Yards | +2.4% | −2.4% | +0.9% to +3.8% | ±4.0% |
| Rush Attempts | +1.7% | −1.7% | +0.7% to +2.7% | ±2.0% |
| Receiving Yards | +1.4% | −1.4% | +0.5% to +2.2% | ±6.0% |
| Receptions | +0.7% | −0.7% | −0.1% to +1.4% | ±3.0% |
| Anytime TD | +5.4% | −5.3% | +3.8% to +6.8% | ±5.0% |
Not used: a player's own home/away split and his history against one particular opponent. In our backtest of 2024–26 games, neither improved forecasts once the player's form, the opponent's defense and the venue were known; players who had "owned" an opponent did no better than expected the next time. The matchup research and the venue study are published in Player Matchups and Home Field. The player snapshot still lists those past meetings as context.
Player snapshots
On the player prop board, selecting a player's name on a passing, rushing or receiving prop opens a snapshot. Its How it works tab shows the projection's arithmetic:
- Passing: expected attempts × completion rate × yards per completion.
- Rushing: expected carries × yards per carry.
- Receiving: expected targets × catch rate × yards per reception.
The tab then lists the opposing-defense and home/road factors that produced the published mean, and how much of each estimate comes from this season versus his career. Passing and receiving props use the opponent's pass defense, and rushing props use its run defense. The snapshot names that defense and shows its yards allowed per game, the league average and its rank. In the first week of a season those figures come from the previous season.
A Range of outcomes chart draws the bell curve the projection uses: the published mean and the market's spread, cut into bins whose edges sit on the line so no bin mixes winning and losing results. On a whole-number line, the push gets its own bin. The highlighted bins win the bet. The caption gives two chances:
- the curve's chance, conditional on no push;
- the published chance after calibration, which can differ from the curve.
The Form tab charts this season's games against the offered line. Below the recent games it lists the player's games against this week's opponent from the last seven seasons, with his average and how often he cleared tonight's line. That history is context only: it is not a model input, because our research found that results against one opponent do not predict the next meeting. Touchdown, interception and longest-play props have no snapshot.
4) Prices, probability and honest comparison
Reviewed September 9, 2026. Model estimates are experimental.
Book price and paired fair probability
Positive American odds A imply q = 100 / (A + 100). Negative odds imply q = |A| / (|A| + 100). These probabilities include the bookmaker's margin. When both opposite sides are available at the same book, event, player, market and line, we estimate fair probability as q / (q + q_opposite). We do not assume every market has a fixed 5% margin. One-sided touchdown quotes have no paired fair estimate.
Consensus probability is the median of paired fair probabilities for the exact same line and side, with one vote per book. The book count is the number of usable pairs. The median book line is a separate description, not a probability at your offered line.
Model probability, pushes and expected value
On integer lines, equality is a push and the stake is refunded. Poisson markets calculate that mass explicitly; Normal approximations use a half-unit interval around the integer. The displayed model probability is conditional on a non-push, matching the calibration labels. Half-integer lines have no push.
edge_bps = 10000 × (model_probability - book_probability)
expected_profit_per_100 = 100 × (1 - push_probability)
× (model_probability / book_probability - 1)
100 basis points equals one percentage point. An edge applies to the displayed side, whether Over, Under, Yes or No. A negative edge on one side does not establish value on the opposite side at its own price. To convert probability p into American odds, use −100p/(1−p) for p ≥ 0.5, or 100(1−p)/p otherwise.
Calibration coverage and evaluation limits
The checked-in calibration artifact was fitted on 12,904 graded records from nine weeks of the 2025 season. It covers rushing, receiving and passing yards, receptions, attempts, completions and passing touchdowns. These are correlated records across lines and sides, not 12,904 independent games. “Calibration fitted” describes a historical curve; it does not establish prospective accuracy or profitability.
The September review identified forecast-cutoff and temporal-validation weaknesses. Those code paths have been corrected, but the existing calibration artifact has not been refitted or independently validated after the changes. Prior backtest figures should not be treated as verified performance claims. A chronological holdout with pre-kickoff snapshots, grouped outcomes and a same-line market benchmark remains necessary.
Players without relevant observed data get no model probability. In particular, generic early-season touchdown priors are excluded instead of being presented as player-specific forecasts. Uncalibrated estimates are labeled and excluded from Top Picks. Top Picks also requires a positive model edge, an upcoming kickoff and a sportsbook timestamp no more than 48 hours old. Quote age does not guarantee the price remains available.
Model means and market-line agreement are descriptive. They are not calibrated betting thresholds, and agreement is not proof of positive expected value.
5) NFL game totals — research archive
The main totals model is a Ridge regression on each team's lagged performance metrics and a home/away indicator. It estimates each team's score separately, then adds the two scores for the game total. Current features describe each team's own history; they do not fully represent the upcoming opponent, injuries, weather or game script.
The September review corrected rolling-feature ordering across seasons and changed cross-validation to split by game date, keeping both teams in a game together. Those code corrections require rebuilding features, retraining and evaluating on a later holdout before publishing new performance claims. Experimental ensemble scripts with hardcoded 2025 weeks are not a current forecasting pipeline.
Book totals use the point field; price is American odds. A model-versus-consensus difference is measured in points, not probability or expected return. The line-shopping screen uses the median line with one vote per book and requires at least three books. An outlying line and agreement between models do not establish profitability.
A sportsbook-style home handicap uses away_predicted_score - home_predicted_score; a favored home team has a negative number. This sign convention differs from a predicted home winning margin.
6) Known limitations
- Sample size: Early in the season (Weeks 1-4), current-season data is limited. Player baselines now fall back to a career-long, position-pool-shrunk estimate rather than a flat league average or a single prior season (see Core Methodology above), but real signal is still thinner than it is once several 2026 games exist.
- Calibration coverage: The probability calibration described above only covers the 8 markets we've backtested. Anytime TD, first/last TD, and longest-play props are not yet calibrated - treat model probabilities on those with more skepticism than calibrated markets.
- Genuine predictive skill is still modest: Even with the career-baseline improvement, our backtest shows the model's raw probability correlates only weakly with real outcomes (correlation of +0.01 to +0.18 depending on market). Calibration keeps the model honest about this rather than overconfident, but it does not manufacture edge that isn't there. We'd rather publish that number than hide it.
- Team context: We don't yet adjust for pace, game script, or team totals/spreads.
- Weather: No weather adjustments (particularly important for passing games).
- Venue effects: Dome vs outdoor conditions not yet factored.
7) Roadmap
- ✅
Exponential weighting for recent form(Oct 2024) - ✅
L4 rolling window(Oct 2024) - ✅
Injury/role adjustment framework(Oct 2024) - ✅
Defensive matchup framework(Oct 2024) - ✅
Family-based multi-market modeling(Oct 2024) - ✅
Home/away field advantage adjustments(Oct 2024) - ✅
Probability calibration against real historical outcomes(Aug 2026) - ✅
Career-long per-player baseline with position-pool shrinkage(Aug 2026) - 🔄 Team context (pace, pass rate, game totals)
- 🔜 Calibration coverage for Poisson/yes-no markets (anytime TD, etc.)
- 🔜 Monte Carlo joint simulation with correlated shocks
- 🔜 Weather and dome/outdoor venue adjustments
Backtest methodology and calibration curves are public in the repo. For the full writeup with real backtest numbers, see Brier Scores and Calibration in our Research section.
Why transparency matters: By documenting our methods, we hold ourselves accountable to users and enable informed decision-making. If you find issues with our projections or have suggestions for improvements, please reach out via @fourthandvalue on X.