Zoltar is my computer program that predicts the results of NFL football games. The 2024 season finished a few weeks ago when the slight-underdog Philadelphia Eagles (1.5 points) beat the slight-favorite Kansas City Chiefs by a score of 40-22 on Sunday, February 9, 2025 in Super Bowl LIX.
One morning before work, I figured I’d look at the Las Vegas point spreads. Before I go any further, let me state that in 2024, compared to all previous years, point spreads varied dramatically from the opening line (typically Monday night, just after any Monday night game) to the closing line (just before a game is played, typically Sunday morning but sometimes Thursday or Saturday).
Anyway, I fired up Zoltar and wrote a function like so (Zoltar uses the C# programming language):
static void AnalysisOfPointSpreads(
List listGameResults, string[] teamNamesShort)
{
int[] counts = new int[30];
for (int i = 0; i "lt" listGameResults.Count; ++i)
{
int week = listGameResults[i].week;
int homeID = listGameResults[i].homeID;
double homeSpread =
-1 * listGameResults[i].homeVegasMarginVictory;
if (Math.Abs(homeSpread) == 0.0) ++counts[0];
else if (Math.Abs(homeSpread) == 0.5) ++counts[1];
else if (Math.Abs(homeSpread) == 1.0) ++counts[2];
else if (Math.Abs(homeSpread) == 1.5) ++counts[3];
else if (Math.Abs(homeSpread) == 2.0) ++counts[4];
else if (Math.Abs(homeSpread) == 2.5) ++counts[5];
else if (Math.Abs(homeSpread) == 3.0) ++counts[6];
else if (Math.Abs(homeSpread) == 3.5) ++counts[7];
else if (Math.Abs(homeSpread) == 4.0) ++counts[8];
else if (Math.Abs(homeSpread) == 4.5) ++counts[9];
else if (Math.Abs(homeSpread) == 5.0) ++counts[10];
else if (Math.Abs(homeSpread) == 5.5) ++counts[11];
else if (Math.Abs(homeSpread) == 6.0) ++counts[12];
else if (Math.Abs(homeSpread) == 6.5) ++counts[13];
else if (Math.Abs(homeSpread) == 7.0) ++counts[14];
else if (Math.Abs(homeSpread) == 7.5) ++counts[15];
else if (Math.Abs(homeSpread) == 8.0) ++counts[16];
else if (Math.Abs(homeSpread) == 8.5) ++counts[17];
else if (Math.Abs(homeSpread) == 9.0) ++counts[18];
else if (Math.Abs(homeSpread) == 9.5) ++counts[19];
else if (Math.Abs(homeSpread) == 10.0) ++counts[20];
else if (Math.Abs(homeSpread) == 10.5) ++counts[21];
else if (Math.Abs(homeSpread) == 11.0) ++counts[22];
else if (Math.Abs(homeSpread) == 11.5) ++counts[23];
else if (Math.Abs(homeSpread) == 12.0) ++counts[24];
else if (Math.Abs(homeSpread) == 12.5) ++counts[25];
else if (Math.Abs(homeSpread) == 13.0) ++counts[26];
else if (Math.Abs(homeSpread) == 13.5) ++counts[27];
else if (Math.Abs(homeSpread) == 14.0) ++counts[28];
else ++counts[29];
}
for (int i = 0; i "lt" counts.Length; ++i)
{
Console.WriteLine(i + " " + counts[i]);
}
Console.ReadLine();
}
I scraped the console output and dropped the numbers into Excel, and then made a graph:
There were no huge surprises but a couple of minor surprises. By far the most common point spread was -3.0 or +3.0, which ocurred 46 times. This was mildly surprising because 3.0 allows a push when then favored team wins by exactly 3 points and I assumed this would happen a lot. Note: In Vegas, “Rams -7” means the Rams are favored by 7 points; “Chiefs +3.5” means the Chiefs are underdogs by 3.5 points.
On the graph, the 14.5 entry accounts for point spread greater than 14.0. This happened just once, in the last regular season week, when the Ravens were favored by 15.0 points over the poor sad Browns.
Now this is where the difference between classical statistics and machine learning pops up. The graph analysis is classical statistics, and it’s up to a human to interpret the data in some way. On the other hand, machine learning would use this data to make predictions of some sort. For example, the point spreads of +2.5 or -2.5 and +5 or -5 look anomalous in some way. If I had time, I’d do an analysis to predict the results of betting for those point spread values. But my morning time was up and it was time to go into work.

My system is named after the Zoltar fortune teller machine you can find in arcades. Left: I saw this Zoltar in Las Vegas when I was speaking at a conference.
It’s up to a human to interpret art. This is something I am not good at. But here are two old interesting (to me anyway) paintings with a fortune teller theme.
Center: “The Egyptian Fortune Teller” by Rudolf Ernst (1854-1932). Right: “The Fortune Teller” by Edouard Frederic Wilhelm Richter (1844-1913).

.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.