How the CURSD Luck Score (CLS) Measures Luck in Sports
The methodology behind the CLS, sport by sport, and what each number means.
The Core Principle
Every sport has a way to measure what should have happened vs what actually happened. A team that outperforms expectations is lucky. A team that underperforms is unlucky.
The "expected results" model is different for each sport, but the principle is always the same: how many points or wins does a team deserve based on what happened on the field/ice/court? If they have fewer than expected, they're unlucky. If they have more, they're lucky.
How It Works Per Sport
Football (Premier League, La Liga, Serie A, Bundesliga, Ligue 1, MLS)
Every shot in football has a probability of being a goal based on its location, angle, body part, and game situation. This is called xG (Expected Goals). A penalty = ~0.76 xG. A 30-yard shot = ~0.03 xG.
For each match, both teams' xG is used to estimate win probabilities, which converts into xPTS (Expected Points). Sum it over a season and you know what the team deserves. The same model applies to all football leagues we cover.
Hockey (NHL)
We combine Pythagorean expectation (expected wins from goals scored/allowed) with MoneyPuck's expected goals model, which evaluates the quality of every shot attempt.
We normalize for the NHL's loser point system (OT losses = 1 pt) so league totals balance out.
Basketball (NBA)
The Morey exponent (13.91) is much higher than hockey (2) because basketball is the most skill-driven major sport. Two recent refinements: (1) each game's point differential is capped at ยฑ15 before aggregating season PF/PA, which kills the blowout distortion when a team coasts in Q4; (2) the close-game signal now blends shrunk win rate with average net point margin in โค5-point games โ two teams both 10-8 in close games can differ wildly if one wins them by +4 avg and the other by +1.
Shooting luck is decomposed into 5 orthogonal components โ 3P and 2P separately on both sides of the ball, plus opponent FT%. Rationale: 3P% is the highest-variance stat in basketball (year-to-year team correlation โ0.15 offense, โ0.05 defense โ almost pure noise). 2P% is more skill-heavy. Opp FT% is maximally clean luck since defense has zero influence on a free throw once the foul is called.
Baseball (MLB)
Baseball's Pythagorean expectation (exponent 1.83) estimates expected wins from runs scored and allowed. We enhance this with Statcast data from Baseball Savant, which uses exit velocity and launch angle to calculate what should have happened on every batted ball.
A team hitting line drives right at fielders all season has a high xwOBA but low actual wOBA - that's batting luck. Similarly, xERA measures pitching quality independent of defensive luck and sequencing.
Early in the season, Statcast weights ramp up as sample size grows (full weights at 40+ games). Pythagorean carries more weight in the first few weeks until Statcast stabilizes.
Tennis (ATP / WTA)
Tennis doesn't have xG. Instead, each player's expected win rate is derived from their Dominance Ratio (DR), the ratio of return points won to the opponent's return points won. DR predicts win rate remarkably well across large samples. A player whose actual win % is far from their DR-implied expected win % is either getting bounces or losing them.
For clutch signals (tiebreaks, break points), each player is compared to their own career baseline, not tour average. Consistent clutch performers (Djokovic, Sinner) don't get flagged as "lucky" for doing what they always do. Only deviations from their own norm count.
Luck Tiers
After computing the raw luck score, we normalize it across all teams in the league using z-scores and scale to -100 to +100 using a multiplier of 33 ร โ(matches/season). The square-root scaling reflects that statistical reliability grows with the square root of the sample size โ early-season scores are naturally attenuated, then converge to full expression as the season matures. Teams are then assigned to one of five tiers:
Historic bad luck. This team is being systematically robbed. Their record is significantly worse than their performance warrants. Strong regression expected - they're almost certainly better than their table position suggests. Think of a team that hits the post 15 times, loses 8 one-goal games, and has 3 goals disallowed by VAR. That's Cursed.
Meaningfully underperforming. Roughly 2-4 wins below true talent level. Things aren't going their way, but it's not catastrophic. A normal season's worth of bad breaks. Regression is likely but not guaranteed in the short term.
Results match performance. This team is where they deserve to be. Some noise in either direction, but nothing systematic. Their record is an honest reflection of their quality.
Overperforming. 2-4 wins above true talent. They're winning close games, opponents are missing chances, and bounces are going their way. Enjoy it - the data says this won't last.
Unsustainably fortunate. This level of overperformance almost never persists from one season to the next. The gap between results and process is so large that regression isn't just likely - it's almost certain. These teams are playing with house money.
Key Terms
CURSD Luck Score (CLS)
The composite score from -100 (deeply cursed) to +100 (extremely blessed). Combines multiple sport-specific signals, each z-scored across the league and weighted. A score of 0 means results match performance exactly.
Luck Adjusted Standings (LAS)
A re-ranking of the league table that removes measured luck. Formula: correctedPts = actualPts - luckIndex/5. Teams are then re-sorted by correctedPts. The CLS is the single source of truth for LAS โ no other factors are used. A deeply cursed team (luckIndex -60) gets +12 pts/wins added back, moving them up; a blessed team (+50) loses 10, moving them down.
xG (Expected Goals)
The probability that a shot results in a goal based on its location, angle, body part, and game situation. A penalty = ~0.76 xG. A 30-yard shot = ~0.03 xG. Summed over a match to measure chance quality.
xPTS (Expected Points)
Expected points from simulating each match thousands of times using both teams' xG. More robust than raw xG because it captures match context - a 1.5 vs 1.4 xG game is much closer than a 3.0 vs 0.5 one.
Pythagorean Expectation
A formula estimating expected win percentage from scoring differential. GF^n / (GF^n + GA^n). The exponent varies by sport: 2 for hockey, 1.83 for baseball, 13.91 for basketball. Invented by Bill James and validated across 40+ years of data.
Z-Score
A statistical measure of how far a value is from the league average, in units of standard deviation. A z-score of -2 means the team is 2 standard deviations below the mean - very unusual.
Regression to the Mean
The tendency for extreme performance (good or bad) to move back toward average over time. A 'Cursed' team will almost always improve the following season without changing anything, because luck balances out.
xwOBA (Expected Weighted On-Base Average)
A baseball metric from Statcast that measures the expected offensive output of every batted ball based on exit velocity and launch angle, independent of where fielders happen to be standing.
xERA (Expected ERA)
Expected Earned Run Average based on the quality of contact allowed by pitchers. Strips out defense, sequencing, and BABIP luck to isolate true pitching performance.
eFG% (Effective Field Goal Percentage)
A basketball shooting metric that adjusts for the extra value of three-pointers. eFG% = (FGM + 0.5 * 3PM) / FGA. Comparing actual eFG% to expected eFG% from shot locations reveals shooting luck on both sides of the ball.
Defensive Shot Quality Luck
Opponent eFG% allowed minus expected opponent eFG% from the 2PT/3PT mix opponents took. Once shot locations are held constant, team effects on opponent make rate are essentially noise (Dean Oliver, Pelton, Cleaning the Glass). The residual is the defensive luck component.
Metrics by Sport
| Metric | Sport | What it measures |
|---|---|---|
| CLS | All | The composite score from -100 to +100. Negative = unlucky, positive = lucky. Normalized across all teams/players in the league. Attenuated early-season by โ(matches/season) to reflect lower statistical confidence. |
| LAS | All | Luck Adjusted Standings. correctedPts = actualPts โ luckIndex/5. The CLS is the single source of truth for LAS โ no other factors. |
| xPTS ฮ | Football | Actual points minus expected points. A delta of -12 means the team has 12 fewer points than they deserve. |
| Pyth ฮ | NHL/NBA/MLB | Actual points (NHL) or wins (NBA/MLB) minus Pythagorean expected value. NBA uses garbage-time-adjusted PF/PA (per-game margin capped at ยฑ15). |
| xG | Football | Expected Goals. The probability-weighted sum of all shots. |
| xPTS | Football | Expected Points from match-level xG simulations. |
| Pythagorean | NHL/NBA/MLB | Expected win% from scoring differential. GF^n / (GF^n + GA^n). |
| xwOBA | MLB | Expected weighted on-base average from Statcast batted ball data. |
| xERA | MLB | Expected ERA stripped of defense and sequencing luck. |
| Off 3P / Off 2P | NBA | Own 3P and 2P makes vs expected at league-avg %. 3P is the highest-variance stat in basketball. |
| Def 3P / Def 2P | NBA | Opponent 3P and 2P makes vs expected. Near-zero defensive control on opp 3P% once locations are held constant. |
| Opp FT Luck | NBA | Opponent FT makes vs league-avg FT%. Defense has zero influence on free throws โ purest luck signal in basketball. |
| DR (Dominance Ratio) | Tennis | Ratio of return points won to (1 โ serve points won %). Predicts match win rate across large samples. |
| TB / BP Luck | Tennis | Tiebreak win rate and break point conversion/save rate vs player's own career baseline. Isolates variance from clutch skill. |
| Opp Fatigue | Tennis | Opponents' match load in the 14 days before facing the player. Zero skill input โ you don't choose how tired your opponent is. |
| Pos | All | Actual league standing. Compare to LAS to see the luck gap. |
Can You Trust It?
Regression to the mean
The strongest validation: teams with extreme CLS values almost always regress the following season. A "Cursed" team typically improves by 5-10 points without changing anything. A "Blessed" team typically drops. This has been observed consistently across decades of data in every sport.
Non-persistence
A good luck metric should NOT persist year-over-year. If a team is "unlucky" every season, the metric is measuring skill, not luck. The CLS has near-zero autocorrelation (r < 0.15), meaning this season's luck tells you almost nothing about next season's.
Academic foundation
Built on established research: Bill James' Pythagorean expectation (1980, validated across 40+ years), StatsBomb's xG model(industry standard used by professional clubs), Dean Oliver's basketball analytics, and Michael Mauboussin's skill-luck decomposition framework.
The feel test
If a fan looks at the CLS and says "that doesn't feel right," we have a problem. The algorithm is designed so the anchor metric (xPTS or Pythagorean) captures the big picture, and supporting signals explain why. The result should match what fans intuitively sense when they watch the games.
Data Sources
| League | Source | Model | Update |
|---|---|---|---|
| โฝ EPL / La Liga / Serie A / Bundesliga / Ligue 1 / MLS | API-Football | xG + xPTS (7 signals) | Daily |
| ๐ NHL | NHL API + MoneyPuck | Pythagorean + xG + PDO (6 signals) | Daily |
| ๐ NBA | ESPN API (standings + per-game box scores) | Garbage-time Pythagorean + close-game net margin + decomposed Off/Def 3P/2P/FT luck (+ injury) ยท 7 base signals | Daily |
| โพ MLB | MLB Official API + Baseball Savant | Pythagorean + One-Run Games + xwOBA + xERA (4 orthogonal signals) | Daily |
| ๐พ ATP / WTA | Jeff Sackmann โ tennis_atp / tennis_wta | Dominance Ratio + career-baseline clutch signals (9 signals) | Weekly |
| ๐ Football (NFL) | nflverse | Pythagorean + EPA | Coming soon |
Football data via API-Football (paid). All other data from free, publicly available sources.