De-vigging (Removing the Vigorish)

Summary

De-vigging (also called "removing the vig" or "de-minting") is the process of converting bookmaker odds with built-in margin into "fair" odds that reflect the true implied probabilities. The sportsbook's margin (vigorish or "juice") is the overround — the amount by which the sum of implied probabilities exceeds 100%. De-vigging reverses this to get true probabilities for accurate EV calculations.

For example, a soccer 1X2 market might have: Home 1.90, Draw 3.50, Away 5.00. The implied probabilities are 52.6%, 28.6%, 20.0% — sum = 101.2% (the 1.2% overround is the bookmaker's margin). De-vigging adjusts these to fair probabilities that sum to exactly 100%.

The de-vigging method matters because different methods give slightly different fair probabilities. The multiplicative method (default) and additive method are the two most common approaches.

Key Concepts

  • Overround: Sum of implied probabilities > 100%. For a fair book, overround = 100% exactly.
  • Vigorish (vig): The bookmaker's percentage profit on total stakes. Different from overround but related.
  • Additive method (basic): Divide each implied probability by the total overround. Simple but can produce negative probabilities for extreme longshots.
  • Multiplicative method (preferred): More statistically sound — distributes vig proportionally to each outcome's implied probability. Favorites receive more vig than longshots under this method.
  • Power method: More complex; raises the overround to a power to achieve a more realistic distribution.
  • Soft vs. sharp books: Soft books (e.g., DraftKings, FanDuel) have higher vig than sharp books (Pinnacle). De-vigging sharp book odds is closer to "true" fair odds.

Formulas

Implied probability from decimal odds:
$$p_{implied,i} = \frac{1}{d_i}$$

Total overround:
$$O = \sum_{i} p_{implied,i}$$

Additive de-vigging:
$$p_{fair,i} = \frac{p_{implied,i}}{O}$$

This normalizes probabilities to sum to 1. Simple but can create issues.

Multiplicative de-vigging:
$$p_{fair,i} = \frac{p_{implied,i}}{\sqrt[p_{implied,i}]{O}}$$

A more complex formula where each probability is scaled by a factor based on its own magnitude.

Simplified multiplicative (Shin / sqrt method):
For two outcomes (e.g., over/under):
$$p_{fair,home} = \frac{p_{implied,home}}{\sqrt{p_{implied,home} \times p_{implied,away}}}$$

Vigorish percentage:
$$v = \left(1 - \frac{1}{O}\right) \times 100\%$$

Example:
- Odds: Home 1.90, Draw 3.50, Away 5.00
- Implied: 1/1.90=0.526, 1/3.50=0.286, 1/5.00=0.200 → O=1.012
- Additive de-vig: 0.526/1.012=0.520, 0.286/1.012=0.283, 0.200/1.012=0.198
- Fair odds: 1/0.520=1.92, 1/0.283=3.54, 1/0.198=5.05

Python Implementation

import numpy as np

def implied_probabilities(odds):
    """Convert decimal odds to implied probabilities."""
    return np.array([1/o for o in odds])

def overround(odds):
    """Calculate total overround (sum of implied probabilities)."""
    return sum(implied_probabilities(odds))

def devig_additive(odds):
    """Additive de-vigging: normalize to sum to 1."""
    probs = implied_probabilities(odds)
    O = sum(probs)
    fair_probs = probs / O
    fair_odds = 1 / fair_probs
    return fair_probs, fair_odds

def devig_multiplicative(odds):
    """
    Multiplicative de-vigging (Shin method).
    More statistically appropriate than additive.
    """
    probs = implied_probabilities(odds)
    O = sum(probs)
    n = len(probs)

    # Multiplicative method
    fair_probs = probs / np.power(probs, probs / O)
    fair_probs = fair_probs / fair_probs.sum()
    fair_odds = 1 / fair_probs
    return fair_probs, fair_odds

def devig_power(odds, power=0.5):
    """
    Power method de-vigging.
    power=0.5 is common; power=1 gives additive.
    """
    probs = implied_probabilities(odds)
    O = sum(probs)
    fair_probs = probs / np.power(probs, (1 - power) * np.log(O) / sum(np.log(probs)))
    fair_probs = fair_probs / fair_probs.sum()
    fair_odds = 1 / fair_probs
    return fair_probs, fair_odds

# Example usage
odds = [1.90, 3.50, 5.00]  # Home, Draw, Away
fair_probs, fair_odds = devig_multiplicative(odds)
print(f"Fair probabilities: {fair_probs}")
print(f"Fair odds: {fair_odds}")

Notes

  • Always de-vig before computing EV — otherwise you're measuring edge against inflated odds, not true probabilities
  • Pinnacle and sharp books have the lowest vig (~2-3%), making their odds closest to fair. Using their odds as reference for de-vigging other books is standard practice.
  • The additive method is simpler but can produce issues with extreme longshots (creating probabilities > 1 or < 0). Multiplicative is preferred for production systems.
  • For the sports prediction MVP: The Odds API provides odds from multiple bookmakers; de-vig the sharpest book (Pinnacle) to get fair probabilities, then check if the model + other bookmaker odds create +EV opportunities
  • Some advanced de-vigging methods use hidden markov models or Bayesian approaches to infer true probabilities from observed odds across multiple books