Strength of Schedule

Strength of Schedule (SoS) measures the average quality of opponents a fighter has faced. It's a key input to the Strength Score and is often displayed alongside fighter rankings to give context to their record.
How It Works
SoS is calculated as the time-decayed, quality-weighted average of opponent dominance scores. In simple terms: it looks at how good your opponents were (using their own Dominance Scores) and weights recent opponents more heavily.
The Formula
SoS = weighted_average(opponent_dominance_scores)
Where each opponent's contribution is weighted by:
- Time decay — recent opponents count more (same quadratic decay as Dominance Score)
- Bout quality — the quality of the fight itself influences how much an opponent contributes
This means a competitive loss to a great fighter contributes more to your SoS than a quick first-round stoppage, because the bout quality weight reflects how meaningful the matchup was.
What SoS Tells You
| SoS Range | Interpretation |
|---|---|
| 60+ | Extremely tough schedule — mostly elite opposition |
| 50-59 | Strong schedule — solid mid-to-elite opponents |
| 40-49 | Average schedule — typical UFC competition |
| 30-39 | Weak schedule — mostly lower-tier opponents |
| < 30 | Very weak schedule — padding or early career |
Why SoS Matters
A 10-2 record means very different things depending on who those 10 wins came against:
- Fighter A (10-2, SoS: 62): Beat 3 former champions and 4 ranked fighters. Their losses came to current title contenders. This record is elite.
- Fighter B (10-2, SoS: 35): Beat mostly unranked fighters and newcomers. Their losses came to the first ranked opponents they faced. This record is questionable.
SoS is particularly important in the Strength Score, where win rate is capped based on opponent caliber. Fighter B's high win rate gets heavily discounted because their SoS reveals the wins came against weak competition.
Historical vs Current SoS
The system tracks SoS at two levels:
- Current SoS: Uses each opponent's latest dominance score. This reflects the opponent's full career and can change over time.
- Historical SoS: Uses the opponent's dominance score at the time of the fight. This gives a point-in-time snapshot of how strong the opponent was when you actually fought them.
For example, beating a fighter who later became champion looks better in current SoS (their dominance went up), while beating a former champion on a losing streak looks better in historical SoS (they were still highly rated when you fought).
Why Dominance and Not Strength?
Since SoS feeds into the Strength Score, it might seem more natural to base it on opponent Strength. But doing so would create a circular dependency:
SoS -> needs opponent Strength -> which needs opponent SoS
-> which needs their opponents' Strength -> ...
The current design keeps the dependency chain clean and non-circular:
Fighter Tiers (Elite/Mid/Low)
| (used as opponent multipliers)
Dominance Score
| (used as opponent caliber)
Strength of Schedule
| (30% weight + win rate cap)
Strength Score
Dominance is a strong proxy for opponent quality because it measures intrinsic fighter skill — how well they perform in the cage (striking, grappling, finishing, control). That's exactly what makes an opponent "tough to beat." And Dominance itself already partially accounts for opponent quality through its tier-weighted multipliers (beating Elite opponents counts 1.5x).
So the current design is a deliberate tradeoff: Dominance provides a direct, non-circular measure of "how dangerous is this opponent" — conceptually close to what SoS needs, without requiring iterative convergence algorithms.
Default Value
When opponent data is unavailable (e.g., the opponent has no rated fights), SoS defaults to 50 (average).