Loading fatigue data
KD v4
Pool
Severity
Sort
Team
Players
Severe
Notable
Normal
Rested
Insufficient
How it works
KINETIC
DEBT

Kinetic Debt (KD) is a Ridge Regression model trained on 75,833 NBA player-game observations across four seasons (2021–26). Each input is a deviation from that player's own prior-season baseline — minutes, FG3A, FT%, on-court speed, distance covered, defensive contests, opponent FG% allowed when guarded, and 25 other markers. The output is the predicted change in PIE (Player Impact Estimate) over the player's next 3 games, vs their own baseline. Higher KD = more fatigue.

Kinetic Debt fatigue index (0 = rested)
A 0–100+ fatigue index derived from the model's predicted next-3-game ΔPIE. Anchors:
  • 0 = the model's rested floor — the prediction when every workload, schedule, and performance feature is at its fresh-state value (e.g., game 1 of the season, no recent load, all deviations zero).
  • 100 = the severe threshold (top 2% of predicted decline from the training distribution).
  • Values above 100 are possible — they mean a player who is more fatigued than the empirical p2 cutoff. Rare but real.
Math: KD = max(0, (raw_kd − rested_anchor) ÷ (severe_anchor − rested_anchor) × 100) Rested and severe anchors are pulled from the live weights file each load, so the scale tracks every nightly retrain.

The model does NOT predict raw stat lines — it asks: given everything we know about how this player is moving, contesting, shooting, and being deployed relative to themselves, are the markers showing the pattern that historically precedes underperformance?
Severe KD ≥ 85
Notable KD ≥ 60
Rested KD < 30
0.087
Holdout R²
75,833
Training rows
33
Features

On R²: A holdout R² of ~0.087 means the model explains roughly 8–9% of player-to-player variance in next-3-game ΔPIE on data it has never seen. That sounds modest until you consider what's in the other 91%: shot variance, matchup, foul trouble, lineup chemistry, refereeing, mid-game blowouts that pull stars early — none of which have anything to do with fatigue. Sports science literature pegs fatigue as ~5–10% of total performance variance; we capture an order of magnitude more signal than the prior version (R² 0.007 on a noisier target), which means individual coefficients are now interpretable and directionally consistent with fatigue theory.

This R² is also not static. The heartbeat job retrains the model nightly on every new game's data, so the displayed R² above is recomputed each retrain — typically drifting in the 0.07–0.10 band as the season's data composition shifts.

Inputs that describe the player's age, travel, and the schedule's recovery windows. These are not deviations — they're the raw context every player operates within. The schedule features survived the v3 → v4 transition because they're already deviation-like by construction (a back-to-back is a deviation from the typical 2-night rest gap).

Age decimal years
Decimal age computed from birth date. Sports-medicine literature (Drew & Finch 2016; Gabbett 2020) shows recovery rate scales inversely with age, especially past ~30. The model's coefficient is negative on KD, which combined with the age × minutes interaction below means: same workload taxes older players more.
Age × Minutes (28d) interaction term
Multiplicative interaction between age and chronic workload. A 36-year-old at 300 min/month is doing different physiological work than a 24-year-old at the same volume. Without this term Ridge can't distinguish them. Standard practice in workload-based injury risk modeling.
Miles Flown haversine miles — prior 28d
Straight-line flight distance between game cities in the trailing 28 days. Captures circadian and travel-induced fatigue — Roy et al. (2023, J Sports Sci) found NBA travel of >3,000 mi/week measurably reduces next-game shooting accuracy. League average ≈ 5,600 mi/month; West Coast and Florida teams routinely exceed 10,000.
Road Trip Length consecutive away games
Consecutive away games without a home return. Independent of total mileage, long road trips compound sleep-environment disruption: unfamiliar beds, irregular meal timing, and disrupted social rhythms. 4+ game trips show statistically distinct effects from isolated away games.
TZ Drift (7d) net hours
Signed net timezone displacement over the past week. Σ (dest_tz_offset − origin_tz_offset) Negative = net eastward (Roenneberg 2007: phase-advance is the harder direction for the human circadian system). Most players sit near 0; ±3+ hours flags meaningful chronobiological stress.
Late-to-Early binary flag
Set to 1 when the player just finished a late tip (after 10pm local) and faces a next game with <20 hours of recovery. Captures the punishing "late East-coast game → next-day West-coast game" pattern. Sleep-restriction literature (Mah 2011) shows even one short-recovery game produces measurable reaction-time deficits.
Days Since Real Rest days (cap 30)
Days since the player last had ≥ 2 consecutive full rest days (a 3+ calendar-day gap between games). Single off-days are not enough for full systemic unloading; the autonomic-nervous-system literature consistently shows HRV requires >48 hours of unloading to fully recover.
Back-to-Backs (14d) count
Count of two-game-in-two-night occurrences in the past fortnight. Each B2B compresses recovery by ~24 hours; the NBA's 2017 schedule reform was driven by team-medical research showing 3+ B2Bs in 2 weeks correlates with elevated soft-tissue injury risk.
Games in 4 Nights count
Games played in the prior 4 calendar nights. Distinct from B2Bs because it captures the "3-in-4" pattern — three games over a 4-night window — which is the densest cluster the NBA schedule still permits and a known fatigue accelerator.

Each player's recent rolling stats compared to their prior-season baseline. The whole point of v4 is that fatigue is a relative concept: 35 minutes is routine for a star and overload for a bench player. Deviation features make the model fair across player roles.

Minutes Δ (7d) % above/below baseline
Last-7-game minutes per game vs the player's prior-season MPG. (mpg_last_7 − mpg_baseline) / mpg_baseline Recent overload = causal fatigue input. Sports-science consensus (Gabbett 2016; Hulin 2014): acute spikes above the player's accustomed load are the strongest single workload-injury predictor.
Minutes Acceleration (7v28) 7d Δ − 28d Δ
Difference between the 7-day deviation and the 28-day deviation. Positive = the player has been ramped UP recently relative to their longer-term load. This is the "second derivative" of workload; replaces the multicollinear 7d/28d pair from v4 Phase 1 cleanly.
3PA Δ (7d) % above/below baseline
Recent 3-point attempts per game vs baseline. The model finds a negative coefficient — taking more 3s than usual predicts a coming impact drop. This reads as the well-documented "settling for jumpers" pattern: when legs are gone, players bias toward catch-and-shoot 3s instead of driving. (Lyons 2022, J Strength Cond Res, on shot-selection shifts under fatigue.)
FT% Δ (7d) raw percentage difference
Free-throw percentage in last 7 games minus career baseline. FT% is closed-skill and matchup-independent — it's the cleanest available measure of fine motor control. Studies on neuromuscular fatigue (Knicker 2011, Sports Med) show FT-style closed-skill accuracy degrades 2–4 percentage points under accumulated load. We see exactly this signal in the data.

The on-court Second-Spectrum tracking system measures speed and distance every game. Tracking is the only feature class that can't be carried by teammates — the player physically did or didn't move. Most direct fatigue signal in the model.

Avg Speed Δ (7d) % above/below baseline
Mean on-court speed (mph) in last 7 games vs the player's prior-season speed. Tracking studies (Schelling & Torres-Ronda 2013; Cervera-Romero 2020) consistently show neuromuscular fatigue manifests as reduced peak speed and lower mean velocity within 24–48 hours of high-load games.
Distance Δ (7d) % above/below baseline
Per-game distance covered (miles) in last 7 games vs baseline. NBA players average 2.5–2.8 mi/game. Above-baseline distance flags above-baseline workload even when minutes look normal — coach is asking more of the player per minute. This was the strongest of the four tracking deltas in feature-importance analysis.
Speed Trend (14d) slope per game
Linear-regression slope of avg-speed over the trailing 14 days. Captures compounding decline — a player whose speed has been trending downward across multiple games is showing a second-order fatigue signature beyond what any single-game deviation reveals.
Distance Trend (14d) slope per game
Same idea applied to distance covered. Used together with the speed trend these capture the full kinematic decline: speed-only declines suggest cardiovascular fatigue; both speed AND distance dropping together is more consistent with neuromuscular load.

Per-game advanced metrics relative to baseline. These capture how a player's impact-while-on-court is shifting, separate from raw stat lines.

USG% Δ (7d) % above/below baseline
Usage rate vs baseline. USG drops are often coach-driven — the staff has decided to reduce a player's offensive load, frequently a leading indicator that the team's medical staff has flagged something. Highest-magnitude feature in the final model.
TS% Δ (7d) raw % point diff
True-shooting percentage vs baseline. Composite efficiency metric blending FG, 3PT, and FT. Drops here reflect the player missing more often, often through fatigue-induced shot-mechanics breakdowns.
DEF Rating Δ (7d) PPP raw difference
Defensive rating (opponent points per 100 poss while player is on court) vs baseline. Defense is the first thing to leak when legs are gone — closeouts get late, rotations slow, contests soften. Independent of teammate scoring fluctuations.
NET Rating Δ (7d) PPP raw difference
Net on-court impact (off rating − def rating). Aggregates both ends of the floor. The model gets independent value from this on top of DEF rating because offense and defense fatigue at different rates within a single game.
Pace Δ (7d) % above/below baseline
Pace (possessions per 48) of the player's recent games vs their team-typical pace. High-pace stretches mean more transition possessions, more sprinting, more conditioning load per minute played. Largely team-driven, but provides environmental context for how taxing a given minute-load actually is.
Games Played % games_played / 82
Cumulative regular-season games played, divided by 82. The 7d/28d windows catch recent load but miss the long-arc burnout that accumulates from October through April. A player at game 70 with the same recent load as game 30 is fundamentally further into their fatigue curve.

Hustle stats are effort plays: things a player has to choose to do, can't be carried by teammates, and don't show up in box scores. They're the cleanest behavioral signal of intrinsic willingness to expend effort — i.e. the opposite of fatigue. Each is computed as recent rolling mean vs prior-season baseline.

Deflections Δ (7d) % above/below baseline
Defensive deflections per game vs baseline. Deflections require active hand- and reaction-speed work; they fall when a defender is conserving energy.
Contested Shots Δ (7d) % above/below baseline
Closeouts and shot contests per game vs baseline. A player can be on-court without contesting shots — that's the giveaway that legs are gone.
Loose Balls Δ (7d) % above/below baseline
Loose balls recovered per game vs baseline. Loose-ball plays are the most physically expensive defensive efforts in basketball — they require diving, sprinting, and hard collisions. Drop-off here is a strong fatigue tell.
Off Box-Outs Δ (7d) % above/below baseline
Offensive box-outs per game vs baseline. Off-ball offensive rebounding effort. Easily skipped by a tired player without anyone noticing in real time.
Def Box-Outs Δ (7d) % above/below baseline
Defensive box-outs per game vs baseline. The same hustle stat on the defensive end. Tracked separately because offensive and defensive box-outs come from different physical postures and fatigue at different rates.
Screen Assists Δ (7d) % above/below baseline
Screens that lead to a teammate's score, per game vs baseline. Setting screens is short-burst maximal effort — a tired big stops setting hard screens before anything else. Useful especially for non-volume-scoring forwards and centers.
Charges Drawn Δ (28d) % above/below baseline
Charges drawn — voluntarily absorbed body contact — per game vs baseline. Uses a 28-day window because the base rate is too low for a stable 7-day average. Maximum-effort play; declines first when a player is conserving body.

The NBA's "matchup tracking" system records, for each defensive possession, who was guarding whom. From those rows we derive the player's opponent's shooting performance against them — a direct measure of defensive engagement. Filtered to ≥ 8 matchup minutes and ≥ 5 opponent FGA per game to avoid garbage-time noise.

Opp FG% Δ (7d) raw % point diff
Opponent's field-goal percentage when the player is the primary defender, last 7 games minus baseline. Positive = the man you're guarding has been shooting better than usual against you = defensive fall-off. Independent of team scheme and teammate help.
Pts Allowed Δ (7d) % above/below baseline
Points allowed per 36 matchup-minutes vs baseline. Total impact on the assigned player. Captures shot-volume permissiveness in addition to FG% — a tired defender both lets shots fly AND lets shots fall.
Matchup Min Δ (7d) % above/below baseline
Defensive matchup minutes (time on a primary opponent) vs baseline. Drops here often mean the coach is hiding the player defensively — switching them off the toughest assignment. A coach-side fatigue indicator.