This summer, I’m working on a few projects for this site including a new rating and prediction system. I’ll be rolling that out for the college football and NFL seasons, and I’ll also use it for the NHL and the NBA seasons this winter.
I’m more familiar with baseball analytics than other sports whereas my approach to preseason ratings in other sports is simplistic. I start with the final ratings from last season. Once preseason games are played, I’ll add those into the ratings. And when the regular season gets going, I decrease the impact of last season’s games and preseason games on the ratings. That way, once we’re a few weeks into the regular season, the ratings are determined almost entirely by games played in the current regular season.
One of the lessons from my experiments last season is that there are always a few big surprises when a new season gets underway. A fine example is last season’s Baltimore Ravens, who looked like a Super Bowl contender in the preseason, then proceeded to dig themselves a deep hole in the first few weeks of the regular season. If I weight last season and the preseason too heavily, the computer ratings won’t pick up that a team like the Ravens just isn’t nearly as good as the preseason ratings said they were.
But last fall’s college football season is an example of where this can go awry. Florida State was dominant against Alabama to open the season and looked almost unbeatable after three games. But if the ratings were influenced too much by those first three games, they’d have greatly overrated a team like Florida State. And even the Baltimore Ravens weren’t as inept as they looked after the first few weeks of the NFL season. If there’s a lesson here, it’s that I actually want to be somewhat conservative and not let my ratings overreact to the first few weeks of the season.
How does it all work?
My ratings begin by assuming nothing at all about any of the teams. I set each team’s rating to zero. And I also set the overall home advantage to zero. Then I let the computer go through and predict the outcome of every game that’s been played to date. It’s only concerned with the margin of victory, which I predict by taking the home team’s rating, adding the home advantage (which is zeroed out for a neutral site game), and subtracting the away team’s rating.
The first time through, this will predict that every game ends in a tie. That’s a truly horrible prediction, of course. For a team that performed worse than their rating of zero, then I slightly lower their rating. If a team played better than their rating of zero, then I nudge their rating upward slightly. And I also adjust the home advantage to try to improve the predictions. My program goes through this process tens of thousands of times, each time bumping each team’s rating up or down slightly, and also adjusting the home advantage slightly.
My goal is to find the combination of ratings for each team and the league wide home advantage that best predicts the outcomes of the games that have already been played. Once it gets to the point where it’s really hard to improve the predictions by adjusting the team ratings or the home advantage, then I stop.
There’s a bit more complexity to the algorithm, and it’s necessary to get accurate results when I do things like including the top teams from college football’s FBS in the same ratings as teams from Division III. But that’s a general description of how my ratings are calculated, and I use a similar process for offense and defense ratings.
What’s next?
Last year, I was making tweaks to my software almost right up until the kickoff of the first college football games, trying to improve the accuracy. I made a lot of last minute changes to my software, and I never ended up going back and cleaning up the code later on. So the code is a bit of a mess. Actually that’s probably an understatement, and it’s also more complex than it needs to be. I’m in the process of rewriting my software to make it simpler and easier to understand. Hopefully it’ll also run faster when I get done. I’ve explored rewriting this in C instead of using Python, but I’m not sure I want to mess with the complexity of doing some tasks in C, even if it would run a lot faster. So for now, I’m sticking with Python but will try to make things more efficient where I can.
One idea I’m pondering over is that baseball isn’t the only sport with “park factors”. In baseball, some stadiums like Coors Field in Denver tend to inflate how many runs are scored. That will affect the ratings that I assign to each team. But baseball isn’t the only sport with park factors. A fine example is the 1999-2001 St. Louis Rams, the Greatest Show on Turf, a team that scored a tremendous amount of points and benefited from the speed of playing on turf in the controlled environment of a domed stadium. That generally inflated the amount of points a bit compared to playing in harsh conditions like a snowstorm in Cleveland or Buffalo. Even in hockey, ice conditions in different arenas affect the scoring a bit, even if it’s a much smaller impact than in baseball. I’d like to add park effects and arena effects for sports besides baseball and test the impact this season. I don’t think there’s enough data to reliably do this in college football, but it’s definitely possible for NFL, NHL, and NBA ratings. It might not have a huge impact on the ratings, but stadium factors do make a difference.
I’d also like to experiment with the concept of “recent” ratings, where I give more weight to games played in recent weeks and lower the weight for games played at the start of the season. The idea is that if a team is dominant during the first two or three weeks of the season, then loses their star quarterback to an injury and doesn’t play as well, those first few games probably aren’t a great indicator of the strength of that team later in the season. This is tricky, but it’s one of the experiments I plan to run this season.
We’re a few weeks away from the start of NHL preseason games, but here’s a quick look at the preseason ratings. They know absolutely nothing about trades and free agent signings this summer, but this is roughly the starting point for the 2026-27 ratings.
Predictive Ratings
Home advantage: 0.147 goals
Mean score: 3.098 goals
Rank Rating Team Offense Defense
1 1.213 Colorado Avalanche 0.496 0.713
2 1.007 Carolina Hurricanes 0.635 0.383
3 0.822 Tampa Bay Lightning 0.374 0.451
4 0.724 Buffalo Sabres 0.464 0.251
5 0.530 Dallas Stars 0.204 0.326
6 0.476 Montreal Canadiens 0.315 0.156
7 0.460 Minnesota Wild 0.326 0.127
8 0.351 Boston Bruins 0.169 0.184
9 0.338 Pittsburgh Penguins 0.490 -0.145
10 0.326 Ottawa Senators 0.107 0.227
11 0.284 Philadelphia Flyers -0.111 0.394
12 0.207 Vegas Golden Knights 0.115 0.099
13 0.188 Washington Capitals 0.094 0.103
14 0.182 Utah Mammoth 0.136 0.057
15 -0.006 Columbus Blue Jackets 0.012 -0.021
16 -0.070 Edmonton Oilers 0.237 -0.295
17 -0.080 New York Islanders -0.212 0.138
18 -0.122 Detroit Red Wings -0.086 -0.037
19 -0.126 Anaheim Ducks 0.260 -0.382
20 -0.131 New York Rangers -0.268 0.138
Rank Rating Team Offense Defense
21 -0.140 New Jersey Devils -0.185 0.061
22 -0.251 Florida Panthers -0.100 -0.160
23 -0.296 Nashville Predators -0.165 -0.128
24 -0.377 Winnipeg Jets -0.254 -0.138
25 -0.408 St. Louis Blues -0.352 -0.053
26 -0.484 Los Angeles Kings -0.454 -0.029
27 -0.532 Seattle Kraken -0.375 -0.146
28 -0.593 San Jose Sharks -0.090 -0.506
29 -0.648 Toronto Maple Leafs -0.044 -0.610
30 -0.702 Calgary Flames -0.608 -0.089
31 -0.897 Chicago Blackhawks -0.604 -0.295
32 -1.312 Vancouver Canucks -0.540 -0.773
I’ll be doing this for other sports this fall and winter, and hopefully posting a lot more articles in the coming weeks. I haven’t watched a whole lot of hockey the past couple of seasons, and I have a lot of hope that my Blues will be better this winter, so I’m looking forward to paying a lot more attention to the upcoming hockey season! College football and NFL ratings will be out in the next few days.
I fear that baseball will be locked out this winter, but I’m also planning to build a new system from scratch anyway to predict player statistics in upcoming seasons. I’d also like to try to link this to an economic model that suggests how much money a player’s expected production ought to land them in free agency. Who knows what MLB’s economic system will look like if there ends up being a salary cap? The economic model could be totally wrong, but I’d still like to build that in even if it requires adjusting for the new collective bargaining agreement. I’ve got a lot of ideas for this, and I’ll be creating a Github repository for my code as I build my baseball prediction system. I’m not sure what will work, but let’s do some experimenting this fall and winter, and try to build a new prediction system that improves upon some of my prior attempts.
Thanks for reading! Please be sure to subscribe if you’d like to see more ratings. All my content here is available for free, and I’ll be keeping it that way through the upcoming seasons and hopefully forever.


