We're open about what our forecasts are built on — the statistics are real, published, and reproducible science. We're deliberately quiet about how the final number gets made. Here's the tour.
01Bayesian team ratings
The core of bayesRatings is a Bayesian Bradley–Terry model fit with Hamiltonian Monte Carlo in Stan. Every team gets a latent strength rating on the logit scale; the chance the home side wins is driven by the rating gap plus a home-advantage term. Heavy-tailed priors shrink ratings toward the league mean, so a fluky 3–0 start doesn't crown a champion in September — and every rating comes with honest uncertainty, not just a point on a leaderboard.
The rating core is deliberately austere: it learns from final scores. That discipline is a feature — scores don't have narratives, hot takes, or recency bias. The layers above it are where the context comes in.
02From ratings to forecasts
Ratings alone don't price a game. A stack of forecasting layers turns team strength into the numbers on the page: projected spreads, team totals, game totals, and win probabilities, each calibrated against years of historical results. Offensive and defensive strength profiles shape how two teams' scoring interacts — a great offense against a bad defense is not the same game as two average units.
03Betting market dynamics
Games aren't played in a vacuum, and they aren't priced in one either. Our forecasts account for betting market dynamics — how lines open, how they move, and what that movement tends to mean. Which signals we extract, and how much weight they carry, is the part of the recipe we keep to ourselves.
04League-specific models
The rating engine is sport-agnostic — it needs nothing but final scores, which is why any league can be piped through it. But every league gets its own model on top: scoring structure, pace, schedule density, home-field size, and market behavior differ between the NFL, the NBA, and a soccer table, and the forecasting layers are tuned per league. NFL is live today; more leagues are on the way.
05Graded and archived
Every forecast we publish is archived at publication time and graded when the game goes final — winners, spreads, and totals, with calibration tracked over time. No deleted picks, no cherry-picked screenshots. The track record is the product.
rating ~ student_t(3, 0, σ)
outcome ~ bernoulli_logit(ratinghome + home_adv − ratingaway)
// the part that's ours
forecast = f(ratings, matchup, market dynamics)