Overview
Elo ratings are calculated for all winter sports using a multi-player extension of the standard Elo formula. The system tracks athlete performance over time, updating ratings after each race based on actual vs expected results.
Core Algorithm
Base Parameters
- Base Elo: 1300 for all new athletes
- K-factor: Dynamic, calculated per season
- Season Discount: 0.85 regression toward base
Expected Score Calculation
For a race with n athletes, the expected score for athlete i against all (n-1) opponents is:
E_i = Sum of (1 / (1 + 10^((R_j - R_i) / 400)))
where R_i and R_j are the Elo ratings of athletes i and j. This is computed pairwise against all other competitors.
Actual Score Calculation
Actual score S is based on finishing position:
- Win against opponent: 1 point
- Draw (same place): 0.5 points
- Loss: 0 points
For athlete finishing in place P with n competitors: S = (athletes finishing behind) + 0.5 x (athletes tied)
Rating Update
New Elo = Old Elo + K x (S - E)
Example Race
Consider a 4-person race with K=3:
| Place | Athlete | Pre-Race Elo | Expected Score | Actual Score | Change | Post-Race Elo |
|---|---|---|---|---|---|---|
| 1 | Athlete A | 1500 | 2.1 | 3 | +2.7 | 1503 |
| 2 | Athlete B | 1450 | 1.8 | 2 | +0.6 | 1451 |
| 3 | Athlete C | 1400 | 1.5 | 1 | -1.5 | 1399 |
| 4 | Athlete D | 1350 | 0.6 | 0 | -1.8 | 1348 |
How it works:
- Athlete A (1500 Elo) wins. Expected to beat ~2.1 opponents on average, actually beat 3. Gains 2.7 points.
- Athlete B (1450 Elo) finishes 2nd. Expected ~1.8, got 2. Small gain of 0.6.
- Athlete C (1400 Elo) finishes 3rd. Expected ~1.5, got 1. Loses 1.5 points.
- Athlete D (1350 Elo) finishes last. Expected ~0.6, got 0. Loses 1.8 points.
Dynamic K-Factor
K varies by season based on participation levels. Seasons with fewer participants have higher K values (ratings change more), while seasons with more participants have lower K values (ratings are more stable).
K is calculated as the ratio of maximum historical participation to current season participation, bounded between 1 and 5.
Season Discount
At season end, all ratings regress toward the base:
End Elo = Elo x 0.85 + 1300 x 0.15
This prevents rating inflation and accounts for offseason changes in athlete ability.
Example:
| Athlete | End-of-Season Elo | After Discount |
|---|---|---|
| Top Performer | 1600 | 1555 |
| Average Performer | 1400 | 1395 |
| New Athlete | 1300 | 1300 |
| Struggling | 1200 | 1245 |
Notice how top performers lose more (1600 -> 1555, loss of 45), while struggling athletes actually gain (1200 -> 1245, gain of 45). This regression to the mean helps account for form changes over the offseason.
Sport-Specific K Adjustments
Team and combined events receive reduced K-factors to account for shared responsibility:
| Sport | Event Type | K Adjustment |
|---|---|---|
| Alpine | Combined | K x 0.8 |
| Biathlon | Relay, Mixed Relay | K / 4 |
| Biathlon | Single Mixed Relay | K / 2 |
| Cross-Country | Relay | K / 4 |
| Cross-Country | Team Sprint | K / 2 |
| Nordic Combined | Team | K / 4 |
| Nordic Combined | Team Sprint | K / 2 |
| Ski Jumping | Team Events | K / 4 |
Discipline-Specific Elos
Each sport calculates multiple discipline-specific Elo ratings:
Alpine
Overall, Downhill, Super G, Giant Slalom, Slalom, Combined, Tech (Slalom + Giant Slalom), Speed (Downhill + Super G)
Biathlon
Overall, Sprint, Pursuit, Individual, Mass Start
Cross-Country
Overall, Distance, Distance Classic, Distance Freestyle, Sprint, Sprint Classic, Sprint Freestyle, Classic, Freestyle
Nordic Combined
Overall, Individual, Individual Compact, Sprint, Mass Start
Ski Jumping
Overall, Small Hill, Medium Hill, Normal Hill, Large Hill, Flying
Data Sources
Elo ratings are calculated from World Cup, World Championship, and Olympic results:
- Alpine, Cross-Country, Nordic Combined, Ski Jumping: FIS (International Ski and Snowboard Federation)
- Biathlon: IBU (International Biathlon Union)