Troll Sports LabMichigan high school sports
Methods

How it works

Troll Sports Lab turns MHSAA game results into a rating for every team, then turns those ratings into odds, spreads, projected scores and season projections. Here is what that means, how we test it, and where it can be wrong.

Short version first. A collapsed section near the bottom has the formulas and settings for people who want them. Jump to the nerdy version.

About Troll Sports Lab

Troll Sports Lab badge: the Mackinac Bridge, a map of the Lower Peninsula, sports balls and charts

Troll Sports Lab makes ratings, win odds and season projections for Michigan high school sports. We are starting with basketball.

The name is a Michigan joke. People who live below the Mackinac Bridge are called trolls, and most of Michigan’s teams live there too. Yoopers welcome. Our mascot is Mac, a troll who loves a good spreadsheet.

This is an independent site. It is not run by the MHSAA or any school, and it is for entertainment only, not for wagering.

The rating

A team’s rating is how many points better it is than the average MHSAA team. A rating of +20 means we would expect that team to beat an average team by about 20 on a neutral floor.

It comes from every game result, and it adjusts for who a team played and where. Beating a strong team by 5 counts for more than beating a weak team by 25. Playing at home is worth a few points, and the rating accounts for that too. Very lopsided scores are counted but capped, so one 90-point blowout does not distort a rating.

Early in the season, before a team has played much, its rating leans on last season. We pull last season’s rating toward average, keeping 70% of it for boys and 80% for girls, because teams change from year to year. As games are played, that starting point fades and the results take over. Ratings are refit every weekend.

Win odds, spreads and projected scores

The difference between two teams’ ratings, plus home court, gives a projected margin. That is the spread. A separate step turns the margin into a win chance, and we check that step against real games so that, for example, teams given 70% really do win about 70% of the time.

Projected scores come from each team’s offense and defense, which we rate separately, blended with how many points each team’s games usually produce. The total is what the two projected scores add up to.

Win totals and the 90% range

To project a team’s season, we play out every game on its schedule 3,000 times. Each win chance is turned into a coin flip weighted by that chance, and we count wins. The average is the projected record.

We also allow for something simple but important: nobody knows exactly how good a team is before it plays. In each simulated season every team is a little better or a little worse than its rating, and that shift stays with it all year. Without this, the ranges come out far too narrow. With it, they are honest.

The 90% range is the span of win totals that held the real result about 9 times out of 10 when we tested it on last season. It is wide in the preseason, around 13 wins. That is not a flaw. It is how uncertain a preseason forecast really is, and it narrows as teams play.

Title odds

The same simulated seasons give conference and division title odds. Teams are ranked by conference winning percentage, and ties for first split the odds evenly. MHSAA schedules do not mark which games are conference games, so we count any regular-season game between two teams in the same conference. That is right for most leagues and can be off for a rematch outside a league schedule. Conferences with divisions show division odds, because a league with several divisions does not have a single title race. The odds use the schedule as listed so far, and they change as games are added.

How we test ourselves

The report card checks the ratings against what actually happened: how often the better-rated team won, how far the projected margins were from the real ones, whether the percentages mean what they say, and how the season projections and 90% ranges held up. Every projection in those tests used only games played before it. Once 2026-27 games are played, the report card tracks those too.

What it can’t do

For the nerds: formulas and settings

Ratings

Ridge regression of game margin on team indicators: +1 for the home team, -1 for the away team, plus a separate home-court term used only when the game was played at a school’s own site. Neutral and tournament games get no home term. Margins are capped at ±100. The ridge penalty is λ = 0.1 + 1.9 × 0.5^(weeks / 3), so it starts at 2.0 and fades toward 0.1 with a three-week half-life. The prior mean for each team is ρ × last season’s end-of-season rating with ρ = 0.7 for boys and 0.8 for girls (girls’ ratings persisted with a correlation of about 0.88 from one season to the next). Ratings are centered on the MHSAA-listed teams. Forfeits and non-varsity games are excluded.

Odds and margins

Mid-season: z = margin / √(11.6² + 2.5 × Var), where Var is the variance of the rating difference, and P(home win) = logistic(a·z + b·home), with a about 2.0 for boys and 2.4 for girls, fit on January 1 to February 8 predictions made before each game. The projected margin is about 0.95 to 0.99 × (rating difference + home term) plus a small home adjustment, with the scale fit on the same games. Preseason: P = logistic(k × projected margin + c × home) with k between 0.08 and 0.09 for both sports, fit on the first three weeks of 2025-26 using only 2024-25 ratings.

Totals

Team points are modeled as c + offense(team) − defense(opponent) + home term by ridge regression (penalty 0.1). The projected total blends that with each team’s average game total, with an intercept and blend weights fit on past predictions and refit separately for the preseason and for mid-season.

Game noise in the simulator

A game’s final margin is the projected margin plus noise from a two-part normal mixture: 70% of the time a core component whose scale is solved for each game so that the simulated win rate equals the model’s win probability, and 30% of the time a wide component with a standard deviation of 16. That shape reproduces real tail behavior in our back-test: misses of 30 or more points happened about 1.9% of the time in real games and about 1.9% in the simulator, and 40 or more about 0.4% in both. Total points get independent normal noise with a standard deviation of about 14 to 18 points.

Season simulations

3,000 seasons per sport. In each, every team draws a strength shift u ~ N(0, 1.0²) on the log-odds scale. A game’s win probability is logistic(logit(p₀) + u_home − u_away), where p₀ is the model’s win chance, and then it is a Bernoulli draw. The value 1.0 was chosen so that the 80% and 90% ranges would contain the real total about 80% and 90% of the time in a full-season back-test from December 1: with it, the 80% range held 82% (boys) and 83% (girls), and the 90% range held 91% and 92%. Without it they held 52% and 56% for the 80% range, and 61% and 65% for the 90% range. Title odds use conference or division winning percentage across the simulated seasons, ties split evenly, with conference games defined as regular-season home-court games between two teams in the same conference.

Things we tried that did not help

Back-test numbers

TestBoysGirls
Winners picked right, February 9 on81.8%84.9%
Average spread miss, February 9 on9.4 pts9.2 pts
Winners picked right, first three weeks, prior only70.1%74.4%
Average spread miss, first three weeks, prior only14.8 pts16.1 pts
Average miss on final wins, projected from December 13.5 wins3.1 wins

Known limits of the method: the calibrations come from one season, home advantage is treated as the same for every team, strength uncertainty is the same for every team, and the conference-game rule above is a heuristic.