How Adjusted Ratings Work
Beating the best fighter in the league is harder than beating the worst. Every other stat on this site scores them the same.
Net points per round counts what you did. It says nothing about who you did it to. Two fighters can post the same number against completely different opposition, and the box score will never tell you which one had the harder season.
These two stats fix that from opposite ends. Strength of Schedule tells you who a fighter had to face. Adjusted NPPR re-scores the fighter with that already taken into account.
See them live on the adjusted ratings leaderboard and on every fighter profile.
Take everyone a fighter faced. Average how good they were, using their net points per round. That is the fighter's Strength of Schedule.
Above zero means a harder schedule than most. Below zero means an easier one. Opponents you met four times count four times as much as one you met once.
This season the hardest schedule went to Stacia Suttles at +0.772. The easiest went to Michael Bracamontes at -1.010. That is a gap of 1.78 points a round between two fighters in the same league.
This is the part that makes the number trustworthy, so it is worth spelling out.
Beat someone four times and you drag their numbers down. Now average your opponents' numbers and your own beatings come back to bite you: your schedule looks weak because you were good. The better you fight, the easier your season would look.
So before we measure how good your opponent was, we throw out every round they fought against you. We only look at how they did against everybody else.
This matters more in TBL than in most leagues. About half of all match-ups repeat inside the same match, so a big chunk of your opponent's season is rounds against you.
Here is the proof it works. How good a fighter is should have nothing to do with how hard their schedule looks. So this number should sit at zero:
| How we measure the schedule | How much the fighter's own skill leaks in |
|---|---|
| Just average the opponents | −0.569 |
| Throw out one round | −0.344 |
| Throw out every shared round | −0.034 |
Zero would be perfect. The bottom row is worked out live from this season, not typed in. If it ever slides back toward −0.5, something has broken.
Adjusted NPPR takes a different route. Instead of scoring fighters and then patching the result, it works out everybody's rating together.
Think of it this way. Every round tells you something about both fighters at the same time. Winning by three says you were good and says your opponent was not. Do that across all 1,305 rounds of the season at once, and you get one set of ratings that fits the whole year.
It does not blow up the leaderboard. Most fighters land close to where their raw numbers put them. The ones who move are the interesting part.
Zaire Jefferson is the clearest example. His raw net points per round is -0.615, which reads like a losing fighter. Account for who he was in there with and he sits at -0.107 — right around league average. The box score was describing his schedule, not him.
Most sites give you a rating and let you assume it is exact. Here is how solid ours actually is.
We rebuilt the whole thing 200 times, each time on a slightly different version of the season, and watched how much each fighter's rating moved. A typical rating wobbles by about 0.20 either way. The ratings themselves are spread about 0.39 apart.
So there is roughly 2.0 times as much real signal as wobble. That is genuinely useful — but it is not precise, and we would rather say so.
The rule that follows: gaps smaller than about 0.20 do not mean anything. A fighter three spots up the leaderboard is often not actually better. Every rating on the site comes with a range; where two fighters' ranges overlap, treat them as tied.
On the leaderboard, a ⚠ marks any fighter whose rating wobbles more than 0.25 — those are the softest numbers on the page.
We publish a pound-for-pound list as well as one per division. That sounds like the shakier of the two, and we expected it to be. It is not.
Comparing across weight classes leans on the fighters who changed class during the season — they are what ties the divisions to a common scale. When we rebuilt the ratings over and over, though, the pound-for-pound order held up better than the within-division order: 0.87 against 0.83, where 1.00 means it never moved.
The reason is simple. Fighters inside one division are closer in quality, so it takes less to flip two of them.
One warning we are not going to bury. Rebuilding the season over and over catches random luck. It does not catch a whole division being mis-set. If fighters who move up in weight tend to be the better ones, an entire division could sit too high or too low and none of our checks would notice. One season of data cannot settle that.
Field size matters too, which is why the division menu shows how many fighters qualified. Lightweight has 19. Bantamweight has 3. Leading a field of 3 should be read as exactly that.
- They ignore when a round happened. A round won with the match on the line counts the same as one won in a blowout. That is what Leverage and Clutch are for.
- They pull thin records toward the middle on purpose. A fighter with 11 rounds will read closer to average than their raw numbers suggest. With that little evidence, we would rather under-claim than over-claim.
- A hard schedule is not an achievement. Strength of Schedule describes what happened to a fighter, not how good they are. Mostly it is just who the fixture list put in front of them.
- This season only. Nothing carries over from any other year.
Technical Details — the formal spec
Strength of Schedule. For fighter A, over each opponent X faced k times:X_nppr_excl_A = (X's total net points − X's net points in rounds vs A) ÷ (X's total rounds − k)SOS(A) = Σ k · X_nppr_excl_A ÷ Σ k
An opponent whose round count falls to zero after exclusion is dropped from both the numerator and the weight total. Totals are the published NPPR numerator and denominator, so the stat is defined against the NPPR readers actually see.
Adjusted NPPR. Ridge regression over every round with both fighters identified:net points in the round = (fighter's rating) − (opponent's rating) + errortheta = solve(XᵀX + λI, Xᵀy) with λ = 5. X carries one row per round — not one per fighter-round; duplicating each round from both perspectives would double-count every observation and push the penalty tuning to a degenerate value — with +1 in the fighter's column, −1 in the opponent's, and y the margin from the first fighter's side. Row orientation is irrelevant: flipping a row negates both the ±1 pattern and y, leaving XᵀX and Xᵀy unchanged.
On λ = 5. Ten-fold CV on held-out rounds actually minimizes near LAMBDA 2.0 (MSE 1.677 vs 1.694 at 5.0). 5.0 is chosen deliberately: at 2.0 fighters with fewer than 5 rounds show a WIDER rating spread (0.539) than fighters with 15+ (0.424), which is backwards — small samples should shrink harder. At 5.0 the ordering corrects (0.302 vs 0.356) for about 1% worse prediction error. Worth it for a published leaderboard. Do not re-tune per season without telling the operator.
Solver. XᵀX + λI is a graph Laplacian plus λI — sparse, and strictly positive definite for λ > 0. It is solved by conjugate gradient without ever forming the matrix: each product costs one pass over the round list. The point solve converged in 31 iterations this season. A dense Cholesky factorization is kept as an independent cross-check in the unit tests.
Uncertainty. 200 refits, resampling rounds with replacement, reported as a standard deviation and a 90% interval. The resampler is seeded (20260001) — ratings are recomputed on every cache revalidation, and an unseeded bootstrap would make every published interval flicker between page loads. Rank stability is the mean Spearman correlation between the point-estimate ranking and each refit's ranking; the within-division figure averages over divisions with at least five qualified fighters.
Round universe. Both stats read the same bouts NPPR reads (data.fighterHistory), so DQ rounds are already absent. The ridge additionally requires both fighters to be identified, which drops rounds recorded against an N/A opponent — 1,313 of them qualify in 2026. Those rounds still count toward NPPR and SOS weighting. This season: 1,305 paired rounds across 334 fighters, 124 of them qualified at 10+ rounds.
Why SOS is not aNPPR − NPPR. SOS is NOT derived as aNPPR - NPPR. Ridge shrinks extreme NPPRs toward zero, so that difference is mechanically anti-correlated with NPPR regardless of schedule — measured -0.848, worse than the naive version it would replace. It conflates regression to the mean with schedule strength.
Validation. The pure functions are unit-tested against synthetic leagues (CG against Cholesky, orientation invariance, shrinkage ordering, the head-to-head exclusion firing, bootstrap determinism). The season figures — every reference fighter's SOS and aNPPR, the correlation bound above, the paired-round count — are asserted against live data by the admin validation route. Point estimates are exactly reproducible; bootstrap spreads are stochastic and checked as ranges.
