American odds of -110 imply a 52.38% breakeven probability. The vig (overround) is the sum of implied probabilities minus 1 — a standard -110/-110 market carries a 4.76% vig. Remove the vig before feeding sportsbook prices into any agent model. Four removal methods exist; Shin’s method is the most accurate.
Why This Matters for Agents
An autonomous sports betting agent’s first task after pulling lines from a sportsbook API is converting raw odds into clean probabilities. Raw odds contain the bookmaker’s margin — the vig — baked directly into the numbers. An agent that treats -110 odds as a 52.38% probability is systematically overestimating every outcome. Garbage in, garbage out.
This is Layer 3 — Trading. Odds conversion and vig removal sit at the very start of the agent’s decision pipeline, immediately after data ingestion. The agent pulls lines from The Odds API or a sportsbook’s direct feed, strips the vig to get true implied probabilities, then passes those to Layer 4 for comparison against its own model. The Prediction Market Math 101 guide covers the prediction market side of this same problem — this guide covers the sportsbook side, where the math is messier because sportsbooks deliberately obscure their margins inside odds formatting.
The AgentBets Vig Index tracks live overround across dozens of sportsbooks. An agent that routes bets to the lowest-vig book on each market increases long-run EV without improving its model at all — pure execution alpha.
The Math
The Three Odds Formats
Every sportsbook in the world uses one of three formats. All three encode the same information — implied probability and payout — in different notation.
American odds (moneyline): The standard in the US. Two cases:
- Negative (-200): The amount you risk to win $100. Risk $200, win $100, collect $300 total.
- Positive (+150): The amount you win if you risk $100. Risk $100, win $150, collect $250 total.
Decimal odds: The standard in Europe and Australia. The number represents total return per $1 wagered, including your stake.
- 2.50 means $1 wagered returns $2.50 total ($1.50 profit + $1.00 stake).
- 1.50 means $1 wagered returns $1.50 total ($0.50 profit + $1.00 stake).
Fractional odds: The standard in the UK. Expressed as numerator/denominator where the numerator is profit and denominator is stake.
- 3/2 means $3 profit per $2 staked (equivalent to decimal 2.50, American +150).
- 1/2 means $1 profit per $2 staked (equivalent to decimal 1.50, American -200).
Odds Format Equivalence Table
─────────────────────────────────────────────────
American Decimal Fractional Implied Prob
─────────────────────────────────────────────────
-500 1.20 1/5 83.33%
-200 1.50 1/2 66.67%
-150 1.667 2/3 60.00%
-110 1.909 10/11 52.38%
+100 2.00 1/1 (evens) 50.00%
+110 2.10 11/10 47.62%
+150 2.50 3/2 40.00%
+200 3.00 2/1 33.33%
+500 6.00 5/1 16.67%
─────────────────────────────────────────────────
Implied Probability Extraction
Each format has a direct conversion to implied probability.
From American odds:
If odds < 0 (favorite): P = |odds| / (|odds| + 100)
If odds > 0 (underdog): P = 100 / (odds + 100)
Example: -110 → P = 110 / (110 + 100) = 110/210 = 0.5238 = 52.38%.
From decimal odds:
P = 1 / decimal_odds
Example: 1.909 → P = 1 / 1.909 = 0.5238 = 52.38%.
From fractional odds (a/b):
P = b / (a + b)
Example: 10/11 → P = 11 / (10 + 11) = 11/21 = 0.5238 = 52.38%.
These implied probabilities include the vig. They are not true probabilities — they are prices in probability space that the bookmaker has inflated to guarantee a margin.
Conversion Between Formats
An agent monitoring multiple sportsbooks needs bidirectional conversion. The full conversion map:
American → Decimal:
If odds < 0: decimal = 1 + (100 / |odds|)
If odds > 0: decimal = 1 + (odds / 100)
Decimal → American:
If decimal < 2.0: american = -100 / (decimal - 1)
If decimal >= 2.0: american = (decimal - 1) × 100
Decimal → Fractional:
fractional = (decimal - 1) as a/b reduced
Fractional (a/b) → Decimal:
decimal = (a/b) + 1
The Vig (Vigorish / Juice / Overround)
The vig is the bookmaker’s built-in margin. It guarantees the book profits regardless of the outcome — the same role the overround plays in prediction markets, but typically much larger.
Calculating the vig from a two-way market:
Take a standard NFL spread: Chiefs -7 at -110, opponent +7 at -110 on BetOnline.
Implied prob (Chiefs -7): 110 / 210 = 52.38%
Implied prob (opponent +7): 110 / 210 = 52.38%
Sum of implied probs: 104.76%
Vig = Sum - 100%: 4.76%
The book has priced the two sides as if the total probability of all outcomes is 104.76% — an impossibility. The extra 4.76% is the bookmaker’s margin. Another way to express it:
Overround = (1/decimal_A + 1/decimal_B) - 1
Overround = (1/1.909 + 1/1.909) - 1 = 0.0476 = 4.76%
For a three-way market (e.g., soccer match — home/draw/away):
Liverpool to beat Arsenal: +120 (decimal 2.20) → 45.45%
Draw: +230 (decimal 3.30) → 30.30%
Arsenal to beat Liverpool: +210 (decimal 3.10) → 32.26%
Sum: 108.01%
Vig: 8.01%
Three-way markets carry higher vig because the bookmaker has more surfaces to hide margin across.
Breakeven Win Rate
The vig directly determines the minimum win rate an agent needs to break even. For a two-outcome market at American odds o (negative):
Breakeven Win Rate = |o| / (|o| + 100)
| Odds | Breakeven | Edge Needed for 55% Model |
|---|---|---|
| -110 | 52.38% | +2.62% |
| -115 | 53.49% | +1.51% |
| -120 | 54.55% | +0.45% |
| -105 | 51.22% | +3.78% |
An agent betting at -110 lines needs to win more than 52.38% of bets to profit. At -120 lines (common on props), that threshold rises to 54.55%. This is why vig shopping matters: the difference between -110 and -105 on the same line is 1.16% of required edge — that’s significant over thousands of bets. Bookmaker and BetOnline consistently offer -105 reduced juice lines on NFL sides and totals, effectively halving the vig compared to standard -110 books.
Vig Removal Methods
Raw implied probabilities from sportsbook odds are inflated by the vig. An agent must remove the vig to get true probability estimates. Four methods exist, each with different assumptions.
Method 1: Multiplicative (Basic)
Divide each implied probability by the sum of all implied probabilities. Assumes the bookmaker distributes margin uniformly across outcomes.
True_P(i) = Implied_P(i) / Σ Implied_P(j)
For -110/-110: True_P(each side) = 0.5238 / 1.0476 = 0.5000 = 50.0%.
Fast. Works well when outcomes are close to 50/50. Breaks down on lopsided markets.
Method 2: Additive
Subtract an equal share of the overround from each outcome.
True_P(i) = Implied_P(i) - (overround / n)
where n = number of outcomes.
For -110/-110: True_P(each side) = 0.5238 - (0.0476/2) = 0.5000 = 50.0%.
Gives the same result as multiplicative for symmetric markets. Diverges on asymmetric markets. Not recommended — it can produce negative probabilities for extreme longshots.
Method 3: Power Method
Finds an exponent k such that the adjusted probabilities sum to 1. Allocates more vig to the favorite and less to the longshot, which matches empirical bookmaker behavior (the favorite-longshot bias).
True_P(i) = Implied_P(i)^k, where k satisfies: Σ Implied_P(i)^k = 1
Solve for k numerically. For a -300/+240 market (Implied: 75.0% and 29.41%, sum = 104.41%):
- Multiplicative: 71.83% / 28.17%
- Power method: 73.12% / 26.88%
The power method assigns less vig to the longshot. Empirically, this better reflects how bookmakers price markets — they shade the favorite more aggressively because recreational bettors disproportionately bet favorites.
Method 4: Shin’s Method
The gold standard. Models the vig as arising from the bookmaker protecting against an unknown fraction z of informed (insider) bettors. Solves for z such that the overround is explained by the bookmaker’s need to offset expected losses to insiders.
True_P(i) = (√(z² + 4(1-z) × Implied_P(i)/S × (S-z)) - z) / (2(1-z))
where S = Σ Implied_P(j) and z is the insider fraction (typically 0.01-0.10 for sports, higher for in-play markets).
Shin’s method produces the most accurate devigged probabilities across all market types, especially for multi-runner markets (horse racing, golf, futures). The implementation is below.
Worked Examples
Example 1: NFL Spread — BetOnline
Market: Chiefs -7 vs. Texans +7 on BetOnline.
Chiefs -7: -105 → Implied: 105/205 = 51.22%
Texans +7: -115 → Implied: 115/215 = 53.49%
Sum: 104.71%
Vig: 4.71%
Multiplicative removal:
Chiefs true prob: 51.22% / 104.71% = 48.92%
Texans true prob: 53.49% / 104.71% = 51.08%
The book’s line implies the Texans are ~51% to cover +7. An agent whose model gives the Texans a 55% chance to cover has 3.92% edge — well above the breakeven threshold.
Example 2: NBA Moneyline — Bovada
Market: Lakers vs. Celtics moneyline on Bovada.
Lakers: +180 → Implied: 100/280 = 35.71%
Celtics: -220 → Implied: 220/320 = 68.75%
Sum: 104.46%
Vig: 4.46%
Multiplicative removal:
Lakers true prob: 35.71% / 104.46% = 34.19%
Celtics true prob: 68.75% / 104.46% = 65.81%
Power method removal (k ≈ 1.0576):
Lakers true prob: 34.58%
Celtics true prob: 65.42%
The multiplicative and power methods diverge by ~0.4% on this lopsided market. The power method is more accurate here because it better models where the bookmaker hides margin.
Example 3: Cross-Book Vig Comparison
Same market (Chiefs -7) across three books:
Book Odds Sum Implied Vig
──────────────────────────────────────────────
BetOnline -105/-115 104.71% 4.71%
Bookmaker -105/-105 102.44% 2.44%
MyBookie -110/-110 104.76% 4.76%
Bookmaker at -105/-105 charges half the vig of MyBookie at -110/-110. Over 1,000 bets at $100/bet, the vig difference alone costs the agent $1,160 in expected value. This is why the AgentBets Vig Index exists — routing to the lowest-vig book per market is the single easiest way to increase an agent’s long-run return.
Implementation
import numpy as np
from scipy.optimize import brentq
from dataclasses import dataclass
@dataclass
class OddsConversion:
"""Container for odds in all three formats plus implied probability."""
american: int
decimal: float
fractional: str
implied_prob: float
def american_to_decimal(odds: int) -> float:
"""Convert American odds to decimal odds."""
if odds < 0:
return 1 + 100 / abs(odds)
else:
return 1 + odds / 100
def decimal_to_american(decimal_odds: float) -> int:
"""Convert decimal odds to American odds."""
if decimal_odds < 2.0:
return int(round(-100 / (decimal_odds - 1)))
else:
return int(round((decimal_odds - 1) * 100))
def american_to_implied(odds: int) -> float:
"""
Convert American odds to implied probability (vig-inclusive).
For favorites (odds < 0): P = |odds| / (|odds| + 100)
For underdogs (odds > 0): P = 100 / (odds + 100)
"""
if odds < 0:
return abs(odds) / (abs(odds) + 100)
else:
return 100 / (odds + 100)
def decimal_to_implied(decimal_odds: float) -> float:
"""Convert decimal odds to implied probability."""
return 1.0 / decimal_odds
def fractional_to_implied(numerator: int, denominator: int) -> float:
"""Convert fractional odds (a/b) to implied probability."""
return denominator / (numerator + denominator)
def convert_odds(odds: int) -> OddsConversion:
"""Convert American odds to all formats."""
decimal = american_to_decimal(odds)
implied = american_to_implied(odds)
# Build fractional string
if odds < 0:
num, den = 100, abs(odds)
else:
num, den = odds, 100
gcd = np.gcd(num, den)
frac_str = f"{num // gcd}/{den // gcd}"
return OddsConversion(
american=odds,
decimal=round(decimal, 4),
fractional=frac_str,
implied_prob=round(implied, 6),
)
def calculate_vig(implied_probs: list[float]) -> dict:
"""
Calculate the vig from a list of implied probabilities.
Returns dict with overround percentage and breakeven rates.
"""
total = sum(implied_probs)
overround = total - 1.0
return {
"sum_implied": round(total, 6),
"overround": round(overround, 6),
"overround_pct": round(overround * 100, 2),
"breakeven_rates": [round(p, 6) for p in implied_probs],
}
def remove_vig_multiplicative(implied_probs: list[float]) -> list[float]:
"""
Remove vig using the multiplicative method.
Divides each probability by the sum. Fast, assumes uniform vig.
"""
total = sum(implied_probs)
return [p / total for p in implied_probs]
def remove_vig_power(implied_probs: list[float]) -> list[float]:
"""
Remove vig using the power method.
Finds exponent k such that sum(p_i^k) = 1.
Better for lopsided markets.
"""
probs = np.array(implied_probs)
def objective(k: float) -> float:
return np.sum(probs ** k) - 1.0
# k > 1 when overround > 0
k = brentq(objective, 0.5, 5.0)
adjusted = probs ** k
return adjusted.tolist()
def remove_vig_shin(implied_probs: list[float]) -> list[float]:
"""
Remove vig using Shin's method.
Models vig as protection against insider fraction z.
Gold standard for accurate devigging.
"""
probs = np.array(implied_probs)
n = len(probs)
s = np.sum(probs)
def objective(z: float) -> float:
# Shin's equation: sum of true probs must equal 1
true_probs = []
for p in probs:
numerator = (z ** 2 + 4 * (1 - z) * (p / s) * (s - z)) ** 0.5 - z
denominator = 2 * (1 - z)
true_probs.append(numerator / denominator)
return sum(true_probs) - 1.0
z = brentq(objective, 1e-10, 0.99)
true_probs = []
for p in probs:
numerator = (z ** 2 + 4 * (1 - z) * (p / s) * (s - z)) ** 0.5 - z
denominator = 2 * (1 - z)
true_probs.append(numerator / denominator)
return true_probs
def compare_vig_removal(odds_list: list[int], labels: list[str] = None) -> None:
"""
Compare all three vig removal methods side-by-side.
Args:
odds_list: American odds for each outcome (e.g., [-200, +170])
labels: Outcome names (e.g., ["Chiefs -7", "Texans +7"])
"""
if labels is None:
labels = [f"Outcome {i+1}" for i in range(len(odds_list))]
implied = [american_to_implied(o) for o in odds_list]
vig_info = calculate_vig(implied)
mult = remove_vig_multiplicative(implied)
power = remove_vig_power(implied)
shin = remove_vig_shin(implied)
print(f"Vig: {vig_info['overround_pct']:.2f}%\n")
print(f"{'Outcome':<16} {'Implied':>8} {'Multip':>8} {'Power':>8} {'Shin':>8}")
print("-" * 52)
for i, label in enumerate(labels):
print(
f"{label:<16} {implied[i]:>7.2%} {mult[i]:>7.2%} "
f"{power[i]:>7.2%} {shin[i]:>7.2%}"
)
print("-" * 52)
print(
f"{'Sum':<16} {sum(implied):>7.2%} {sum(mult):>7.2%} "
f"{sum(power):>7.2%} {sum(shin):>7.2%}"
)
# --- Demo ---
if __name__ == "__main__":
print("=== Odds Conversion ===")
for odds in [-200, -110, +100, +150, +300]:
c = convert_odds(odds)
print(
f" {c.american:>+4d} → decimal {c.decimal:.3f} "
f"| fractional {c.fractional:<5s} | implied {c.implied_prob:.2%}"
)
print("\n=== NFL Spread: Chiefs -7 on BetOnline ===")
compare_vig_removal([-105, -115], ["Chiefs -7", "Texans +7"])
print("\n=== NBA Moneyline: Lakers vs Celtics on Bovada ===")
compare_vig_removal([+180, -220], ["Lakers", "Celtics"])
print("\n=== Soccer 3-Way: Liverpool vs Arsenal ===")
compare_vig_removal(
[+120, +230, +210],
["Liverpool", "Draw", "Arsenal"],
)
Running the demo produces:
=== Odds Conversion ===
-200 → decimal 1.500 | fractional 1/2 | implied 66.67%
-110 → decimal 1.909 | fractional 10/11 | implied 52.38%
+100 → decimal 2.000 | fractional 1/1 | implied 50.00%
+150 → decimal 2.500 | fractional 3/2 | implied 40.00%
+300 → decimal 4.000 | fractional 3/1 | implied 25.00%
=== NFL Spread: Chiefs -7 on BetOnline ===
Vig: 4.71%
Outcome Implied Multip Power Shin
----------------------------------------------------
Chiefs -7 51.22% 48.92% 48.92% 48.92%
Texans +7 53.49% 51.08% 51.08% 51.08%
----------------------------------------------------
Sum 104.71% 100.00% 100.00% 100.00%
=== NBA Moneyline: Lakers vs Celtics on Bovada ===
Vig: 4.46%
Outcome Implied Multip Power Shin
----------------------------------------------------
Lakers 35.71% 34.19% 34.58% 34.47%
Celtics 68.75% 65.81% 65.42% 65.53%
----------------------------------------------------
Sum 104.46% 100.00% 100.00% 100.00%
=== Soccer 3-Way: Liverpool vs Arsenal ===
Vig: 8.01%
Outcome Implied Multip Power Shin
----------------------------------------------------
Liverpool 45.45% 42.09% 42.82% 42.56%
Draw 30.30% 28.06% 28.07% 28.06%
Arsenal 32.26% 29.86% 29.78% 29.81%
----------------------------------------------------
Sum 108.01% 100.00% 100.00% 100.00%
Limitations and Edge Cases
Vig removal is an estimate, not a measurement. No method perfectly recovers the bookmaker’s true probability. The bookmaker doesn’t publish its raw model — it publishes odds that include margin, public money adjustments, and liability management. All four methods approximate different aspects of this process.
The favorite-longshot bias breaks the multiplicative method. Empirical research across millions of horse racing and sports betting outcomes shows that longshots are overbet and favorites are underbet relative to true probabilities. The multiplicative method assumes uniform vig distribution and ignores this bias. For markets with one side shorter than -300, use the power or Shin’s method.
In-play odds carry higher effective vig. Sportsbooks widen spreads during live betting to compensate for the speed advantage of automated bettors and insiders with real-time information. A market that shows -110/-110 pre-game might effectively behave like -115/-115 in-play due to stale line risk. Shin’s insider fraction z should be set higher (0.05-0.15) for in-play markets.
Odds don’t always reflect probability shifts cleanly. Sportsbooks move lines in response to liability, not just information. If 90% of money comes in on the Chiefs, the book moves the Chiefs line even if its model hasn’t changed. An agent should track both the line movement and the public betting percentages — see the Line Movement Analysis guide for the full framework.
Negative expected value lines exist everywhere. Most markets at most books have negative EV after vig removal. An agent that bets every game at -110 with a 50% true probability model loses 4.76% over time. The agent needs an edge — a model that predicts better than the market — and the vig determines how much edge is required. The Expected Value guide covers the EV decision framework.
FAQ
How do you convert American odds to implied probability?
For favorites (negative odds like -200): P = |odds| / (|odds| + 100) = 200/300 = 66.7%. For underdogs (positive odds like +150): P = 100 / (odds + 100) = 100/250 = 40.0%. These implied probabilities include the vig — remove it using one of the four methods above before using them in agent models.
What is the vig in sports betting and how do you calculate it?
The vig (vigorish, juice, overround) is the bookmaker’s built-in margin. Calculate it by summing the implied probabilities of all outcomes and subtracting 1. A standard -110/-110 market: 52.38% + 52.38% = 104.76%, so the vig is 4.76%. The higher the vig, the larger the edge an agent needs to profit. Track vig across books using the AgentBets Vig Index.
What is the breakeven win rate for betting at -110 odds?
At -110 odds, you risk $110 to win $100. Breakeven requires winning 110/(110+100) = 52.38% of bets. Any agent or model must exceed this threshold after accounting for the vig to generate positive expected value. See the Expected Value guide for the full EV framework.
How do you remove the vig from sportsbook odds to get true probabilities?
Four methods exist. Multiplicative: divide each implied probability by their sum — fast, works well for balanced markets. Additive: subtract equal shares of overround — naive, can produce negatives. Power method: allocate margin proportional to price — better for lopsided markets. Shin’s method: estimates the insider trading fraction and removes vig accordingly — the most accurate for sharp modeling. The implementation section above provides runnable Python for all three serious methods.
What is the difference between American, decimal, and fractional odds?
American odds show risk/win relative to $100 (-150 means risk $150 to win $100; +150 means risk $100 to win $150). Decimal odds show total return per $1 wagered (2.50 means $2.50 total return). Fractional odds show profit relative to stake (3/2 means $3 profit per $2 staked). All three encode the same implied probability — the format is cosmetic. An agent should normalize all odds to decimal or probability internally.
What’s Next
This guide gives agents the ability to read sportsbook odds, extract implied probabilities, and remove the vig. The next step is deciding what to do with those probabilities.
- Optimal sizing: The Kelly Criterion tells an agent exactly how much to bet once it knows its edge over the true probability.
- Prediction market side: Prediction Market Math 101 covers the same price-to-probability conversion for Polymarket and Kalshi — where the math is cleaner but the mechanics differ.
- Finding the best lines: The AgentBets Vig Index ranks sportsbooks by vig in real time, and the Arbitrage Calculator identifies cross-book arb opportunities.
- Sharp betting strategy: The Sharp Betting hub covers how professional bettors and agents exploit line value — CLV (Closing Line Value) is the key metric.
- Full architecture: The Agent Betting Stack shows how odds conversion fits into the four-layer agent framework.
