Massey Ratings

Summary

Massey ratings are a method of ranking sports teams based on their performance history, invented by Kenneth Massey. Unlike Elo which updates incrementally after each game, Massey ratings solve a system of linear equations using all available game results simultaneously to produce team ratings.

The Massey ratings are designed primarily to measure past performance, not necessarily to predict future outcomes. Massey himself notes that computer ratings are ignorant of many important factors such as injury, weather, motivation, and other intangibles, and that significant randomness exists in sports outcomes.

The Massey method forms the basis for many computer ranking systems and was part of the Bowl Championship Series (BCS) formula in college football. The website masseyratings.com provides computer ratings for virtually every sport.

Key Concepts

  • Linear system approach: Each game produces an equation: rating_home - rating_away = margin_of_victory. All equations form an overdetermined system solved via least squares.
  • Margin of victory: Massey uses actual score margins, unlike some systems that clip or ignore blowouts
  • Designed for order, not prediction: The official position is that Massey ratings measure achievement, not predictive ability
  • Home advantage: Not inherently included; can be added as a constant offset or separate parameter
  • Colley matrix: Related method by William Colley, similar in spirit but using a different matrix structure (no home adjustment by default)
  • BCM (Bio Hockey Metric): Hockey-specific variant

Formulas

Game equation:
$$R_i - R_j = M_{ij}$$

Where R_i = rating of team i, R_j = rating of team j, M_ij = margin of victory (score difference).

System of equations (matrix form):
$$X \cdot r = m$$

Where X is the design matrix, r is the rating vector, m is the margin vector.

Least squares solution:
$$r = (X^T X)^{-1} X^T m$$

Normalized constraint: Usually add a constraint Σr_i = 0 (ratings sum to zero) or fix one team's rating.

Python Implementation

import numpy as np

def massey_ratings(games):
    """
    games: list of (home_team, away_team, home_score, away_score)
    Returns: dict of {team: rating}
    """
    teams = sorted(set([g[0] for g in games] + [g[1] for g in games]))
    team_idx = {t: i for i, t in enumerate(teams)}
    n_teams = len(teams)
    n_games = len(games)

    # Build system: X * r = m
    X = np.zeros((n_games, n_teams))
    m = np.zeros(n_games)

    for i, (home, away, hs, as_) in enumerate(games):
        X[i, team_idx[home]] = 1
        X[i, team_idx[away]] = -1
        m[i] = hs - as_

    # Solve least squares
    # Add constraint: sum of ratings = 0
    X_aug = np.vstack([X, np.ones(n_teams)])
    m_aug = np.append(m, 0)

    r, _, _, _ = np.linalg.lstsq(X_aug, m_aug, rcond=None)
    return {t: r[team_idx[t]] for t in teams}

# Example usage
games = [
    ('Brazil', 'Argentina', 2, 1),
    ('Brazil', 'Germany', 1, 3),
    ('Argentina', 'Germany', 2, 0),
]
ratings = massey_ratings(games)
print(ratings)

Notes

  • The linear system approach means all games contribute simultaneously — less sensitive to recent form than Elo
  • Margin of victory can be misleading in sports with high variance (football/soccer goals are noisy); clipping blowouts is sometimes done
  • Massey himself explicitly states the ratings measure past performance, not predictive power — this is an important distinction for betting applications
  • For prediction, the ratings can be converted to win probabilities via a logistic transformation: P(A beats B) = 1 / (1 + e^(-(R_A - R_B)/s)) where s is a scale parameter
  • The BCS used a blend of Massey-style computer polls, margin-based systems, and human polls — no single method was dominant
  • For sports betting, Massey ratings can serve as a baseline team strength estimate, but should be combined with other models (Poisson, Elo variants) for better predictive accuracy