De-vigging: recovering the true probability
A bookmaker price is not a probability - it is a probability plus a margin. Removing that margin is the difference between measuring an edge and inventing one.

A price of 2.00 does not mean the bookmaker thinks the outcome is 50% likely. It means they think it is somewhat less likely than that, and the difference is how they get paid.
If you compare your model against raw prices, you are comparing it against probabilities that are deliberately inflated. Every edge you measure will be smaller than it looks — and on short prices, an edge that does not exist will look like one that does.
The arithmetic
Convert a decimal price to an implied probability by taking its reciprocal:
implied probability = 1 / price
Take a two-way market priced 1.91 / 1.91:
1 / 1.91 = 0.5236 → 52.36%
1 / 1.91 = 0.5236 → 52.36%
------
104.72%
Those probabilities sum to more than 100%. They have to — the surplus is the bookmaker's margin, and here it is 4.72%. That surplus is the overround or vig.
Removing it
The standard method is proportional normalisation: divide each side by the total.
fair probability = implied / (implied_a + implied_b)
For the market above:
0.5236 / 1.0472 = 0.5000 → 50.0%
Which recovers the fair price:
fair price = 1 / 0.5000 = 2.00
A less symmetric example. Over 2.5 at 1.75, under at 2.10:
| price | implied | fair | |
|---|---|---|---|
| Over 2.5 | 1.75 | 57.14% | 55.28% |
| Under 2.5 | 2.10 | 47.62% | 44.72% |
| Total | 104.76% | 100.00% |
The market's true estimate for over is 55.28%, not 57.14%. If your model says 56%, you do not have an edge against the raw number — you have a 0.7-point edge against the fair one, which is inside the noise.
You need both sides. There is no shortcut.
This is the part people skip. The margin is only observable as the amount by which the two implied probabilities exceed 1. Given one price alone, you cannot know how much of it is margin.
Assuming a typical margin and subtracting it is worse than not de-vigging at all, because you have now introduced an error whose size you do not know in place of one whose direction you did.
What proportional normalisation assumes
That the bookmaker spreads the margin evenly across both sides. On a two-outcome market between roughly balanced options, that is a fair approximation and it is what most of the industry uses.
It is less safe when the two sides are far apart. Books tend to load more margin onto long shots — the favourite-longshot bias — so proportional de-vigging slightly understates the fair price on heavy favourites and overstates it on outsiders. Alternatives exist (Shin's method, power normalisation, additive) and they differ most exactly where this one is weakest.
For goal markets priced between about 1.5 and 2.5, the choice of method changes the answer by a fraction of a percentage point. For a 1.05 favourite it matters a great deal.
Why this changes what you measure
De-vigging is not a refinement. Skip it and two specific things break.
Your edge is overstated. Against raw prices every market looks like it sums to 104%, so a model that exactly matches the bookmaker appears to have a 4% edge spread across the two sides. Bet on that and you are paying the margin twice.
Your closing line value reads low. Bookmaker margin tightens as kick-off approaches. Measured on 566 Pinnacle price pairs from our own book, it fell from about 5.05% at 48 hours out to 3.78% inside the last hour. The close therefore looks more generous on both sides, and every raw CLV reading is dragged down by roughly 1.2 points.
The tell that this is an artefact: scoring both sides of every market gave a mean raw CLV of −1.46%. Over and under cannot both drift against you. De-vigged, the same pairs averaged −0.27% with a median of exactly zero — which is what an unbiased comparison should produce.
Where we apply it
Every expected-value calculation in the product compares the model's probability against the de-vigged market probability, not against the raw price. CLV is de-vigged at both ends wherever we hold both sides at both times.
Where we do not hold the opposite price, the row is reported as raw and labelled as such on the track record rather than pooled into the average. Those readings run about a point low, and mixing two different measurements under one heading is how a track record stops meaning anything.