Abstract
I noticed that traditional media polls can be reputation-driven. This model replaces subjective ranking with a wins-first, transparent scoring system. Each game receives a value based on (i) opponent quality at the week of play via the Coaches Poll, (ii) location and capped margin, (iii) Power-4 vs. Group-of-5 tier for unranked opponents, and (iv) a season-level strength-of-schedule multiplier.
Core Ideas
- Week-of-game ranks: Upsets valued when they occurred, not retroactively.
- Conference tiering: Unranked P4 wins > unranked G5 wins; G5 losses sting more.
- SOS scaling: Season-level multiplier based on average opponent quality.
- Parsimony: Few transparent knobs; no black box.
Tooling
Python, Pandas, cfbd API, python-dotenv, Certifi
Formulas
Opponent Rank Quality (week-of-game)
Rank quality \(rq\) (1 is best) maps to \([0,1]\):
$$ rq(r) = 1 - \frac{r - 1}{24}, \quad r \in \{1,\dots,25\}. $$
Location & Margin
Location multiplier: $$ L=\begin{cases} 1.04 & \text{Road} \\ 1.00 & \text{Neutral} \\ 0.985 & \text{Home} \end{cases} $$ Margin is capped: \( m'=\min(m,\,14) \).
Win margin bonus: $$ \text{WinMargin}(m') = 1 + \gamma \cdot m', \quad \gamma = 0.008. $$
Close-loss relief (with floor \(\rho\)): $$ \text{Relief}(m') = \max\!\bigl(\rho,\; 1 - \lambda \cdot m'\bigr), \quad \rho=0.70,\;\lambda=0.01. $$
Ranked Scaling
Ranked wins get a multiplicative boost; ranked losses get a discount: $$ \text{WinBoost} = 1 + \beta \cdot rq, \qquad \text{LossDiscount} = 1 - \delta \cdot rq, $$ with \(\beta=0.70\), \(\delta=0.40\).
Unranked Opponent Tiering (P4 vs G5/Ind)
For unranked opponents, apply conference-tier multipliers: $$ s_{\text{win}}=\begin{cases} 0.85 & \text{P4 opponent} \\ 0.40 & \text{G5/Independent} \end{cases} \qquad k_{\text{loss}}=\begin{cases} 1.05 & \text{P4 opponent} \\ 1.30 & \text{G5/Independent} \end{cases} $$
Per-Game Value
Win:
$$ \text{base}_W = \bigl(1 + \alpha_W \, Q_{\text{opp}}\bigr)\, L \,\text{WinMargin}(m'), \quad \alpha_W=0.6 $$ $$ \text{value}_W = \begin{cases} \text{base}_W \cdot s_{\text{win}} \cdot \text{WinBoost}, & \text{opp unranked (tiered)} \\\\ \text{base}_W \cdot \text{WinBoost}, & \text{opp ranked} \end{cases} $$
Loss:
$$ \text{base}_L = \bigl(B + \alpha_L \, Q_{\text{opp}}\bigr)\, L \,\text{Relief}(m'), \quad B=0.90,\; \alpha_L=0.3 $$ $$ \text{value}_L = \begin{cases} -\text{base}_L \cdot k_{\text{loss}} \cdot \text{LossDiscount}, & \text{opp unranked (tiered)} \\\\ -\text{base}_L \cdot \text{LossDiscount}, & \text{opp ranked} \end{cases} $$
- \(Q_{\text{opp}}\): opponent quality for that week (Coaches Poll; fallback SRS/win%).
- \(L\): location multiplier (Road > Neutral > Home).
- \(m\): raw margin; \(m'=\min(m,14)\) is the capped margin.
- \(rq\): rank quality from week-of-game rank.
Season-Level Adjustments
Soft clamp (schedule + no ranked wins): $$ \text{WinsScore} \leftarrow \begin{cases} 0.90 \cdot \text{WinsScore}, & \text{if } \text{RankedWins}=0 \text{ and } \overline{Q}_t < 0.55 \\ \text{WinsScore}, & \text{otherwise} \end{cases} $$
Strength-of-schedule multiplier (with average opponent quality \(\overline{Q}\)): $$ \text{SOS}(\overline{Q}) = 0.50 + 1.10 \cdot \overline{Q}. $$
Diminishing returns on unranked wins (starting after the first): $$ d(n) = 0.93^{\max(0,\,n-1)}. $$
Ranked-win additive kicker (scaled by ranked-opponent quality): $$ \text{Kicker} = \kappa \cdot \text{RankedWins} \cdot \bigl(0.7 + 0.3\,\overline{Q}_{\text{ranked}}\bigr), \quad \kappa=0.30. $$
Final Score
$$ \text{WinsScore}(t) = \Bigl(\sum_{g \in \text{games}(t)} \text{value}_g\Bigr)\cdot \text{SOS}\!\left(\overline{Q}_{t}\right)\cdot d\!\left(\text{UnrankedWins}_{t}\right) + \text{Kicker}. $$
Algorithm Design (Step-By-Step)
- Data: Pull FBS games for weeks 1..W; duplicate rows home/away with result, location, margin.
- Week-specific Coaches Poll: For each week, map team → \(Q\) and rank → \(rq\).
- Fallbacks: If no poll for opponent that week, use normalized SRS; else shrunk win% through week.
- Per-game scoring: Apply equations above; special handling for unranked P4 vs G5/Ind.
- Season aggregation: Sum game values; multiply by SOS; apply unranked-win decay; add ranked-win kicker.
- Ranking: Sort by WinsScore (tie-break by tougher average opponent quality).
My Final 2025-26 Season Rankings
This table contains the latest Top-25 output from the model after week 17.
| # | Team | WinsScore | AvgOppQ | Ranked Wins | Unranked Wins |
|---|---|---|---|---|---|
| 1 | Indiana | 13.739685236476824 | 0.6680992715968092 | 3 | 9 |
| 2 | Georgia | 13.173238992383364 | 0.5193029266721941 | 5 | 6 |
| 3 | Ohio State | 12.129514294572825 | 0.6300045239825595 | 3 | 8 |
| 4 | Alabama | 11.285464685686883 | 0.6043524632793712 | 4 | 5 |
| 5 | Oregon | 10.418556493327408 | 0.5432770636703291 | 3 | 7 |
| 6 | Oklahoma | 10.28694962701908 | 0.44764335050144977 | 5 | 4 |
| 7 | Vanderbilt | 9.838643028762718 | 0.48605484385142944 | 4 | 5 |
| 8 | Texas Tech | 9.723936920910772 | 0.509939158306498 | 3 | 8 |
| 9 | Texas A&M | 9.41671164632323 | 0.5309890243537617 | 3 | 7 |
| 10 | Miami | 9.212000861869436 | 0.48447718414634305 | 4 | 5 |
| 11 | Texas | 9.155434295740331 | 0.6014216665678694 | 3 | 6 |
| 12 | Ole Miss | 9.06401994833526 | 0.6091160888041698 | 2 | 8 |
| 13 | BYU | 7.0539579989345995 | 0.5799924402075399 | 1 | 9 |
| 14 | Utah | 6.757644626825898 | 0.45403229064772027 | 2 | 7 |
| 15 | Notre Dame | 6.433877190363674 | 0.45907791810573423 | 2 | 8 |
| 16 | Georgia Tech | 5.46528028249748 | 0.5771601570190256 | 1 | 7 |
| 17 | USC | 5.407465527906469 | 0.5074756884543707 | 1 | 8 |
| 18 | Virginia | 5.372433163735027 | 0.5640925058836107 | 1 | 8 |
| 19 | Michigan | 4.707673056100745 | 0.5833089164077264 | 0 | 9 |
| 20 | Arizona | 4.673720744948551 | 0.48743612629654504 | 1 | 7 |
| 21 | Pittsburgh | 4.455865607282793 | 0.5444573472323639 | 1 | 6 |
| 22 | Arizona State | 4.382400382179137 | 0.5792270356134445 | 2 | 5 |
| 23 | Tulane | 4.2264747673627685 | 0.4231215555928332 | 2 | 9 |
| 24 | Louisville | 4.177658495669313 | 0.6129255483060111 | 1 | 6 |
| 25 | Illinois | 3.9187028307801874 | 0.5716355717975055 | 1 | 6 |
Reproducibility
- cfbd API with Coaches Poll per-week lookups (no journalist polls).
- Conference tiers from CFBD team metadata (Power-4: SEC, Big Ten, ACC, Big 12; Notre Dame treated as P4).
- Margin capped at \(M=14\); road/neutral/home multipliers; close-loss relief with floor.
- Full code embedded below.
Parameters (Current)
- Ranked win boost: \(\beta = 0.70\); ranked loss discount: \(\delta = 0.40\)
- Unranked win scales: P4 \(=0.85\), G5/Ind \(=0.40\)
- Unranked loss multipliers: P4 \(=1.05\), G5/Ind \(=1.30\)
- SOS multiplier: \(0.50 + 1.10\cdot \overline{Q}\)
- Unranked wins decay: start after first, factor \(0.93\)
- Margin cap \(M=14\), win margin factor \(\gamma=0.008\)
- Close-loss relief floor \(\rho=0.70\), per-point relief \(\lambda=0.01\)
- Location multipliers: Home \(0.985\), Neutral \(1.00\), Road \(1.04\)