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 8:
This table contains the latest Top-25 output from the model after week 7.
# | Team | WinsScore | AvgOppQ | Ranked Wins | Unranked Wins |
---|---|---|---|---|---|
1 | Indiana | 8.961248 | 0.685894 | 2 | 3 |
2 | Ohio State | 8.576860 | 0.629283 | 2 | 3 |
3 | Alabama | 7.482668 | 0.522470 | 3 | 2 |
4 | Miami | 7.368711 | 0.480988 | 3 | 1 |
5 | Texas A&M | 6.562295 | 0.608001 | 1 | 5 |
6 | Ole Miss | 5.735184 | 0.553128 | 1 | 5 |
7 | Georgia Tech | 5.567208 | 0.526252 | 1 | 4 |
8 | LSU | 5.290003 | 0.641006 | 1 | 3 |
9 | Oregon | 4.932483 | 0.525169 | 1 | 3 |
10 | Texas Tech | 4.294325 | 0.413607 | 1 | 4 |
11 | Virginia | 4.070062 | 0.537192 | 1 | 3 |
12 | BYU | 3.935761 | 0.523913 | 0 | 5 |
13 | Cincinnati | 3.909335 | 0.561574 | 1 | 3 |
14 | Georgia | 3.882246 | 0.494600 | 1 | 3 |
15 | Vanderbilt | 3.514894 | 0.442325 | 1 | 3 |
16 | USC | 3.272474 | 0.334234 | 1 | 4 |
17 | South Florida | 3.261010 | 0.394499 | 2 | 2 |
18 | Tennessee | 3.200676 | 0.578727 | 0 | 4 |
19 | Illinois | 3.039374 | 0.523639 | 1 | 3 |
20 | Oklahoma | 2.962697 | 0.293444 | 2 | 2 |
21 | Utah | 2.944316 | 0.347588 | 1 | 3 |
22 | Washington | 2.881942 | 0.620290 | 0 | 4 |
23 | Notre Dame | 2.537656 | 0.561834 | 0 | 4 |
24 | Tulane | 2.320623 | 0.488993 | 0 | 5 |
25 | Nebraska | 2.299156 | 0.430404 | 0 | 4 |
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\)