The KRACH Method

The formal definition of KRACH, how it is solved, and exactly how StatsCentral implements it. For a plain-language tour of all four of our ratings, see How Our Ratings Work.

Notation used throughout. Vij is the number of times team i has beaten team j, with a tie counting as half a win and half a loss. Nij = Vij + Vji is the number of times they have played. Vi = ∑j Vij is team i's total wins and Ni = ∑j Nij its total games. Ki is team i's KRACH rating.

1. The definition

KRACH applies the Bradley–Terry model to hockey. Ratings are multiplicative: the ratio of two teams' ratings gives the expected odds of each winning a game between them, so team i beats team j with probability Ki / (Ki + Kj).

The ratings are chosen so that every team's expected win total, given its actual schedule, equals its actual win total. That single condition defines KRACH implicitly:

Vi = ∑j Nij · Ki / (Ki + Kj)

There is no separate schedule adjustment bolted on afterward. Strength of schedule is not an input to KRACH — it falls out of this one equation, because a team's rating is defined in terms of its opponents' ratings, which are defined in terms of their opponents' ratings, and so on through the whole division.

2. Record × Strength of Schedule

An equivalent way of writing the same definition — less fundamental, but far more useful for understanding what a rating is actually made of — splits KRACH into a record term and a schedule term:

Ki = [ Vi / (Ni − Vi) ] × [ ∑j fij · Kj ]

The first bracket is simply wins divided by losses. The second is Strength of Schedule: a weighted average of your opponents' KRACH ratings, where the weighting factor is

fij = [ Nij / (Ki + Kj) ] / [ ∑k Nik / (Ki + Kk) ]

In words: the number of games against each opponent, divided by the sum of your rating and that opponent's rating — then normalized so the weights sum to 1.

Why the weights are not just games played. The 1/(Ki+Kj) term matters. Because the weights sum to 1, if all of your opponents have the same rating, your Strength of Schedule equals exactly that rating — a sanity property a plain games-weighted average does not have. More importantly, only this weighting makes KRACH = (wins/losses) × SOS hold exactly. A simple average of opponent ratings produces a number that does not reconcile with the rating beside it.

3. Solving and verifying

Both forms define KRACH recursively, so neither can be evaluated directly. To compute the ratings, the definition is rearranged:

Ki = Vi / [ ∑j Nij / (Ki + Kj) ]

and solved by iteration: start from any guess, feed it into the right-hand side, take what comes out, feed that back in, and repeat. The ratings converge when the numbers coming out are indistinguishable from the numbers going in. StatsCentral iterates until the total change across all teams falls below 0.00001, or for 200 passes, whichever comes first.

Checking a set of ratings is much easier than computing them. Given any candidate ratings, compute each team's expected wins with Vi = ∑j Nij · Ki / (Ki + Kj) and confirm it matches their actual win total. We compute this on every run as an internal check: the difference between expected and actual wins should be zero to within rounding, and a non-zero difference means the solver did not converge.

4. RRWP

Round-Robin Winning Percentage

RRWP is the winning percentage a team would be expected to accumulate if it played every other team in the division an equal number of times:

RRWPi = average over all j ≠ i of Ki / (Ki + Kj)

It carries the same ordering as KRACH but lands on a familiar 0–1 scale, which makes it far easier to read than a four-digit rating — a .750 RRWP means you would be expected to win three of every four games against a balanced division schedule. Unlike KRACH itself, it is directly comparable between divisions. It is also the figure KRACH falls back on for ranking when ratings cannot be compared directly (see section 6).

RRWP is calculated on every ratings run but is not yet shown on the standings page.

5. What the numbers are scaled to

The definition above fixes the ratios between ratings, but not their absolute size — multiply every team's rating by the same number and the definition is still satisfied. Some scale has to be chosen.

Published college hockey KRACH resolves this by defining 100 to correspond to an RRWP of .500: a team rated 100 would be expected to split its games against a full round-robin schedule.

StatsCentral uses a different scale. We normalize so that all teams in a division sum to 10,000. This means our KRACH numbers are not comparable between divisions, and not comparable to KRACH figures published for college hockey. Within a division, the ordering and the ratios between teams are what carry meaning — a team rated 2,000 is twice as likely to beat a team rated 1,000 as to lose to them. RRWP (section 4) is the figure that compares cleanly across divisions.

6. Undefeated and winless teams

The method breaks down when a team has won all of its games. An actual winning percentage of 1.000 can only equal an expected winning percentage if that team's rating is infinite relative to its opponents'. The same happens in reverse for a winless team, and in more tangled forms — two teams that have only lost to each other need ratings that are infinite compared to everyone else but finite compared to each other.

Current college hockey KRACH handles this by testing whether the division is connected: if you can trace a chain of wins and ties from any team to any other and back, every rating is finite and no intervention is needed. Where that fails, teams are split into groups, rated within their group, and ranked across groups by RRWP.

What StatsCentral does today. We run the connectivity test first. A connected division is rated exactly as above, with nothing added. Where it is not connected we fall back to the older approach rather than splitting the division into groups: a fictitious opponent that every team plays once, which is enough to keep all ratings finite. Our fictitious result is worth 0.85 of a win to the real team and 0.15 to the fictitious one — a convention inherited from the AHF's regularization, not part of the original KRACH definition. It still nudges every rating in that division, which matters most early in a season and in divisions where teams play few games outside their own group, as is common in youth hockey.
Sources

KRACH is Ken Butler's application of the Bradley–Terry model to college hockey. The definition, the record × strength-of-schedule decomposition, RRWP, and the connectivity handling described above follow the reference implementation maintained by Joe Schlobotnik.

The formulas on this page are reproduced from those public definitions; the explanatory text and the notes on our own implementation are our own. Ratings are recalculated whenever new scores are imported and include only games played through the current week's cutoff date.

An unhandled error has occurred. Reload 🗙
Connection lost. Reconnecting… Could not reconnect. Reload The session expired. Reloading… Reload