×
How the Hybrid Engine Works
Traditional Elo systems only look at wins and losses, ignoring the chaotic nature of soccer where the better team frequently loses to a lucky bounce. Pure Expected Goals (xG) models ignore the fact that actually finishing chances matters.
This Hybrid xG-Elo system solves this by blending the two. Every match is recalculated to establish a highly accurate historical baseline. MLS teams begin their baseline at 1500, USL Championship teams begin at 1350, USL League One teams begin at 1250, and all lower-division or amateur teams begin at 1200. Open Cup matches integrate all leagues to establish the true mathematical gap between divisions over time.
The Philosophy: Why These Specific Weights?
1. The 70/30 Split (Result vs. xG)
Every match is graded on a blended performance score. 70% of the grade is based purely on the final result (Win, Lose, or Draw). The remaining 30% is based on the team's share of the total Expected Goals (xG) created in the match.
Why? It respects the scoreboard as the ultimate truth, but acts as a "justice system" for variance. If a team dominates 3.5 xG to 0.2 xG but draws 1-1, the model won't punish them as harshly. They are rewarded for creating high-quality chances.
2. The "Travel Tax" (+25 Home Advantage)
Before the math even begins, the Home team receives a temporary +25 point boost to their Elo rating for that specific match.
Why? North American soccer has arguably the most brutal home-field advantage in the world due to massive travel distances, shifting time zones, extreme climate variations, and turf fields.
3. The K-Factor (32)
The K-Factor dictates the maximum number of points a team can realistically swing in a standard match.
4. The Blowout Multiplier
If a team wins by 3 or more goals, a small multiplier is applied to their rating gain. In a power ranking, utterly dismantling an opponent signifies a true gap in quality.
The Formulas
1. Expected Performance (E):
E = 1 / (1 + 10^((Rating_Away - (Rating_Home + 25)) / 400))
2. Blended Actual Performance (A):
A = (0.70 * Match_Result) + (0.30 * xG_Share)
*Match Result = 1 (Win), 0.5 (Draw), 0 (Loss)
3. Rating Update:
New_Rating = Old_Rating + [32 * Blowout_Multiplier * (A - E)]