Zoltar is my computer program that predicts NFL football game results against the Las Vegas point spread. For a particular game, Zoltar predicts which team will win and by how many points, for example, “Zoltar predicts the Rams will beat the Lions by 4 points.” Zoltar does not predict specific scores.
Zoltar is an extremely interesting but extremely complex system. Because Zoltar is so complicated, there are many parts of the various algorithms to explore and tinker with.
The 2024 Zoltar recommended a bet only when there is a large difference of opinion between the Zoltar prediction and the Vegas prediction/point-spread. If Zoltar and Vegas agree relatively closely, then there’s not enough evidence to recommend a bet.
The 2024 Zoltar uses a single global threshold value that determines if the difference of opinions is large enough to recommend a bet. The single threshold is typically 3.0 points. For example, of both Zoltar and Vegas thinks the Broncos will win, but Zoltar likes the Broncos more than 3.0 points than Vegas does, Zoltar would recommend a bet on the favorite Broncos, thinking the Broncos will cover the spread.
For the 2025 season, I’m investigating using six granular thresholds that correspond to six possible difference of opinion scenarios. The logic is quite tricky and difficult to implement, which is why I haven’t coded up the idea before.
In software development, there are some problem scenarios where you know you’ll need x hours of absolutely uninterrupted time (where x depends on the task). During development, you have a bunch of context in your mind — variable names, algorithm details, and so on — and if you are interrupted, you lose the context and then when you restart the development process, it takes many minutes (perhaps even over an hour) to remember where you where and recall all the context. To implement Zoltar multiple betting advice thresholds, I knew I’d need a block of at least 12 hours of uninterrupted time, which doesn’t happen for me very often.
Here’s the idea in pseudo-code:
if Zoltar and Vegas both like the Home team, but Zoltar
likes Home team Thresh_A more than Vegas does then:
bet on Home favorite team (Zoltar thinks Home favorite
will cover spread)
else if Zoltar and Vegas both like the Home team, but Zoltar
likes Home team Thresh_B less than Vegas does then:
bet on Visitor underdog team (Zoltar thinks Home favorite
will not cover spread)
else if if Zoltar and Vegas both like the Visitor team,
but Zoltar likes Visitor team Thresh_C more than Vegas
does then:
bet on Visitor favorite team (Zoltar thinks Visitor
favorite will cover spread)
else if Zoltar and Vegas both like the Visitor team,
but Zoltar likes Visitor team Thresh_D less than
Vegas does then:
bet on Home underdog team (Zoltar thinks Visitor
favorite will not cover spread)
else if Zoltar likes the Home team but Vegas likes the
Visitor team, and the difference of opinion is more
than Thresh_E then:
bet on Home underdog team (Zoltar thinks Home
underdog will win outright or Visitor favorite
will not cover spread)
else if Zoltar likes the Visitor team but Vegas likes the
Home team, and the difference of opinion is more than
Thesh_F then:
bet on Visitor underdog team (Zoltar thinks Visitor
underdog will win outright or Home favorite will not
cover spread)
else
no bet (Zoltar and Vegas agree closely on which
team will win)
Example. Suppose the Rams (visitor team) are playing at the Bears (home team). The Vegas point spread is “Rams -5.5”, meaning Vegas thinks the visitor Rams will win by more than 5.5 points. Zoltar predicts the Rams will win, but just by 1 point. The difference of opinion is 4.5 points. If Thresh_B is set to 2.0 points, then the difference of opinion is large enough, so Zoltar recommends a bet on the home underdog Bears because even though both Zoltar and Vegas think the Rams will win, Zoltar thinks the Rams won’t win by enough points to cover the point spread.
The logic for determining if a bet wins or loses is not entirely trivial. But that’s another topic.
I took a first stab at implementing multiple advice thresholds, using the 2024 NFL data. See the screenshot above.
Good fun, but there’s a lot more exploring and coding to do to be able to use this technique for the 2025 NFL season.

My prediction system is named after the Zoltar fortune teller machine you can find in arcades. I asked three different AI text-to-image tools (Stable Diffusion, Adobe, Canva) to generate “a robot fortune teller wearing a red dress”. The three images looked too much “fortune teller” and not enough “robot” to suit my expectations. But that’s why I create software systems instead of creating art.

.NET Test Automation Recipes
Software Testing
SciPy Programming Succinctly
Keras Succinctly
R Programming
2026 Visual Studio Live
2025 Summer MLADS Conference
2026 DevIntersection Conference
2025 Machine Learning Week
2025 Ai4 Conference
2026 G2E Conference
2026 iSC West Conference
You must be logged in to post a comment.