Predicting NBA games: how we think about it at Buzzer Beater
Match prediction has been part of Buzzer Beater's DNA since the original university thesis in 2018. Here's our thinking on what matters — without giving away the details.
The original idea behind what became Buzzer Beater was a prediction model for NBA games. That was 2018, a university thesis, and the algorithm was theoretical. Eight years later, the beta is nearly ready.
We're not going to publish the full methodology. Here's how we think about predicting basketball games.
The problem with simple models
The first instinct when building a prediction model is to rank teams by their stats and pick the better team. Win percentage, points per game, defensive rating — feed them in, let the numbers decide.
This works, roughly. A top-five team will beat a bottom-five team more often than not, and a basic model will be right a reasonable amount of the time. The problem is that a decent accuracy rate over a large sample tells you almost nothing useful about any individual game.
Basketball is a sport with high variance. Upsets are common. Form fluctuates. And critically, the rosters that show up on game night are often different from the ones reflected in the season averages.
Player availability is the most underrated input
This is the insight that has shaped Buzzer Beater from the start. Which players are actually going to be on the court is the single most impactful variable that changes closest to tip-off.
Season averages assume a team is at full strength. When a first-option scorer is ruled out an hour before the game, those averages become misleading. The shift in shot distribution, the adjustments the opponent can make, the minutes falling to less reliable players — all of it matters in ways that a static season statistic won't capture.
Tracking this accurately and close to game time is harder than it sounds. Status changes happen late. Some teams submit their final updates right up to the wire. Getting this right is foundational — if the availability data is wrong, everything built on top of it is wrong too.
What we think matters
Without going into specifics, the factors we weight most heavily are:
Who is actually playing. Not the team's season average, but an adjusted view based on the confirmed roster for that specific game. An unavailable star changes the picture considerably.
Recent form over full-season averages. A team's last fifteen games tells you more about where they are right now than their numbers from October. Trades, returning players, and tactical shifts all move the needle mid-season.
Matchup specifics. Pace compatibility, perimeter vs. paint tendencies, how certain defensive styles match against certain offences. Some teams lose to opponents they should theoretically beat because the stylistic matchup doesn't favour them.
Home court. The data consistently shows a home advantage in the NBA. The size varies by team and situation, but it's real — and it compounds when the away team is already fatigued.
Back-to-backs and schedule congestion. A team playing their second game in two nights — particularly on the road — is a different proposition from the same team fully rested. Fatigue affects rotation depth, late-game execution, and the ability to sustain defensive intensity across four quarters. We treat schedule context as a meaningful input, not a footnote.
What we track but present separately
Travel distance is something we find genuinely interesting as a signal of physical wear. A team that has crossed several time zones and covered thousands of kilometres across multiple cities in a short window carries fatigue that doesn't show up in their season stats.
We don't fold this directly into the prediction model at this stage, but we do surface it in the platform — the itinerary view lets you see how much ground each team has covered recently, which gives a useful feel for how fresh or stretched a squad might be heading into a game. It's the kind of context that's worth having in front of you when you're forming your own view.
What we're not chasing
Referee assignments and altitude are real factors that some analysts track. We're not dismissing them, but for a beta model we're focused on the variables with the clearest and most consistent signal. Adding complexity for marginal gains tends to make a model harder to reason about without making it meaningfully better.
We're also not trying to predict exact scores. The goal is probability — the likelihood each team wins, and the expected range of outcomes. That's more honest about what a model can actually do, and more useful when forming a view on a game.
What the beta will look like
The prediction feature will surface before each game — a breakdown of the key factors, a probability estimate, and the variables that could shift the outcome either way. It's designed to inform your own thinking, not replace it.
Confidence levels will be explicit. A game between two healthy, evenly matched teams with similar recent form is harder to call than one where a team has three starters out. The model should reflect that uncertainty.
If you want to follow its progress, the about page has the full development timeline.
J Palomino
Buzzer Beater · London, UK