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.

CLS = Actual Results - Expected Results
(normalized across the league on a -100 to +100 scale)

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)

Expected model: xG and xPTS

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.

8 signals drive the CLS
24% - xPTS Delta
The anchor. Actual points minus expected points from match-level xG simulations.
17% - Finishing Luck
Goals scored minus xG. Are they converting chances or wasting them?
15% - Injury Burden
Total player-games missed due to injury. Teams decimated by injuries are fighting with one hand tied behind their back.
15% - Opponent Scheduling
Average opponent form at time of each match. Consistently facing teams on hot streaks = unlucky draw.
11% - Defensive Luck
xGA minus goals conceded. Are opponents finishing above or below expected against them?
10% - Shot Domination
Outshooting opponents but not winning? The shot ratio vs goal ratio gap.
5% - Discipline
Cards received vs opponents. Significant imbalance suggests referee luck.
3% - Red Card Rescissions
Net red cards overturned by the disciplinary commission (FA / LFP / RFEF). When a card is rescinded post-match, it's an officially admitted refereeing error โ€” as pure a luck signal as exists in football. Low volume (~10-15 per league per season) so small weight, but maximally clean.
Data source: API-Football (xG per match, shots, cards, injuries). Red card rescissions tracked manually in data/soccer-rescissions.json from published FA / LFP / RFEF decisions. Updated daily during the season. Same model for all football leagues (EPL, La Liga, Serie A, Bundesliga, Ligue 1, MLS).
๐Ÿ’

Hockey (NHL)

Expected model: Pythagorean + MoneyPuck xG

We combine Pythagorean expectation (expected wins from goals scored/allowed) with MoneyPuck's expected goals model, which evaluates the quality of every shot attempt.

Pythagorean: Win% = GF2 / (GF2 + GA2)

We normalize for the NHL's loser point system (OT losses = 1 pt) so league totals balance out.

6 signals drive the NHL CLS
25% - Pythagorean Delta
Expected points from goal differential vs actual points.
20% - xG Finishing Luck
Goals scored vs MoneyPuck expected goals. Are they burying their chances?
15% - xG Defensive Luck
Goals allowed vs expected goals against. Is the goalie overperforming?
15% - Close Game Record
Win rate in one-goal games vs 50%. Deviation from 50% = luck.
15% - Shootout Record
Net shootout wins. Shootouts have minimal year-over-year repeatability.
10% - OT Loss Rate
Proportion of losses in OT/SO. High OTL rate = collecting free loser points.
Data source: NHL Official API (standings, game logs) + MoneyPuck (xG, PDO, shooting/save %). Updated daily.
๐Ÿ€

Basketball (NBA)

Expected model: garbage-time-adjusted Pythagorean (Morey exponent) + close-game net margin

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.

Expected Win% = PFadj13.91 / (PFadj13.91 + PAadj13.91)
7 base signals drive the NBA CLS (+ scaled injury)

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.

25% - Pythagorean Delta
Actual wins minus expected wins from garbage-time-adjusted point differential (per-game margin capped at ยฑ15 before aggregating season totals).
17% - Close Game Luck
Continuous signal: 60% shrunk win rate + 40% average net margin in โ‰ค5-point games.
11% - Off 3P Luck
Own 3P makes vs what league-average 3P% on their shot volume would predict. Highest-purity offensive luck.
7% - Off 2P Luck
Own 2P makes vs expected at league-average 2P%. Smaller weight โ€” finishing at the rim is more skill-heavy.
11% - Def 3P Luck
Opponent 3P makes vs expected. Defenses have near-zero control over opponent 3P% once shot locations are held constant.
7% - Def 2P Luck
Opponent 2P makes vs expected. Some defensive skill component (rim protection) so smaller weight.
7% - Opp FT Luck ยท Purest luck signal in basket
Opponent FT makes vs expected at league-average FT%. Defense has literally zero influence โ€” the shooter is alone, defenders must wait. If your opponents shoot 74% from the line vs league-average 77%, that's pure variance in your favour.
15% - Injury Burden (when present, scales base)
Player-games lost to injury. When injury data is available, it takes 15% and the 7 base signals scale to 85%.
Data source: ESPN public API (standings, per-game box scores, offensive shooting stats). Opponent 2PT/3PT/FT totals aggregated from every completed box score. Close-game data from the last 90 days of scores. Updated daily.
โšพ

Baseball (MLB)

Expected model: Pythagorean + Statcast expected stats

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.

xwOBA = expected weighted on-base average (based on contact quality, not outcomes)

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.

4 orthogonal signals drive the MLB CLS
30% - Pythagorean Delta
Actual wins minus expected wins from Bill James' Pythagorean formula (RS^1.83 / (RS^1.83 + RA^1.83)). The anchor signal.
20% - One-Run Game Record
Win rate in one-run games vs the historical .500 norm. Teams regress to ~.500 over time, so deviations are sequencing luck. Independent of Pythagorean.
25% - Batting Luck
wOBA vs xwOBA from Statcast. Are batted balls finding holes or landing in gloves? Based on exit velocity, launch angle, and spray angle.
25% - Pitching Luck
ERA vs xERA from Statcast. Is the staff getting bailed out by defense and sequencing, or burned by bad BABIP despite good contact management?

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.

Data source: MLB Official API (standings, one-run records from splitRecords) + Baseball Savant / Statcast (xwOBA, xBA, xSLG, xERA). Player-level stats aggregated to team level using PA-weighted averages. Updated daily.
๐ŸŽพ

Tennis (ATP / WTA)

Expected model: Dominance Ratio + career-baseline clutch signals

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.

9 signals drive the Tennis CLS
30% - Dominance Ratio Delta
Actual win % vs expected win % from DR. The anchor signal.
12% - Tiebreak Luck
Season tiebreak win rate vs career baseline.
10% - BP Conversion
Break point conversion rate vs career baseline.
10% - BP Saved
Break point save rate vs career baseline.
10% - Deciding Set
Win rate in final-set deciders vs expected.
9% - Opponent Fatigue
Match load of opponents in the 14 days before facing them.
7% - Draw Strength
Average opponent ATP/WTA rank faced over the season.
7% - Schedule Burden
Minutes played accumulated across the season.
5% - Retirement Net
Wins via opponent retirement minus own retirements.
Data source: Jeff Sackmann's tennis_atp / tennis_wta repositories. Match-level detail going back decades โ€” serves/returns, tiebreaks, break points, durations โ€” released under CC BY-NC-SA. All tennis luck signals (DR, clutch baselines, fatigue, draw strength) are computed from this data. Updated weekly during the season.

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:

โ˜  Cursed
Below -40

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.

โ†“ Unlucky
-15 to -40

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.

โ€” Neutral
-15 to +15

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.

โ†‘ Lucky
+15 to +40

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.

โœฆ Blessed
Above +40

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

MetricSportWhat it measures
CLSAllThe 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.
LASAllLuck Adjusted Standings. correctedPts = actualPts โˆ’ luckIndex/5. The CLS is the single source of truth for LAS โ€” no other factors.
xPTS ฮ”FootballActual points minus expected points. A delta of -12 means the team has 12 fewer points than they deserve.
Pyth ฮ”NHL/NBA/MLBActual points (NHL) or wins (NBA/MLB) minus Pythagorean expected value. NBA uses garbage-time-adjusted PF/PA (per-game margin capped at ยฑ15).
xGFootballExpected Goals. The probability-weighted sum of all shots.
xPTSFootballExpected Points from match-level xG simulations.
PythagoreanNHL/NBA/MLBExpected win% from scoring differential. GF^n / (GF^n + GA^n).
xwOBAMLBExpected weighted on-base average from Statcast batted ball data.
xERAMLBExpected ERA stripped of defense and sequencing luck.
Off 3P / Off 2PNBAOwn 3P and 2P makes vs expected at league-avg %. 3P is the highest-variance stat in basketball.
Def 3P / Def 2PNBAOpponent 3P and 2P makes vs expected. Near-zero defensive control on opp 3P% once locations are held constant.
Opp FT LuckNBAOpponent FT makes vs league-avg FT%. Defense has zero influence on free throws โ€” purest luck signal in basketball.
DR (Dominance Ratio)TennisRatio of return points won to (1 โˆ’ serve points won %). Predicts match win rate across large samples.
TB / BP LuckTennisTiebreak win rate and break point conversion/save rate vs player's own career baseline. Isolates variance from clutch skill.
Opp FatigueTennisOpponents' match load in the 14 days before facing the player. Zero skill input โ€” you don't choose how tired your opponent is.
PosAllActual 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

LeagueSourceModelUpdate
โšฝ EPL / La Liga / Serie A / Bundesliga / Ligue 1 / MLSAPI-FootballxG + xPTS (7 signals)Daily
๐Ÿ’ NHLNHL API + MoneyPuckPythagorean + xG + PDO (6 signals)Daily
๐Ÿ€ NBAESPN API (standings + per-game box scores)Garbage-time Pythagorean + close-game net margin + decomposed Off/Def 3P/2P/FT luck (+ injury) ยท 7 base signalsDaily
โšพ MLBMLB Official API + Baseball SavantPythagorean + One-Run Games + xwOBA + xERA (4 orthogonal signals)Daily
๐ŸŽพ ATP / WTAJeff Sackmann โ€” tennis_atp / tennis_wtaDominance Ratio + career-baseline clutch signals (9 signals)Weekly
๐Ÿˆ Football (NFL)nflversePythagorean + EPAComing soon

Football data via API-Football (paid). All other data from free, publicly available sources.