Kick-Off! Quasi-Arbitraging NFL Markets [Code Included]
We tried to play fair, but they've left us no choice.
In the last major sport season (MLB), we built machine learning models to help us predict game outcomes (e.g., team A will defeat team B), as well as the outcomes for player proposition bets (player X will record a valid hit in this game):
The experiment was a success, but we came to an important realization:
Our model and the sportsbook's model are very similar. While this sounds like a good thing, it isn’t:
If both the sportsbook and our model agree that the probability of Shohei Ohtani to score a home run today is 25%, this means that the fair value odds of the bet would be +300, meaning we would make $300 for every $100 bet.
However, the sportsbook is a business, so it wouldn’t set the line at that value — it would add a house edge (the “vig”) which creates the book’s profit. So, instead of the bet being available at +300, it would be available at +275 or even lower. When converted back into implied probability, this increases the probability of Shohei recording a hit to ~26.6%.
This 1.6% difference may seem trivial at first. But to see why it isn’t, let’s walk through an example:
If we take 100 bets, all with a probability of 25% and thus fair odds of +300, here is our expected value:
EV = (.75*-100) + (.25*300) = 0
So, it may not be a theoretical profit, but we would expect to at least break even. Now, let’s see the expected value including the house edge.
EV = (.75*-100) + (.25*275) = -6.25
This small adjustment means that with every bet we take, we are actually expected to lose money, even if we are getting the bets correct. (Disclaimer: a negative EV calculation doesn’t necessarily mean the approach is unprofitable, especially when factoring streaks and varying probabilities — it just represents a rough number for comparison)
Our original goal was to just play fair and honestly. We’d get the bets right, collect a fair wage, then ride off into the sunset until the next season.
But clearly, we cannot apply just tactics to an unjust opponent.
So, this season, we’re getting serious.
Introducing: The Quasi-Arbitrage
In sports betting, the traditional form of arbitrage is captured by using different sportsbooks to take opposing positions on the same bet. Let’s see an example:
We are already familiar with MLB, so refer to the second row. We have the ability to bet on Javier Baez to record 1 or more hits on the BetRivers sportsbook for a price of -134. Conversely, we have the ability to bet on Javier Baez to record 0 hits for a price of +135.
There are only 2 possible outcomes for this; he either hits the ball or doesn’t. However, by purchasing each contract at the corresponding prices, a 0.18% profit is guaranteed.
In this case, we would bet $100 on the -134 bet, and $74.31 on the +135 bet, since both amount to a payout of $174.63:
If he does record a hit, we paid -134, so if we bet $100 we receive a profit of $74.63
we then lose on the other bet, which we paid $74.31 for, so our net profit is $0.32
If he doesn’t record a hit, we paid +135, so if we bet $74.31, we receive a profit of $100.32
we then lose on the other bet, which we paid $100 for, so our net profit is $0.32
Many people still actively do this, but due to the abnormally small profits and logistical complexity (having enough cash/crypto at dozens of books), you need to constantly be doing it with relatively large amounts to make it worthwhile.
So, with this as the starting inspiration, let’s add our own, proprietary touch.