Hoops Nightly
+ Pick your team
Hoops Nightly · the newsroom · methods

How the numbers are made

Every number on this site comes from a formula that can be written down, so here they are, written down. Where a method has a known weakness, the weakness is stated next to it. The inputs are the league's official box scores, play-by-play, rosters and injury reports, plus public salary data; the newsroom page lists every source and how often it is read.

Live win probability

The chart on every game page gives the home team's chance of winning after each play. It is a closed formula, not a model trained on this season: the current margin, plus the home-court edge that remains, divided by how much the final margin can still move, read on the normal curve.

p(home wins) = Φ( (margin + 2.5 × frac) / (11.5 × √frac) )
frac = seconds remaining / total seconds of the game (overtime included)
2.5  = home-court advantage in points over a full game
11.5 = standard deviation of the final margin over 48 minutes

At the buzzer the probability is 1 or 0. The formula ignores who is on the floor, fouls to give and possession, which is why it can look slow in the last thirty seconds of a two-point game: it is a fair prior, not a betting line, and the site will never present it as one.

Power rankings

One score per team, recomputed once a day and stored, so the arrows show real movement. In season the score is a weighted sum of three standardized numbers; before opening night it is the net rating of the last complete season, which is why the preseason table looks like last year's.

score = 0.50 × z(net rating) + 0.30 × z(win percentage) + 0.20 × z(last ten games)
z(x) = (x − league mean) / league standard deviation, across the 30 teams that day

Net rating is the official points per 100 possessions, scored minus allowed. No injuries, no schedule strength, no eye test: a team that wins ugly ranks above a team that loses well, on purpose. The "why they moved" line on the rankings page is the difference between today's three inputs and the previous snapshot.

Player grades

Grades on a game recap run from A+ to F and are given by the team desk from the box score of that game only: minutes, points, shooting efficiency, rebounds, assists, turnovers, plus-minus and the role the player had that night. They are written, not computed, so two writers could disagree by a step; they are never given to a player who did not play, and they are never adjusted afterwards. Season-long value lives in the numbers on the player page, not in the grades.

The Margin

The Margin is the data column: a set of detectors runs on every box score and every roster change, scores what it finds by how surprising it is, and the desk writes only what clears the bar. The score is a distance from normal: how far a stretch is from the player's or the team's own average, scaled by how long it has lasted and how rare it is across the league.

detectors: scoring streaks, career highs, season highs, double- and triple-double runs,
  minutes up or down, hot and cold stretches (field, three, free throw, true shooting),
  role changes with a teammate out, new starters, five-man lineups far from the team average,
  home/road splits, contract against production, ten-game trends, stretches of the schedule
threshold: a piece is written above 48; on quiet days one piece per club above 30
title rule: the number is in the headline, and the page that proves it is linked from the piece

Every piece names the date its numbers are from. In the off-season the detectors read the last games of the previous season, and the cards say so.

Cap, tax and aprons

A team's payroll is the sum of the guaranteed cap hits on file for 2026-27 from public salary data, which can lag a signing or a trade by a day; the page says "not on file yet" rather than guessing. The status is read against the league's published lines for the season.

under the cap      payroll ≤ salary cap
over the cap       salary cap < payroll ≤ luxury tax
in the tax         luxury tax < payroll ≤ first apron
above first apron  first apron < payroll ≤ second apron
above second apron payroll > second apron

The Trade Machine applies the salary-matching rules of the collective bargaining agreement to where a team lands after the deal: teams above the first apron can take back at most what they send out; below it, 200% of outgoing salary plus $250,000 up to $7.5 million outgoing, with the larger bands above that. Picks, cash and exceptions are not on the roster, so they are only what the linked reports say.

Playoff races and pace

Games back are computed the standard way, to the sixth seed (the last guaranteed playoff spot) and to the tenth (the last play-in spot). Projected wins are the current winning percentage carried to 82 games, nothing cleverer, and the "next five" line uses the opponents' current winning percentage. The block appears only once the season has started.

games back = ((their wins − our wins) + (our losses − their losses)) / 2
projected wins = round( wins / games played × 82 )

Lineups and on/off

Five-man lineup numbers are the league's official lineup ratings for 2025-26 until the new season has enough games, with minutes together, offensive, defensive and net rating per 100 possessions. On/off for a player is the team's net rating with him on the floor minus with him off, from the same source.

Season simulator

One strength number per team, the schedule that remains, ten thousand seasons drawn at random every morning. The simulator page shows expected wins with the 10th-to-90th percentile range, the chance of each seed, and the three outcomes: top six (straight to the playoffs), seventh to tenth (play-in), eleventh and below.

strength (before opening night) = 0.6 × net rating of the last complete season
strength (in season)            = w × this season's net rating + (1 − w) × prior, w = min(games played / 25, 1)
home team wins with probability   Φ( (strength home − strength away + 2.5) / 12 )
standings sorted per conference each run; ties broken at random; 10,000 runs

The 0.6 is a regression to the mean: rosters change in the summer and last season's number is only partly true. The simulator knows nothing about injuries, trades or the tiebreaker rules, and it does not simulate the play-in or the playoffs themselves. It exists so a sentence like "this team is a lock" can be checked against a number.

Injury impact

A player's value to his team is read from the team's net rating with him on the floor and with him off, weighted by how much he plays. Without him the team is assumed to be its off-court self, which is the simplest honest assumption: it says nothing about who replaces him.

minutes share s   = minutes on court / (minutes on court + minutes off court)
strength lost     = − s × (net rating on − net rating off)
wins lost         = expected wins (full strength) − expected wins (simulator run without him)
rule of thumb     = one point of net rating ≈ 2.7 wins over 82 games

On/off comes from the last complete season, with whichever team the player was on. Players under 300 minutes are not rated: the number would be noise. The injury impact page lists everyone on the official report and the players each roster depends on.

Rest and travel

The schedule's fatigue, counted from the dates and the 30 arenas: rest is the number of full days without a game before tip-off (a back-to-back is 0); a team travels in a straight line from the arena of its previous game, starting the season at home; time zones are counted from the standard offsets of the arenas. "Three in four" and "five in seven" are the league's own labels for stretches of the calendar. A game is "tired" when the opponent had more rest, "rested" when it had less. No number here is a prediction; the league table and every team's schedule page show the same counts.

Shot maps

Every field-goal attempt in the official play-by-play carries a location: tenths of a foot from the centre of the basket, sideways and towards half court. The map on a player page draws them all; the zone table compares his percentage in each zone with every shot taken in the league that season.

restricted area   within 4 ft of the basket
paint (non-RA)    inside the lane (8 ft either side, 14 ft out), beyond the restricted area
mid-range         any other two-point attempt
corner three      a three from the baseline strip (22 ft line, below the break)
above the break   any other three (23.75 ft arc)
eFG%              (FGM + 0.5 × 3PM) / FGA

Free throws are not shots on the map. Shots before the 2025-26 season are not loaded; a zone gets a comparison to the league from 10 attempts.

Stories written from data

Recaps, injury updates, transaction stories, the morning briefing and The Margin are written by the desks from a brief that contains only numbers already on the site. Every draft passes gates before it is published: every player named must be in the brief; every number above 9 must appear in the brief; for a trade, every sentence that says who gets or sends whom is checked against the roster table, and a draft that fails is rewritten up to three times or not published. How the desks work is on the newsroom page; mistakes are listed on the corrections page.

Photos and names

Player photos come only from Wikimedia Commons under a free license, with the author credited on the player page; where none exists the site draws its own avatar, a player from behind with the number on the jersey. A weekly pass re-scores every candidate photo (license, date, face size, jersey colour, team in the description, college context) and keeps the best. The site never uses league, agency or broadcast images.

What the site never does

Questions about a method, or a case where a formula gives an answer that looks wrong: the contact page. A confirmed error is fixed and logged within 24 hours.