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).
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), we know they're mispricing at least one market. This surfaces arbitrage opportunities where both linked markets show value.
Core methodology:
- Recency-weighted L4: Per player × market, we use only the last 4 games (L4) with exponential weighting (alpha=0.4). Most recent game receives ~64% of the total weight.
- 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:
Recent games receive exponentially more weight than older games. For a 4-game window:
- Oldest game (Week N-3): 10.3% weight
- 2nd oldest (Week N-2): 25.6% weight
- Most recent (Week N-1): 64.1% weight
This captures form changes, hot streaks, and role adjustments much faster than simple averages.
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
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 field advantage adjustments
After defensive adjustments, we apply home field advantage multipliers to account for location-based performance differences.
Why this matters: NFL data shows consistent home field advantage across all positions. Home teams score 2-4 more points per game on average. This stems from:
- Crowd noise disrupting opponent communication (helps your offense)
- Familiarity with field conditions, locker rooms, and routine
- Reduced travel fatigue and timezone changes
- Referee bias (subtle but measurable)
Implementation approach: We use evidence-based multipliers applied to player expectations (μ) after defensive adjustments:
| Market | Home Multiplier | Away Multiplier | Total Spread | 
|---|---|---|---|
| Pass Yards | +6.0% | -6.0% | 12.0% | 
| Pass TDs | +6.0% | -6.0% | 12.0% | 
| Interceptions | -5.0% | +5.0% | 10.0% | 
| Rush Yards | +4.0% | -4.0% | 8.0% | 
| Rush Attempts | +2.0% | -2.0% | 4.0% | 
| Receiving Yards | +6.0% | -6.0% | 12.0% | 
| Receptions | +3.0% | -3.0% | 6.0% | 
| Anytime TD | +5.0% | -5.0% | 10.0% | 
4) Edge calculation & consensus
Converting probabilities to odds:
For each prop, we:
- Compute model probability of Over (e.g., P(rush_yds ≥ 50.5)).
- Convert to fair odds via fair_odds = round(100/p - 100)for p ≥ 50%, or100×(1-p)/pfor p < 50%.
- Compare to sportsbook's American odds to compute basis-point edge.
Edge (basis points):
edge_bps = 10000 × (model_prob - market_prob)A positive edge means our model thinks the Over is more likely than the book's implied probability. Negative edge suggests the Under is favorable.
Consensus view:
When 3+ books offer the same player × market × side × line:
- We show the median price across books.
- Calculate consensus market probability from median odds.
- Highlight these props with a green background in the UI.
Consensus props provide confidence that the line is well-established across the market, reducing the risk of stale or outlier pricing.
5) Known limitations
- Sample size: Early in the season (Weeks 1-4), we have limited data. Model confidence is lower.
- 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.
6) 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)
- 🔄 Team context (pace, pass rate, game totals)
- 🔜 Market fusion (weak Bayesian updates from consensus lines)
- 🔜 Monte Carlo joint simulation with correlated shocks
- 🔜 Weather and dome/outdoor venue adjustments
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.
This page describes how Fourth & Value models NHL player props and calculates "value." Our approach leverages rolling game-by-game performance data and home/away adjustments to project player statistics.
1) What we model
We focus on four core NHL player-prop markets, normalized to canonical keys (market_std):
- Poisson: goals,assists,points(goals + assists).
- Normal/Gaussian: sog(shots on goal).
We map sportsbook labels (e.g., "player_goals", "player_shots_on_goal") 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: Game-by-game NHL skater stats including goals, assists, points, and shots on goal.
- Schedule & start times: Used for display (ET) and filtering upcoming games.
- Venue information: Home/away designation for adjusting player performance based on game location.
3) Modeling approach
Rolling averages with recency:
Per player × market, we compute rolling statistics from recent games:
- Last 5 games (L5): Short-term form capturing recent hot/cold streaks.
- Last 10 games (L10): Medium-term performance providing more stable baseline.
- Season totals: Full season stats for broader context and regression to player baseline.
These rolling windows are calculated separately for home and away games to capture venue-specific effects.
Core methodology:
- Poisson markets (goals, assists, points): Estimate rate λfrom rolling averages → assume Poisson(λ) distribution for counting events.
- Normal markets (shots on goal): Estimate mean μand standard deviationσfrom rolling data → assume Normal(μ,σ).
- Home/away adjustments: Model separately tracks performance at home vs. away venues, reflecting well-documented home-ice advantage effects.
- Position awareness: Player position (L/C/D/R) is tracked to provide context for expected production patterns.
Why rolling averages?
NHL player performance varies significantly game-to-game due to factors like:
- Recent injury recovery or return from absence
- Line changes and ice-time adjustments
- Hot/cold shooting streaks
- Matchup-specific deployment
L5 and L10 windows capture these short-term dynamics better than season-long averages alone. Combining multiple time horizons provides both recency bias and stability.
4) Matchup adjustments
Home/away venue effects:
We separately track player performance at home vs. away venues:
- Home performance: Based on L5/L10 home games and season home splits.
- Away performance: Based on L5/L10 away games and season away splits.
This captures documented home-ice advantage effects including:
- Last line change advantage (favorable matchups)
- Crowd energy and familiarity
- Travel fatigue for road teams
- Typical 5-10% boost in home team performance metrics
Back-to-back considerations:
Our schedule data tracks whether teams are playing on consecutive nights (B2B):
- First game of B2B: Generally normal performance expected.
- Second game of B2B: Known fatigue effects, especially for goalies and defensemen with heavy ice time.
Note: Future versions may explicitly adjust for B2B effects. Currently available as context in schedule data.
5) Edge calculation & consensus
Converting probabilities to odds:
For each prop, we:
- Compute model probability of Over (e.g., P(goals ≥ 0.5)for anytime goal scorer).
- Convert to fair odds via fair_odds = round(100/p - 100)for p ≥ 50%, or100×(1-p)/pfor p < 50%.
- Compare to sportsbook's American odds to compute basis-point edge.
Edge (basis points):
edge_bps = 10000 × (model_prob - market_prob)A positive edge means our model thinks the Over is more likely than the book's implied probability. Negative edge suggests the Under is favorable.
Consensus view:
When 3+ books offer the same player × market × side × line:
- We show the median price across books.
- Calculate consensus market probability from median odds.
- Highlight these props with a green background in the UI.
Consensus props provide confidence that the line is well-established across the market, reducing the risk of stale or outlier pricing.
6) Interpretation guide
Edge magnitude:
- < 200 bps: Marginal edge, within typical model noise and vig.
- 200-500 bps: Moderate edge, worth considering for action.
- 500-1000 bps: Strong edge, high-confidence model disagreement with market.
- > 1000 bps: Extreme edge, warrants investigation for stale lines or model issues.
Model confidence indicators:
- 🔥 Fire emoji (≥85% model prob): Very high confidence prediction.
- Consensus highlighting: 3+ books agree on the line, suggesting market efficiency.
- Games played: Players with more recent games have more reliable rolling averages.
What to watch out for:
- Limited sample sizes: Early season or players with few recent games may have unstable estimates.
- Line movements: If a line moves significantly after our data snapshot, edge may be stale.
- Injury news: Player availability changes can invalidate projections.
- Lineup changes: Line combinations and ice time allocation affect opportunity.
7) Known limitations & roadmap
Current limitations:
- No opponent adjustments: We don't yet account for opposing team's defensive strength (goals allowed, shots allowed rates).
- No line-mate effects: Playing with elite centers/wingers significantly impacts production but isn't modeled.
- No power-play modeling: Power-play opportunity and effectiveness not explicitly tracked.
- No goalie matchup effects: Opposing goalie quality affects goal-scoring probabilities.
- Basic B2B handling: Back-to-back fatigue effects known but not explicitly adjusted for.
Planned improvements:
- Defensive matchup adjustments: Factor in opponent's goals-against and shots-against per game.
- Power-play weighting: Separate PP and even-strength rates, weighted by expected PP time.
- Goalie-aware projections: Adjust goal/assist rates based on starting goalie's save percentage.
- Line-mate quality: Boost projections for players skating with elite offensive talent.
- B2B fatigue multipliers: Explicit downward adjustments for second game of back-to-backs.
- Time-on-ice (TOI) tracking: Weight projections by expected ice time rather than just game-by-game stats.
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.
Reminder: Sports betting involves risk. Our models provide information and analysis, not guarantees. Always bet responsibly and within your means.