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 current rankings going into week 11:
This table contains the latest Top-25 output from the model after week 10.
| # | Team | WinsScore | AvgOppQ | Ranked Wins | Unranked Wins |
|---|---|---|---|---|---|
| 1 | Alabama | 10.479144 | 0.528813 | 4 | 3 |
| 2 | Indiana | 9.999091 | 0.619297 | 2 | 6 |
| 3 | Ohio State | 9.630481 | 0.611687 | 2 | 5 |
| 4 | Texas A&M | 8.338239 | 0.566405 | 2 | 6 |
| 5 | Ole Miss | 7.867405 | 0.586508 | 2 | 6 |
| 6 | Georgia | 7.589507 | 0.572070 | 2 | 4 |
| 7 | Vanderbilt | 6.517960 | 0.441591 | 3 | 3 |
| 8 | Oregon | 6.505537 | 0.544026 | 1 | 5 |
| 9 | BYU | 6.186930 | 0.510039 | 1 | 6 |
| 10 | Miami | 6.087674 | 0.523778 | 3 | 2 |
| 11 | Georgia Tech | 6.057742 | 0.542569 | 1 | 6 |
| 12 | Texas | 5.974355 | 0.541871 | 2 | 5 |
| 13 | Louisville | 5.832859 | 0.582023 | 1 | 5 |
| 14 | Virginia | 5.321219 | 0.504684 | 1 | 6 |
| 15 | Oklahoma | 5.311919 | 0.395435 | 3 | 3 |
| 16 | Texas Tech | 4.790680 | 0.447983 | 1 | 6 |
| 17 | Utah | 4.787723 | 0.403824 | 2 | 4 |
| 18 | Notre Dame | 4.268055 | 0.477696 | 1 | 5 |
| 19 | Cincinnati | 4.169218 | 0.437197 | 1 | 5 |
| 20 | LSU | 3.652056 | 0.620223 | 1 | 3 |
| 21 | USC | 3.573229 | 0.388005 | 1 | 5 |
| 22 | Arizona State | 3.355279 | 0.577202 | 2 | 3 |
| 23 | Michigan | 3.337498 | 0.514581 | 0 | 7 |
| 24 | Washington | 3.044678 | 0.553193 | 1 | 4 |
| 25 | Pittsburgh | 3.044121 | 0.509158 | 0 | 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\)