How to Find Positive EV Bets: Fair Odds, the EV Formula and Data

Estimate a fair probability from no-vig sharp prices or a market consensus, apply the expected value formula, scan a league with odds data or the MCP find_outliers tool, and understand the variance that comes with any edge.

A positive expected value (EV) bet is one where the price you can get is better than the outcome's true chance of happening. Nobody knows the true chance, so in practice the question of how to find positive EV bets becomes two smaller ones: what is a good estimate of the fair probability, and which books are offering a price better than it right now?

This guide walks through both. It covers estimating a fair probability from a sharp book's no-vig price or from a consensus of books, the expected value formula with worked examples, scanning a league with the PreciseAPI feed, and the variance and bankroll realities that come with any edge. It explains the math and the data; it is not betting advice, and a positive estimate is not a guaranteed profit.

What expected value betting means

Expected value is the average result of a bet if you could place it many times under the same conditions. For a bet at decimal odds d with a true win probability p, the expected value per unit staked is:

EV = p × d - 1

If EV is above zero, the price pays more than the risk deserves; below zero, it pays less. An equivalent test is to compare p with the price's break-even probability, 1 / d. A +125 price (decimal 2.25) breaks even at 44.44%, so if the true chance is above 44.44%, the bet is positive EV.

Expected value betting is the practice of only taking prices where that estimate comes out positive. Everything therefore depends on how good p is, which is the next step.

Step 1: estimate the fair probability

Each book's price includes its margin, so you cannot use a raw implied probability as p. You remove the margin first (de-vigging) to get a no-vig probability, and you take it from prices you trust. Two approaches are common.

From a sharp book's no-vig price

A sharp sportsbook runs a thin margin and moves quickly when informed money arrives, so its prices are a widely used reference. In the PreciseAPI catalog, Pinnacle, Circa and BookMaker are tagged sharp. The post on why Pinnacle odds matter explains why Pinnacle in particular is used this way.

Take a moneyline where Pinnacle posts -125 on the favorite and +114 on the underdog:

  1. Implied probabilities: 125 / 225 = 55.56% and 100 / 214 = 46.73%. They sum to 102.28%.
  2. Remove the margin proportionally: 55.56 / 102.28 = 54.31% and 46.73 / 102.28 = 45.69%.
  3. Convert back if you like: the fair odds are about -119 and +119.

That proportional method is the simplest of several. The how to devig odds guide compares it with the additive, power and Shin methods, and the no vig calculator runs any of them on two- or three-way markets.

From a consensus of books

Instead of trusting one book, you can de-vig every book that quotes the same line and take the median. A consensus is less exposed to one book's stale price or an unusual shade, and it works on markets the sharp books don't price. The trade-off is that soft books are part of the vote, and a soft book that lags the market drags the consensus with it.

A reasonable default is to use a sharp reference where one is quoting the market and fall back to a consensus elsewhere, and to judge only identical lines: home -3 and home -3.5 are different bets with different fair probabilities.

Step 2: compute the edge at every book

With the fair probabilities from Pinnacle (54.31% and 45.69%), here is the same game at four other books:

BookSidePriceDecimalBreak-evenEV
Book WFavorite-1301.76956.52%-3.90%
Book XFavorite-1151.87053.49%+1.54%
Book YUnderdog+1182.18045.87%-0.41%
Book ZUnderdog+1252.25044.44%+2.79%

Book Z's +125 is the clearest: 0.4569 × 2.25 - 1 = +2.79% per unit staked. Book X's -115 is also positive EV against this reference, by a smaller amount. Book Y's +118 is close, but it is still slightly worse than the fair +119.

Two cautions. First, these edges are only as good as the reference: if Pinnacle's price is about to move, the "edge" may be the other book being right. Second, an edge of a percent or two is within the range where small differences in de-vig method matter, which is one reason to set a minimum edge threshold.

How to find positive EV bets with odds data

Doing that by hand for one game is easy. Doing it across a full slate, every market and every book, many times an hour, is a data job. PreciseAPI has no /v1/ev endpoint; you compute EV from REST data, or let the MCP tool do it, as below.

Scanning a league in Python

This script pulls one league's main lines from a reference book and the books you use, de-vigs the reference, and prints every price with an edge of at least 1%. Because a selection id is the same for the same outcome at the same number at every book, matching outcomes is a dictionary lookup, and spreads at different numbers never match.

import os
import requests

API = "https://api.preciseapi.com/v1"
HEADERS = {"Authorization": f"Bearer {os.environ['PRECISEAPI_KEY']}"}
REFERENCE = "pinnacle"
MY_BOOKS = ["draftkings", "fanduel", "betmgm", "caesars", "fanatics"]

resp = requests.get(
    f"{API}/odds",
    params={
        "league": "nba",
        "markets": "moneyline,spread,total",
        "books": ",".join([REFERENCE, *MY_BOOKS]),
        "format": "decimal",
        "max_source_age_ms": 60000,  # skip quotes older than a minute
    },
    headers=HEADERS,
    timeout=10,
)
resp.raise_for_status()

for event in resp.json()["data"]:
    fair = {}  # selection id -> no-vig probability at the reference book
    for book in event["bookmakers"]:
        if book["id"] == REFERENCE:
            for m in book["markets"]:
                implied = [1 / o["price"] for o in m["outcomes"]]
                for o, p in zip(m["outcomes"], implied):
                    fair[o["id"]] = p / sum(implied)
    for book in event["bookmakers"]:
        if book["id"] == REFERENCE:
            continue
        for m in book["markets"]:
            for o in m["outcomes"]:
                p = fair.get(o["id"])
                if p is not None and p * o["price"] - 1 >= 0.01:
                    print(event["id"], book["id"], m["key"], o["name"], o.get("point"), o["price"], f"{p * o['price'] - 1:+.2%}")

One call costs 2 credits regardless of how many games and books come back. format=probability is the alternative if you prefer to work in implied probabilities directly; the implied probability guide covers both.

Letting the MCP server do it

The PreciseAPI MCP server's find_outliers tool performs the same scan for AI clients such as Claude and ChatGPT. It ranks prices by edge, computed exactly as above (fair probability × decimal price - 1), with reference set to consensus (the median no-vig price of every book at the same line) or to a sharp book such as pinnacle. Options include books (only flag prices at the books you use), min_edge_pct (default 1), min_books (default 5, or 3 for props) and markets (main or props). Each call costs 3 credits.

A prompt like "find NBA lines that beat Pinnacle's no-vig price by 2% or more" is enough. The odds API MCP guide covers setup. The positive EV API page shows how the REST and MCP routes fit together, and the no vig odds API page covers the fair-probability side on its own.

Variance: what an edge looks like in practice

Knowing how to find positive EV bets is not the same as knowing how they will perform. A positive EV price is a statement about averages. Any single bet, and any short run of them, is dominated by luck. Take Book Z's +125 at a 45.69% fair probability, an edge of +2.79%:

Bets (1 unit each)Expected profitStandard deviationChance of being behind
100+2.8 units11.2 unitsabout 40%
500+14.0 units25.1 unitsabout 29%
1,000+27.9 units35.4 unitsabout 22%
5,000+139.6 units79.3 unitsabout 4%

These figures are arithmetic, not results: they assume the fair probability is exactly right and use a normal approximation. Even then, someone betting only prices like this one has roughly a one-in-five chance of being behind after a thousand bets. If the fair estimate is off by even a point or two, the true edge can be zero or negative, and no number of bets will fix that.

That is why people who track positive EV betting judge their process by closing line value rather than short-term profit: whether their prices consistently beat the final market price is visible much sooner than whether they won money. The CLV measurement guide explains how to compute it.

Bankroll and stake size

Because results swing, stake size matters as much as edge. The Kelly criterion is the textbook formula for the fraction of a bankroll that maximizes long-run growth: edge divided by the net odds. For the +125 example that is 0.0279 / 1.25 = 2.23% of the bankroll. Full Kelly assumes your probability estimate is exact, so in practice it is often scaled down. This is a description of a formula, not a recommendation; decide your own limits and follow the responsible gaming guidance.

Practical pitfalls

Most mistakes people make when learning how to find positive EV bets come from the inputs, not the formula:

The EV calculator computes edge, expected profit and break-even for any price and fair probability. Edge gives REST access with 150,000 credits a month; Sharp and Syndicate are unlimited, and Syndicate adds live in-play odds. See pricing for details.

Frequently asked questions

What is a positive EV bet?

A bet whose price is better than the outcome's estimated true probability, so its expected value per unit staked, p × d - 1, is above zero. In practice the true probability is estimated from no-vig sharp prices or a consensus of books.

Which book should I use as the fair reference?

Sharp books such as Pinnacle, Circa and BookMaker are the usual choice where they price the market. A median of every book's no-vig price at the same line is a common alternative, especially for markets the sharp books don't price.

Does PreciseAPI have a positive EV endpoint?

No. There is no /v1/ev endpoint. You compute edges from /v1/odds or /v1/best-lines, or use the MCP server's find_outliers tool, which ranks prices against a consensus or sharp no-vig reference.

How many bets before an edge shows up in results?

Usually far more than people expect. With a small edge, being behind after hundreds or even a thousand bets is common, which is why many bettors track closing line value instead of short-term profit.

Keep reading