Free trial · 7 days

Get a free key

We email you a link; opening it shows your API key. Then message @oddspush on Telegram and we activate your 7-day free trial. No card.

By continuing you agree to the Terms and the Privacy Policy.

Already have a key?

Lost your key?

Value betting calculator: expected value against Pinnacle

Last updated

A value bet is a price higher than the outcome's true chance justifies. Take Pinnacle's prices for every outcome of the market, remove the margin to get the fair probability p, and the expected value of your price is EV = your decimal odds × p − 1 per unit staked. Above zero is +EV. Arsenal at 1.55, where Pinnacle's fair probability is 68.13 %, is worth +5.60 % per unit; the Kelly criterion would stake 10.19 % of the bankroll, or 2.55 % at quarter Kelly.

1. Expected value calculator

Enter the odds you can get elsewhere, then Pinnacle's prices for every outcome of the same market (two for a total, a spread or a tennis moneyline, three for a soccer moneyline), and tick the outcome you would bet. American (-238, +655) or decimal (1.55) both work. It runs in your browser; nothing is sent anywhere.

Odds format
Pinnacle's prices · the outcome you bet is the one ticked
True probability from Probability Fair odds EV per unit Full Kelly Quarter Kelly

The defaults are an example Premier League moneyline (Arsenal, Chelsea, draw) at −238, +655 and +318, with a wide margin so that the two methods clearly differ. Kelly is the share of your bankroll to stake, and 0 % means no bet. Keep the fair row for lopsided and three-way markets; the next sections say why.

2. What +EV means

Every price implies a probability: decimal odds of 1.55 pay off if the outcome wins more than 1 / 1.55 = 64.52 % of the time. If the true probability is higher, the bet makes money on average. Per unit staked you win odds − 1 with probability p and lose 1 otherwise, which simplifies to:

formula Text
EV = your decimal odds × p − 1

At 1.55 with p = 68.13 %: 1.55 × 0.6813 − 1 = +5.60 %. Over many bets of 100 that averages 5.60 profit each, before costs. The same number is your price divided by the fair odds, minus one: 1.55 / 1.4678 − 1.

The formula is trivial; the hard part is p. Nobody knows the true probability, so value betting borrows it from the market that prices it best.

3. Why Pinnacle is the reference

  • It lets sharp money in. Pinnacle is known for taking large bets from winning bettors rather than limiting them, and it moves its prices when they bet. Their information ends up in the line.
  • Low margins. The less a bookmaker adds, the less there is to guess when you take it out, and the closer its implied probabilities sit to the real ones.
  • Every market. Totals, spreads, team totals, periods and alternate lines all have a price, so the reference exists for whatever you can bet elsewhere, including the same question on Polymarket or Kalshi (Polymarket and Kalshi vs Pinnacle).

The method assumes Pinnacle is right and the other price is wrong. When the gap is large, check first that it is the same market, the same line and the same rules (extra time, retirements, voids) before believing it.

4. Fair vs no-vig: why it matters for long shots

Pinnacle's implied probabilities add up to more than 100 %: the excess is the margin. In the default market, 1/1.4202 + 1/7.55 + 1/4.18 = 107.58 %, a margin of 7.58 %. There are two common ways to remove it:

  • No-vig (multiplicative): divide each implied probability by their sum. Every outcome loses the same share of its probability.
  • Fair (power method): raise each implied probability to the power k that makes them add up to 1. Long shots lose a larger share than the favourite, which is how bookmakers tend to load the margin (the favourite-longshot bias).

Three bets on the same market, priced elsewhere, with the probability each method gives (no-vig · fair):

Bet p: no-vig · fair EV no-vig EV fair
Arsenal at 1.55 65.45 % · 68.13 % +1.45 % +5.60 %
Chelsea at 8.50 12.31 % · 10.95 % +4.65 % −6.89 %
Draw at 4.60 22.24 % · 20.92 % +2.29 % −3.79 %

Against the no-vig price all three look +EV, and Chelsea at 8.50 looks like the best of the long shots. Against the fair price only the favourite is: the no-vig method leaves too much probability on Chelsea (12.31 % instead of 10.95 %), and a value bettor using it would keep backing long shots that lose money. In a balanced two-way market, a total at +104 / −122 for instance, the two methods differ by less than 0.2 points of probability and it hardly matters. The derivation and the code are in Pinnacle no-vig odds.

5. Sizing the stake with Kelly

EV says whether to bet; the Kelly criterion says how much, as the fraction of the bankroll that maximises its long-run growth. With b = decimal odds − 1:

formula Text
f = (b × p − (1 − p)) / b

Arsenal at 1.55: b = 0.55, so f = (0.55 × 0.6813 − 0.3187) / 0.55 ≈ 10.19 %. On a bankroll of 1,000 that is a stake of 101.9; quarter Kelly is 25.5. A negative f means the bet is −EV and the stake is zero.

  • Kelly trusts p completely. An error of a couple of points in the probability can turn the full-Kelly stake into an overbet, and overbetting loses faster than underbetting gains. That is why most bettors stake a fraction, a quarter or a half.
  • Bets at the same time are not independent. Several bets on one match, or on correlated markets, should share one Kelly stake, not take one each.
  • Full Kelly swings hard. Even with a true edge and an exact p, it has about an even chance of halving the bankroll at some point. Fractional Kelly gives up a little growth for much smaller drawdowns.

6. Variance and sample size

A +EV bet still loses often. One bet at decimal odds d returns d − 1 or −1, with a standard deviation of d × √(p × (1 − p)) per unit. For the average result to stand two standard deviations clear of zero, you need about (2 × sd / EV)² bets:

Bet EV sd per bet Bets needed
1.55, fair probability 68.13 % +5.60 % 0.72 ≈ 665
2.05, true probability 51.22 % +5.00 % 1.02 ≈ 1,680
8.50, true probability 12.35 % +5.00 % 2.80 ≈ 12,516

The same 5 % edge on a long shot takes about seven times as many bets to show as on a price near even money. Stretches of hundreds of bets in the red are normal even with a true edge, which is why results alone are a slow way to tell whether your edge is real.

7. Limits, fees and what EV leaves out

  • Fees come out of the price. On an exchange or a prediction market, use the odds you really get after commission or trading fees. With a commission c on net winnings, the effective decimal odds are 1 + (odds − 1) × (1 − c). A prediction-market price converts to decimal as 1 / price in dollars: 40¢ is 1 / 0.40 = 2.50 (odds converter).
  • Prices move. A gap that lasts seconds is often the slower side about to correct. EV is measured at the moment you can actually place the bet, against Pinnacle's price at that moment.
  • Limits. Soft bookmakers restrict accounts that win, and the stake you are offered may be far below the Kelly stake. Thin order books on exchanges have the same effect.
  • Rules. Settlement rules differ between operators (overtime, retirements, dead heats). A market that settles differently is a different market.

8. EV at bet time, CLV after the close

EV is what you expect when you place the bet, against Pinnacle's fair price at that moment. Closing line value is the same comparison against the fair price at kick-off, when the line has absorbed all the information it will get. If your +EV bets also beat the close on average, the edge was real; if the line keeps moving against you, your reference price was stale. Measure both: closing line value calculator.

9. Pinnacle fair odds by API

A value bettor compares prices continuously, so the reference has to be live. OddsPush streams every price change of Pinnacle's live and pre-match markets in all 13 sports, and computes the no-vig and fair probabilities of every open market with the same maths as this page. Turn it on once on the stream:

subscribe JSON
{"type": "subscribe", "fair": true}

Each odds update with open markets is then followed by a fair message:

fair JSON
{
  "type": "fair",
  "data": {
    "event_id": 1638780974,
    "sport_id": 1,
    "channel": "ld",
    "ts": 1793458714075,
    "markets": [
      {
        "key": "s;0;m",
        "version": 3772905262,
        "margin": 0.075827,
        "prices": [
          {
            "designation": "home",
            "price": -238,
            "no_vig": 0.654512,
            "fair": 0.681313,
            "no_vig_decimal": 1.5279,
            "fair_decimal": 1.4678
          },
          {
            "designation": "away",
            "price": 655,
            "no_vig": 0.123115,
            "fair": 0.109537,
            "no_vig_decimal": 8.1225,
            "fair_decimal": 9.1293
          },
          {
            "designation": "draw",
            "price": 318,
            "no_vig": 0.222373,
            "fair": 0.20915,
            "no_vig_decimal": 4.497,
            "fair_decimal": 4.7813
          }
        ]
      },
      {
        "key": "s;0;ou;2.5",
        "version": 3772905263,
        "margin": 0.039746,
        "prices": [
          {
            "designation": "over",
            "price": 104,
            "points": 2.5,
            "no_vig": 0.471458,
            "fair": 0.469757,
            "no_vig_decimal": 2.1211,
            "fair_decimal": 2.1288
          },
          {
            "designation": "under",
            "price": -122,
            "points": 2.5,
            "no_vig": 0.528542,
            "fair": 0.530243,
            "no_vig_decimal": 1.892,
            "fair_decimal": 1.8859
          }
        ]
      }
    ]
  }
}

Check every price you can get elsewhere against it as it arrives. In Node.js, with your offers in a Map:

value.mjs JavaScript
// Your prices elsewhere, by event id, market key and outcome (decimal odds).
const offers = new Map([['1638780974|s;0;m|home', 1.55]]);
const MIN_EV = 0.02; // only flag bets worth at least +2 % per unit

// Call it with the data of every fair message.
function onFair(data) {
  for (const m of data.markets) {
    for (const leg of m.prices) {
      const mine = offers.get(data.event_id + '|' + m.key + '|' + leg.designation);
      if (!mine) continue;
      const ev = mine * leg.fair - 1;
      if (ev >= MIN_EV) {
        console.log(data.event_id, m.key, leg.designation, mine, 'EV', (ev * 100).toFixed(2) + ' %');
      }
    }
  }
}

Use a fair only for the market version you hold. The full client is in Pinnacle odds in Node.js and the WebSocket guide. Over REST, add fair=true to an event:

shell Shell
curl -H "x-token: $ODDSPUSH_KEY" "https://feed.oddspush.com/v1/events/1638780974?fair=true"
value.py Python
import json
import os
import urllib.request

BASE = "https://feed.oddspush.com/v1"
KEY = os.environ["ODDSPUSH_KEY"]


def fair_book(event_id: int, prematch: bool = False) -> dict:
    """Fair prices of every open market of an event, by market key."""
    query = "?fair=true" + ("&channel=pre" if prematch else "")
    req = urllib.request.Request(f"{BASE}/events/{event_id}{query}", headers={"x-token": KEY})
    with urllib.request.urlopen(req, timeout=10) as r:
        return json.loads(r.read()).get("fair", {})


def ev_and_kelly(my_decimal: float, p: float) -> tuple[float, float]:
    """Expected value per unit staked, and the full Kelly fraction (0 if the bet is -EV)."""
    ev = my_decimal * p - 1
    b = my_decimal - 1
    return ev, max(0.0, (b * p - (1 - p)) / b)


# A price I can get elsewhere: (event id, market key, outcome, decimal odds)
event_id, key, outcome, odds = 1638780974, "s;0;m", "home", 1.55
market = fair_book(event_id).get(key)
for leg in market["prices"] if market else []:
    if leg["designation"] == outcome:
        ev, kelly = ev_and_kelly(odds, leg["fair"])
        print(f"{key} {outcome} @ {odds}: EV {ev:+.2%}, Kelly {kelly:.2%}, quarter {kelly / 4:.2%}")
output Text
s;0;m home @ 1.55: EV +5.60%, Kelly 10.19%, quarter 2.55%

REST allows up to 120 requests at once and then 300 a minute per account, enough to check a few events; to watch a whole sport, use the stream. The same can be done in Python end to end: Pinnacle odds in Python.

Pinnacle's fair odds, live

The free trial gives you REST and the live stream, with no-vig and fair odds and closing lines, all 13 sports, for 7 days. No card.

OddsPush is not affiliated with, endorsed by or sponsored by Pinnacle. This page explains a calculation; it is not betting or investment advice.