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.
The Score
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?
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.
Demographics & Schedule (9 features)
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.
Box-Score Deviations (4 features)
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.
Physical Tracking Deviations (4 features)
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.
Advanced Impact Deviations (5 features)
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.
Hustle Deviations (7 features)
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.
Defensive Matchup Deviations (3 features)
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.