DEV Community

milkmaster7
milkmaster7

Posted on

How I Built an Elo Rating System for Esports Teams

Why Elo for Esports?

Traditional esports rankings (HLTV, VLR) use a mix of editorial judgment and point-based systems. I wanted something purely mathematical — a system where every match result automatically updates team rankings.

The Algorithm

The base Elo formula is simple:

New Rating = Old Rating + K * (Actual - Expected)
Enter fullscreen mode Exit fullscreen mode

Where:

  • K-factor = how much each match matters (I use 32 for regular matches, 48 for playoffs, 64 for grand finals)
  • Expected = probability of winning based on rating difference
  • Actual = 1 for win, 0 for loss

My Modifications

Standard Elo doesn't account for esports-specific factors, so I added:

1. Tournament Tier Weighting

const tierMultiplier = {
  S: 1.5,  // Majors, Worlds, TI
  A: 1.2,  // ESL Pro League, Masters
  B: 1.0,  // Regular tournaments
  C: 0.7,  // Qualifiers
}
Enter fullscreen mode Exit fullscreen mode

2. Recency Decay

Matches from 6+ months ago contribute less to current rating. This prevents teams that were good a year ago but haven't played recently from staying ranked high.

3. Score Margin

A 2-0 sweep is weighted more than a 2-1 win. Close series suggest teams are evenly matched.

Results

After processing 50,000+ matches across CS2, Valorant, LoL, and Dota 2, the rankings at esport.is/rankings closely match expert consensus while being fully automated.

The system correctly predicted ~62% of match outcomes in backtesting — better than random (50%) and comparable to betting market implied probabilities.

Implementation

Built with TypeScript, running on Vercel serverless functions. Rankings recalculate after every match via webhook from our data pipeline.

Check it out: esport.is/rankings


Have you implemented rating systems? What modifications worked for you?

Top comments (0)