Calculating No-Vig Fair Odds from Pinnacle Lines
How to strip the margin from Pinnacle prices for a fair-probability reference: three vig-removal methods, worked examples, code, and when each is wrong.
Calculating No-Vig Fair Odds from Pinnacle Lines
Pinnacle's line is the sharpest in the market, but it still has a margin baked in. If you want to use it as a true-probability reference — for +EV detection, model calibration, or fair-value comparison — you have to remove that margin first. This is how, including the part most explainers skip: the different methods disagree, and the one you pick matters.
First, what the vig is
Every price implies a probability: p = 1 / decimal_odds. For a fair, margin-free market, the implied probabilities of all outcomes sum to exactly 1.0. Real books price so the sum is above 1.0; that excess is the overround (the "vig" or "juice").
Pinnacle runs tight — often around 2% overround on a two-way market versus 5–8% at recreational books — but tight isn't zero. To get fair odds, you redistribute the prices so the implied probabilities sum back to 1.0.
Method 1: Multiplicative (normalization)
The simplest and most common method. Divide each implied probability by the total, so they renormalize to 1.0.
Take a two-way market at 1.91 / 1.91:
p_a = 1/1.91 = 0.5236
p_b = 1/1.91 = 0.5236
total = 1.0472 # ~4.7% overround
Renormalize:
fair_p_a = 0.5236 / 1.0472 = 0.5000
fair_p_b = 0.5236 / 1.0472 = 0.5000
fair_odds = 1 / 0.5 = 2.00 each
So the fair line behind 1.91/1.91 is a coin flip at 2.00. Clean and fast.
Where it's wrong: multiplicative removal assumes the margin is applied proportionally across outcomes. On lopsided markets (a heavy favorite vs a longshot) that assumption is questionable — books tend to load more margin onto the longshot (the "favorite-longshot bias"). Multiplicative ignores this and slightly mis-prices both sides.
Method 2: Additive (equal margin)
Instead of scaling, subtract an equal share of the overround from each outcome's probability. For an n-outcome market with overround m = total - 1:
fair_p_i = p_i - (m / n)
This assumes the margin is spread evenly in probability terms. It's better than multiplicative on some markets and worse on others — and it can produce nonsense (negative probabilities) on extreme longshots, which is a signal it's the wrong tool there.
Method 3: Shin / power methods (favorite-longshot aware)
For serious work, the methods worth knowing handle the favorite-longshot bias explicitly:
- Shin's method models the margin as arising from a proportion of insider traders and solves for the fair probabilities that produce the observed prices. It systematically takes more margin off favorites and less off longshots, which matches how sharp books actually behave.
- Power / logarithmic methods raise implied probabilities to a fitted exponent so they sum to 1, also bending the correction by outcome.
These need an iterative solve rather than a one-liner, but on lopsided markets they're materially more accurate than multiplicative. If you're calibrating a model against Pinnacle, this is the tier you want.
Code: multiplicative (the everyday default)
def no_vig_fair(odds):
"""odds: list of decimal odds for all outcomes in a market."""
implied = [1 / o for o in odds]
total = sum(implied)
fair_p = [p / total for p in implied]
fair_odds = [1 / p for p in fair_p]
return fair_p, fair_odds
# Example: a soccer 1X2 market
p, o = no_vig_fair([2.10, 3.40, 3.60])
print([round(x, 4) for x in p]) # fair probabilities, sum to 1.0
print([round(x, 2) for x in o]) # fair odds
For three-way markets (1X2), the same normalization applies across all three outcomes. For anything lopsided or high-stakes, swap in Shin. (If you're consuming our drop stream, this arithmetic is already done for you — every alert carries its no-vig fair price precomputed server-side.)
A worked use: +EV detection
The payoff of fair odds is comparison. Compute Pinnacle's no-vig fair price for an outcome, then look at what a soft book offers — this arithmetic is the entire engine of value betting against soft bookmakers:
fair_p = 0.50 # from Pinnacle, vig removed
soft_book_odds = 2.10
soft_book_implied = 1/2.10 = 0.476
# Your edge: the soft book thinks it's less likely than fair says
EV_per_unit = fair_p * soft_book_odds - 1
= 0.50 * 2.10 - 1 = 0.05 # +5% expected value
A positive number means the soft book is offering more than the fair price — a +EV bet if your fair estimate is right. Which leads to the caveat.
When this breaks
- Garbage in. No-vig fair odds are only as sharp as the source line. Use a stale or thin Pinnacle price and your "fair" value is fiction. This is the real argument for a low-latency feed: the fair value is only meaningful at the instant the line is current.
- Wrong method for the market. Multiplicative on a heavy favorite/longshot market will mislead you. Match the method to the shape.
- Two-way shortcut on three-way markets. Don't drop the draw in soccer to simplify — you'll bias both remaining outcomes.
Takeaway
Removing the vig is how you turn Pinnacle's sharp-but-margined line into a true-probability reference. Multiplicative is fine for most quick work; Shin/power methods earn their complexity on lopsided markets and model calibration. And all of it depends on the input price being current — fair value computed off a stale line is just a confident wrong answer.
Frequently asked questions
What is no-vig fair odds?
The price you'd see if the bookmaker margin were removed, so implied probabilities sum to exactly 1.0 — an estimate of the true probability.
Why use Pinnacle for this?
Its low margin and sharp, fast-moving line make it the closest widely-available proxy for true probability.
Which vig-removal method should I use?
Multiplicative for everyday work; Shin or a power method when markets are lopsided or you're calibrating a model.
Get real-time Pinnacle odds in your code
Live & prematch markets with sub-second odds-drop alerts. Free trial key in seconds — no card.
Start free trial