How the ranking is calculated
Every number below is read live from the ranking engine, so this page always
matches what the site actually ran.
Step 1 · Team quality
Before any game can be scored, we need a measure of how good a team is —
because beating a good team should be worth more than beating a bad one. Quality is built
from three levels of win ratio: yours, your opponents', and your opponents' opponents'.
// each ratio is wins ÷ games played
WR = your wins ÷ your games
OppWR = all opponents' wins ÷ all opponents' games
OppOppWR = all opponents' opponents' wins ÷ their games
quality = round( min( cap, WR × min(OppWR, WR) × min(OppOppWR, min(OppWR, WR)) ), precision ) × multiplier
Each level is capped by the one above it. A team never receives credit for
opponents rated higher than itself — if you are a .500 team, your schedule strength counts
as at most .500 no matter who you played. This keeps a weak team with a brutal schedule from
climbing on strength of schedule alone.
Wherever quality is used afterwards it is clamped to the range
0–1.
Step 2 · What each game contributes
Every completed game adds a number to the team’s account, built from
two things: how far ahead it finished on the scoreboard, and how far ahead on yards.
game contribution = wP × (capped point margin ÷ 70)
+ wY × (yard margin ÷ 300)
- Both terms are signed. Lose the game or lose the yardage battle and the
contribution is negative. There is no flat bonus for winning — winning is counted
in step 1 instead, through the record chain.
- The point margin is capped, so a 70–0 win counts no more than a
35-point one. Running up the score earns nothing.
- Strength of schedule is not applied here. It enters through
R in step 1, which is built entirely from opponents’ records.
Step 3 · The rating
The record chain and the game contributions are combined. Contributions
are averaged, not totalled, so a team that has played more games gains nothing from it.
Pts / Game = wR × R
+ average of the game contributions
Teams are sorted by that number, highest first. Ties break on win ratio, then
alphabetically. Only completed regular-season games count.
Why these three. Tested walk-forward — rebuilding the rating from
games played before each week, then predicting that week — over about 1,700 games in
2024 and 2025. Record, points and yards together pick the winner around
69% of the time against 67% for the previous formula.
Each part earns its place: dropping the yard term costs roughly a point of accuracy, and
the record chain on its own manages only 62%, so it needs the margin terms beside it.
The weights are a judgement, not just a fit. Pure accuracy prefers
0.4 / 0.3 / 0.3, but leaning that hard on margin and yards lets a team
that plays well and loses close games climb past teams that actually beat it. Record is
given the larger share to keep results in front of style.
Nothing predicted goes into this number. It is built from games that have
actually been played, and it is what the ranking, the seeding and the bracket all rest on.
The season forecast in step 6 sits in its own column and changes no team’s position.
Step 4 · The playoff field
The top of the ranking is turned into a bracket.
- The 5 highest-ranked conference champions receive
automatic bids. Independents are not eligible — they play no conference title game.
- The rest of the 12 places go to the next-highest
ranked teams.
- Seeding is strictly by ranking, and the top 4 seeds
skip the first round.
- A
* next to a team marks one that made the field on the conference
guarantee rather than on ranking alone.
Step 5 · Projected spread
The gap between two teams' averages, converted back to points on the
scoreboard.
spread = (your average − their average) × 70 × 1
+ home advantage (4), except at neutral sites
rounded to the nearest 0.5
Quoted from a team's own perspective, betting-style: negative means favoured.
In the expanded schedule the bracketed number beside it is the sportsbook line for an
upcoming game, or the actual result for one already played — both on the same scale, so
they read against each other directly.
The same 70 that scales margin in step 2 is what converts
a ratings gap back into points here. A projection on a game already played is
retrodictive — the ratings it uses already contain that result.
Step 6 · Projected scores and records
An unplayed game gets a projected score, and a team gets the record it
would finish with if every remaining game went to the projected favourite.
total = (our points-for + their points-against) ÷ 2
+ (their points-for + our points-against) ÷ 2
score = (total ± projected margin) ÷ 2
Two models, each doing what it is better at: scoring averages set the total,
the ratings spread sets the margin. Projected scores appear in italics in the
schedule so they never read as results.
How accurate is this? Tested by rebuilding the ratings week by week across
2023–25 — using only games played before each week — over 1,972 games:
the total lands within 12.9 points on average, which is effectively level
with the betting market’s over/under (11.83 against 11.77 on the games that had one).
Game totals are simply hard to call. The margin is the weaker half, at
13.9 points, and it picks the winner about 66% of the time
— so a projected record is a reasonable expectation, not a forecast.
A non-FBS opponent has no ranking of its own, so one is stood in for it — back-solved
from that team’s games against ranked opposition, and pulled toward a typical FCS
rating in proportion to how little is known. Most FCS teams play a single FBS game a year,
and one result is mostly noise: leaning on it alone predicts those games worse
(13.8 points of error) than ignoring it and using the typical rating (13.0). Blending the
two does best, at 12.8.
Where the forecast appears — and where it does not
Every remaining game is also scored the same way a real one is, giving a season-long
Proj. Pts / Game: the average a team would finish on if the rest of the
schedule went to form. It has its own column, in italics, beside the real one.
The forecast never affects the ranking. It is derived from the very ratings
it would be reordering, so letting it set positions would rest a team’s standing on
guesses about itself — and those guesses pick the right winner about two thirds of the
time. Early in a season most of a team’s schedule is still unplayed, so a blended
number would be mostly forecast while looking like a result. Ranking stays on
Pts / Game; the forecast is there to read, not to rank.
A worked example
Loading a real game from the current season…
Current settings
These are the live values the engine is using right now.