z-scores are a metric i like to use when evaluating player performance in a position group. it allows you to put stats on different scales, like completion %, yards per attempt and epa per dropback, on one yardstick, so you can combine them without hand-picking weights. using data from nflverse, give your ai agent this prompt to pull the data, create metric-level z-scores, average them, and build your own composite rating system.
the number of bets you need depends on your price and your edge, not a round number like 1,000. a 4% edge at -110 needs about 2,260 bets before expected profit sits 2 standard errors above zero. at +300 it needs about 7,700. a 2% edge at -110 needs about 9,070.
price sets the noise on every bet, and the edge is squared in the formula, so halving your edge takes about 4x the bets.
the full write-up, with the formula and how to apply it to your own record: bayesratings.com/blog/sports…
wrote up the full breakdown: poisson vs negative binomial, nfl key numbers, and why monte carlo sims depend on the distribution you pick.
bayesratings.com/blog/skewne…
Adam retweeted
Back in 2025, Pat Murphy discussed the leadership and presence Christian Yelich brings to the @Brewers 🫡
“He leads this club. He's way more important than I am. Way more important.”
#WinOurWay
most sports stats aren't bell curves. player points, threes made and mlb runs all have long right tails, so the average sits above the typical game. 56% of nba player games finish under the mean.
brier score is another way to grade a forecast. for each game you take the chance you gave, subtract what happened (1 if the team won, 0 if not), and square it. then average over every game. lower is better, 0 is perfect, and one game can never cost more than 1.
say you give a team 70% and they win: (0.7 − 1)² = 0.09. say you give them 90% and they lose: (0.9 − 0)² = 0.81.
calling every game 50/50 always scores 0.25, so that's the number to beat.
the useful part is that brier splits into three pieces:
- reliability: do your 70% calls actually win about 70% of the time. lower is better.
- resolution: do your forecasts move away from the average when they should. a forecaster who says 50% every game can be perfectly calibrated and still tell you nothing. higher is better.
- uncertainty: how often the team you're forecasting wins overall. it's 0.25 when wins are a 50/50 split, and it isn't up to you.
brier score = reliability − resolution + uncertainty
compared with log loss, brier is gentler on confident misses. a 90% miss costs 0.81 in brier and 2.30 in log loss. log loss cares most about the upsets you were sure wouldn't happen, and brier measures overall error. it's worth checking both.
cheat sheet below, with the live bayesratings.com scorecard for reference
log loss scores how good your probabilities were, not just whether your pick won. each game you get scored on the chance you gave the team that actually won. if you said 70% and they won, the cost is small. if you said 90% and they lost, it's big (2.30 for that one game). lower is better.
the baseline is 0.693. that's what you score by calling every game 50/50, so a forecast has to beat it to be worth anything.
calibration asks whether your percentages come true as often as you said. if you give 100 teams a 60% chance, about 60 of them should win. if only 50 do, you're overconfident.
you need both. a forecast can be calibrated but vague, or bold but wrong. log loss rewards being confident and right at the same time.
cheat sheet below, with real nfl, nhl and mlb numbers from bayesratings.com
Adam retweeted
THE NATIONAL LEAGUE PENNANT IS COMING HOME TO MILWAUKEE
#WinOurWay
i get so scattered when it comes to projects. i start building, get bored, and move one. to help me focus my energy, i turned my bayesian logit ratings model into a site. goal is to refine these models for each league and talk modeling sports in the blog.
bayesRatings.com
nba starts in a couple weeks and everyone loves props. i found an old project and started a rebuild. desktop app for nba props. one model per stat. set the line and compare it to the projection, then check the game log for the trend if you want.
will see how much i can get done with this, before the season starts. will need to review the models and hook up a live odds feed and maybe add in a bet tracker.
project on github. link in comment. clone, give to your coding agent, make changes to the models, add in your current odds feeds.
made some updates to sports-leader-mcp. cleaned up some processes and added get_slate tool to streamline some calls.
it makes two calls: the league scoreboard for that day, and the league injury report.
from the scoreboard it pulls each game’s eventid, start time (utc), home/away team ids and abbreviations, status and score, then consensus betting lines already on that scoreboard: american moneylines, signed homespread (negative = home favored), total, and derived no-vig win probs (home/away, plus draw for soccer).
from the injury report it attaches key out and doubtful players to each team (other statuses are just a count). it also returns a resource link to the full league injuries page.
it does not call every sportsbook. for full per-book lines, that’s still `get_game_odds`.
github.com/WalrusQuant/sport…











