NBA Matchup Card — Complete Data Spec
Purpose: Every metric the analyst briefing will contain for each game, how it's calculated, and where the data comes from.
SECTION A: Ported From Old Script (already proven, upgrade to league-anchored)
All deltas upgraded from TeamA - TeamB to league-average anchored:
delta = LeagueAvg + (TeamA_value - LeagueAvg) + (TeamB_value - LeagueAvg)
A1. Efficiency Deltas
| Metric |
Old Calculation |
New Calculation |
Source |
ortg_matchup |
Team ORtg - Opp DRtg |
LeagueAvg + (Team ORtg - Avg) + (Opp DRtg - Avg) |
nba_advanced_stats |
drtg_matchup |
Team DRtg - Opp ORtg |
LeagueAvg + (Team DRtg - Avg) + (Opp ORtg - Avg) |
nba_advanced_stats |
net_rtg_delta |
not computed |
Team NetRtg - Opp NetRtg |
nba_advanced_stats |
mov_delta |
Team MOV - Opp MOV |
same |
nbastuffer_stats |
consistency_delta |
Team Cons - Opp Cons |
same (no league anchor needed, relative metric) |
nbastuffer_stats |
a4f_delta |
Team A4F - Opp A4F |
same |
nbastuffer_stats |
A2. Four Factors Deltas (Offense vs Opponent Defense)
| Metric |
Calculation |
Source |
efg_delta |
Team eFG% - Opp defensive eFG% |
nba_advanced_stats |
orb_delta |
Team OREB% - Opp DREB% |
nba_advanced_stats |
tov_delta |
Team TOV% - Opp forced TOV% |
nba_advanced_stats |
ftr_delta |
Team FTA rate - Opp FTA rate allowed |
nba_advanced_stats |
three_rate_delta |
Team 3PT rate - Opp 3PT rate allowed |
nba_shooting_stats |
A3. Defensive Deltas
| Metric |
Calculation |
Source |
def_efg_delta |
Team defensive eFG% - Opp offensive eFG% |
nba_advanced_stats |
drb_delta |
Team DREB% - Opp OREB% |
nba_advanced_stats |
A4. Trend Deltas (momentum)
| Metric |
Calculation |
Source |
sag_trend |
Sagarin Strong Recent - Sagarin Overall (per team) |
sagarin_ratings |
sag_trend_delta |
Team sag_trend - Opp sag_trend |
sagarin_ratings |
dr_trend |
DRatings Inference - DRatings Overall (per team) |
dratings_ratings |
dr_trend_delta |
Team dr_trend - Opp dr_trend |
dratings_ratings |
sag_vs_opp |
Team Strong Recent - Opp Strong Recent |
sagarin_ratings |
inf_vs_opp |
Team Inference - Opp Inference |
dratings_ratings |
A5. Sharp Action (analysts DON'T see — Opus/edge scanner only)
| Metric |
Calculation |
Source |
rlm |
Reverse line movement detected (Y/N) |
pregame_sharp_data |
steam |
Steam move detected (Y/N) |
pregame_sharp_data |
cash_ticket_div |
Cash% - Ticket% divergence |
pregame_sharp_data |
A6. No-Vig Calculations (analysts DON'T see — edge scanner only)
| Metric |
Calculation |
Source |
novig_ml |
De-vigged ML from Pinnacle |
pinnacle odds |
novig_spread |
De-vigged spread probability |
pinnacle odds |
implied_score |
Derived from spread + total |
computed |
A7. Referee Data
| Metric |
Calculation |
Source |
ref_crew |
CC, Referee, Umpire names |
ref_assignments |
crew_ppg |
Crew average total points per game |
computed from historical |
crew_home_win_pct |
Home team win% under this crew |
computed |
crew_fouls_per_game |
Average fouls called |
computed |
crew_ou_lean |
Crew PPG - league average PPG (point adjustment for totals) |
computed |
crew_home_lean |
Crew home win% - league avg home win% |
computed |
SECTION B: New Panel-Recommended Metrics
B1. Pace Matchup (unanimous recommendation)
| Metric |
Calculation |
Source |
pace_delta |
Team Pace - Opp Pace |
nba_advanced_stats |
projected_game_pace |
(Team Pace + Opp Pace) / 2 * 0.88 |
nba_advanced_stats (0.88 = pace regression factor, slower team controls) |
projected_possessions |
projected_game_pace * 48/60 |
computed |
pace_imposition |
avg(actual_game_pace - opp_avg_pace) over last 15 games — does team speed up or slow down opponents |
nba_game_quarters + schedule |
B2. Projected Score / Total / Spread (5/5 panel votes)
| Metric |
Calculation |
Source |
projected_away_pts |
(Away ORtg_adj + Home DRtg_adj) / 200 * projected_possessions |
computed |
projected_home_pts |
(Home ORtg_adj + Away DRtg_adj) / 200 * projected_possessions |
computed |
projected_total |
projected_away_pts + projected_home_pts |
computed |
projected_spread |
projected_home_pts - projected_away_pts + team_hca |
computed |
| Where ORtg_adj = LeagueAvg + (Team ORtg - LeagueAvg) + (Opp DRtg - LeagueAvg) |
|
|
B3. Injury-Adjusted Ratings (5/5 panel votes — biggest edge potential)
| Metric |
Calculation |
Source |
missing_players |
List of OUT/DOUBTFUL players with stats |
injury reports |
missing_vorp |
Sum of injured players' VORP |
nba_player_advanced_stats |
missing_minutes |
Sum of injured players' avg minutes |
nba_player_advanced_stats |
on_off_delta |
Team NetRtg WITH player - Team NetRtg WITHOUT player |
NEW: NBA.com on/off endpoint |
injury_adjusted_ortg |
Team ORtg + (off_court_ortg - on_court_ortg) * (player_min / 48) |
computed from on/off |
injury_adjusted_drtg |
Same for defense |
computed from on/off |
injury_point_impact |
Estimated spread adjustment from missing player(s) |
computed |
B4. True Home Court Advantage (4/5 panel votes)
| Metric |
Calculation |
Source |
team_hca_points |
(Home NetRtg - Away NetRtg) / 2 per team |
NEW: NBA.com home/away splits |
home_ortg |
Team ORtg at home specifically |
NEW: NBA.com Location=Home |
away_ortg |
Team ORtg on road specifically |
NEW: NBA.com Location=Road |
home_drtg |
Team DRtg at home |
NEW |
away_drtg |
Team DRtg on road |
NEW |
B5. Rest-Adjusted Efficiency (4/5 panel votes)
| Metric |
Calculation |
Source |
rest_adjusted_ortg |
Team ORtg + team_rest_aed - opp_rest_aed |
nba_rest_stats + nba_fatigue_metrics |
rest_advantage_points |
Fatigue composite differential as point value |
nba_fatigue_metrics |
fatigue_composite |
Already exists — single score |
nba_fatigue_metrics |
B6. Decay-Weighted Recent Form (4/5 panel votes)
| Metric |
Calculation |
Source |
ewma_ortg |
Exponentially weighted ORtg, lambda=0.85 |
computed from game logs |
ewma_drtg |
Same for defense |
computed from game logs |
ewma_net_rtg |
ewma_ortg - ewma_drtg |
computed |
form_trajectory |
ewma_net_rtg - season_net_rtg (positive = trending up) |
computed |
B7. Strength of Schedule (4/5 panel votes)
| Metric |
Calculation |
Source |
sos_last10 |
Average opponent NetRtg over last 10 games |
nba_advanced_stats + schedule |
sos_adjusted_net_rtg |
Team NetRtg adjusted for schedule difficulty |
computed |
sos_context |
"Easy schedule — rating likely inflated" or "Hard schedule — rating understated" |
computed flag |
B8. Ref-Adjusted Total (4/5 panel votes)
| Metric |
Calculation |
Source |
ref_total_adjustment |
crew_ppg - league_avg_ppg (point value to add to projected total) |
computed from ref history |
ref_adjusted_total |
projected_total + ref_total_adjustment |
computed |
ref_foul_rate_z |
Crew foul rate as z-score from league average |
computed |
ref_pace_impact |
Does this crew speed up or slow down games |
computed |
B9. Team Variance / Blowout Profile (already in DB)
| Metric |
Calculation |
Source |
margin_std_dev |
Standard deviation of margin of victory |
nba_team_variance |
skewness |
Skew of margin distribution |
nba_team_variance |
kurtosis |
Fat tails (blowout tendency) |
nba_team_variance |
pct_blowout_win |
% of games won by 15+ |
nba_team_variance |
pct_blowout_loss |
% of games lost by 15+ |
nba_team_variance |
variance_flag |
"High variance team" or "Consistent team" |
computed |
B10. Shot Quality / Location (4/5 panel votes — NEW data source needed)
| Metric |
Calculation |
Source |
rim_fg_pct |
FG% at the rim |
NEW: NBA.com shot dashboard |
midrange_fg_pct |
Mid-range FG% |
NEW |
corner_3_pct |
Corner 3 FG% |
NEW |
above_break_3_pct |
Above-the-break 3 FG% |
NEW |
opp_rim_fg_pct_allowed |
What defense allows at rim |
NEW |
shot_quality_margin |
Team eFG% vs expected eFG% by location |
NEW |
style_mismatch |
Offense shot profile vs defense shot location weakness |
computed |
B11. Clutch Performance (4/5 panel votes — NEW data source needed)
| Metric |
Calculation |
Source |
clutch_net_rtg |
NetRtg in last 5 min, margin <= 5 pts |
NEW: NBA.com clutch filter |
clutch_diff |
clutch_net_rtg - overall_net_rtg |
computed |
clutch_flag |
"Strong closer" or "Collapses in close games" |
computed |
B12. Quarter Scoring Context (already in DB, reformat)
| Metric |
Calculation |
Source |
q4_vs_q1_delta |
Q4 scoring avg - Q1 scoring avg |
nba_quarter_scoring |
late_game_flag |
"Strong finisher (+X pts Q4 vs avg)" or "Slow starter" |
computed from q4_vs_q1_delta |
SECTION C: Metrics Analysts DO NOT See
These exist in the system but are hidden from blind analysts per the panel ruling:
| Category |
Metrics |
Used By |
| Market prices |
Pinnacle lines, Kalshi prices, SBR multi-book |
Edge scanner, Opus verdict |
| Sharp money |
RLM, steam, cash/ticket divergence |
Opus verdict |
| Model predictions |
Sagarin spread/total, DRatings, Dimers, ESPN BPI, GameSim, Prediction Tracker |
Long-term correlation tracking |
| No-vig calculations |
De-vigged ML/spread probabilities |
Edge scanner |
| Edge calculations |
Raw/net edge vs Kalshi, CLV |
Edge scanner, Opus verdict |
| Model vs market deltas |
AVG_VS_PIN_SPRD, AVG_VS_KAL_SPRD, STR_REC_VS_KAL |
Edge scanner |
SECTION D: Matchup Card Format
Each game presented as one block with all pre-computed deltas:
=== PHI @ BOS — 2026-03-30 7:30 PM ET ===
PROJECTED OUTCOME
Spread: BOS -6.8 | Total: 221.4 | BOS win prob: 68%
(injury-adj: BOS -8.2 if Embiid OUT)
EFFICIENCY MATCHUP (league-anchored)
BOS offense vs PHI defense: Expected ORtg 117.2 (+2.2 above avg)
PHI offense vs BOS defense: Expected ORtg 112.8 (-2.2 below avg)
Net matchup advantage: BOS +4.4
FOUR FACTORS DELTAS (offense vs opponent defense)
eFG: BOS +2.1% | OREB: BOS +1.8% | TOV: PHI +0.9% | FTR: BOS +1.4% | 3PT rate: BOS +3.2%
PACE & TOTAL
BOS pace: 101.2 | PHI pace: 97.1 | Projected game pace: 87.1 poss
Pace imposition: PHI controls (-1.4 slower than opponents avg)
Ref-adjusted total: 221.4 + 2.1 (Foster crew) = 223.5
SITUATIONAL
BOS: 1 rest day, road game 3/4, fatigue score 0.72
PHI: 2 rest days, home, fatigue score 0.31
Rest advantage: PHI +1.8 pts | HCA: PHI +2.1 pts (team-specific)
FORM (EWMA decay-weighted)
BOS: NetRtg +8.2 (season +6.5, trending UP +1.7)
PHI: NetRtg +2.8 (season +3.1, trending DOWN -0.3)
SOS last 10: BOS faced avg opp NetRtg -1.4 (easy) | PHI faced +2.8 (hard)
INJURIES
PHI: Joel Embiid — OUT (33 PPG, 29% usage, on/off delta: -9.0 NetRtg)
Impact: PHI ORtg drops ~4.2 pts, spread adjusts ~3.5 pts toward BOS
BOS: Kristaps Porzingis — PROBABLE (19 PPG, limited minutes expected)
VARIANCE PROFILE
BOS: std dev 12.1, high blowout rate (22%), consistent team
PHI: std dev 14.8, high variance, collapses without Embiid
REFS: Scott Foster (CC), Tony Brothers (R), Pat Fraher (U)
Total adjustment: +2.1 pts | Foul rate: +3.2/gm above avg | Home lean: +1.4%
QUARTER CONTEXT
BOS: Strong finisher (+2.1 pts Q4 vs avg)
PHI: Slow starter (-1.8 pts Q1 vs avg)
SECTION E: New Data Sources Needed
| Source |
What It Gives Us |
Endpoint |
Cost |
| NBA.com On/Off Splits |
Player impact (on_court vs off_court NetRtg) |
stats.nba.com/stats/teamplayeronoffdetails |
Free |
| NBA.com Home/Away Splits |
Per-team HCA in efficiency terms |
stats.nba.com/stats/leaguedashteamstats?Location= |
Free |
| NBA.com Last-N Games |
Rolling 5/10 ORtg/DRtg |
stats.nba.com/stats/leaguedashteamstats?LastNGames= |
Free |
| NBA.com Shot Locations |
Shot zone FG% (rim, mid, corner 3, above-break 3) |
stats.nba.com/stats/leaguedashteamshotlocations |
Free |
| NBA.com Clutch Stats |
Last 5 min, margin <= 5 performance |
stats.nba.com/stats/leaguedashteamclutch |
Free |
| NBA.com Hustle Stats |
Deflections, contested shots, loose balls |
stats.nba.com/stats/leaguehustlestatsteam |
Free |
All free. No new API keys needed.
SECTION F: Build Priority
| Priority |
Metric Group |
Effort |
Impact |
| 1 |
League-anchored efficiency deltas (port from old script) |
Low — formulas exist |
High |
| 2 |
Projected score/total/spread |
Low — computed from existing data |
High |
| 3 |
Per-team HCA in points |
Medium — new NBA.com endpoint |
High |
| 4 |
Injury-adjusted ratings (on/off splits) |
Medium — new endpoint + computation |
Highest potential |
| 5 |
EWMA decay-weighted recent form |
Low — computed from existing game data |
Medium |
| 6 |
SOS-adjusted ratings |
Low — computed from existing data |
Medium |
| 7 |
Ref-adjusted total (already partially there) |
Low — crew_ppg - league_avg |
Medium |
| 8 |
Pace imposition score |
Medium — needs game-level pace history |
Medium |
| 9 |
Shot quality / location data |
Medium — new endpoint |
Medium |
| 10 |
Clutch performance splits |
Medium — new endpoint |
Lower |
| 11 |
Hustle stats |
Medium — new endpoint |
Lower |
Source: ~/edgeclaw/docs/nba-matchup-card-spec.md