Convert prediction market odds to probability

For the Fed meeting on Wednesday, 28 October 2026, prediction markets put a cut at 0.7%, no change at 92.0% and a rise at 7.2%. In the illustrative example for 24 October 2026, a price of 0.88 means an implied probability of 88.0%. When raw prices across all outcomes of a question add up to more than 1, divide each price by their total.

Do it with the API

In the 24 October 2026 example, venue prices follow the convention of quoting an outcome from 0 to 1, in dollars per 1 dollar payout. The price therefore gives the raw implied probability for that outcome. Normalisation uses the prices together, because the total belongs to all outcomes of one question.

Narwhal returns a probability for each outcome, already blended across venues. Each venue also has its own quotes. Decide which field you need before doing any arithmetic: the returned probabilities are ready to read, while raw outcome prices use the conversion in the Python example. REST and MCP share the same API key, so use the key from your Narwhal account.

  1. Get your API key Get a free key and keep it in an environment variable called NARWHAL_API_KEY. Send the key in the Authorization: Bearer YOUR_KEY header when you make a request.
  2. Read the question Use GET /v1/predictions/scalar/usa-fed-2026-10 at https://api.narwhalapi.com for the Fed's 28 October 2026 decision. Read each outcome's probability for the blended result, or its venue quotes when you want the venue's own prices.
  3. Read the date with the odds Free plan odds use the previous UTC day's close. The snapshot dated 24 October 2026 has as_of set to 2026-10-24T00:00:00Z; keep that date beside any figures you take from it.
  4. Normalise raw prices when needed For the illustrative raw prices dated 24 October 2026, add every outcome price for the same question, then divide each price by that total. Use this calculation when starting from raw prices; Narwhal's returned probability values already sum to 1.
    Python, from raw prices to probabilities
    # A venue quotes each outcome as a price between 0 and 1 (cents on the dollar). Narwhal returns the probabilities already
    # normalised, but if you start from raw prices you remove the overround yourself.
    yes_prices = {"cut": 0.05, "hold": 0.88, "hike": 0.10}      # example raw prices, sum 1.03
    total = sum(yes_prices.values())
    for outcome, price in yes_prices.items():
        print(f"{outcome:5} price {price:.2f}  implied {price:.1%}  normalised {price / total:.1%}")
    print("overround", round(total - 1, 2))

Do it in a sheet or without code

Put the raw prices for every outcome of the same question in a spreadsheet. For the illustrative example dated 24 October 2026, use B2:B4 for the prices and enter =B2/SUM($B$2:$B$4) beside the first price. Copy the formula beside the remaining prices and format the results as percentages.

The dollar signs keep the total tied to the same range as you copy the formula. Each row uses its own price as the numerator and the full set of outcome prices as the denominator. Include all outcomes in that range, since the normalisation uses the sum for the whole question.

For a question you want to read without a calculation, open the Narwhal prediction pages. They show the probabilities directly. Use a sheet when your starting point is a set of raw prices and you want to see each division beside the original quote.

Which option to use when

SituationBest optionWhy
A single question in the appRead the probability the API givesIt is already normalised
Raw prices from another sourceDivide each price by the sumThis removes the overround
Decimal, fractional or American oddsConvert with the formulas, then normaliseThe conversion gives raw implied probabilities

Decimal, fractional and American odds

Start with the formula for the way the odds are quoted. For decimal odds d, the implied probability is 1/d. For fractional odds a/b, use b/(a+b). For positive American odds +X, use 100/(X+100); for negative American odds -X, use X/(X+100), with X as the magnitude of the quoted number.

In these illustrative examples dated 24 October 2026, decimal odds of 2.50, fractional odds of 3/2 and American odds of +150 all mean a 40.0% implied probability. American odds of -200 mean 66.7%. Pick the function that matches your quote format and express the returned value as a percentage.

The American function accepts the signed quote, so keep the plus or minus sign associated with it. For a negative quote, the function uses its magnitude in the division. The fractional function takes the quoted numerator and denominator separately; put them in the same order as the fractional quote.

Python, odds formats to probability
def from_decimal(d):          # decimal odds, e.g. 2.50
    return 1 / d

def from_fractional(a, b):    # fractional odds a/b, e.g. 3/2
    return b / (a + b)

def from_american(x):         # American odds, e.g. +150 or -200
    return 100 / (x + 100) if x > 0 else -x / (-x + 100)

print(f"decimal 2.50   -> {from_decimal(2.50):.1%}")
print(f"fractional 3/2 -> {from_fractional(3, 2):.1%}")
print(f"American +150  -> {from_american(150):.1%}")
print(f"American -200  -> {from_american(-200):.1%}")

These formulas convert each quote separately. If you have odds for every outcome of the same market, add their raw implied probabilities and divide each by that sum. Changing the quote format does not remove the overround, so the conversion and the normalisation are separate calculations.

Why do prices add up to more than 100.0%?

Spreads and fees can make the best prices to buy every outcome total slightly more than the full payout. That excess is the overround. Divide each raw price by the total across all outcomes to remove it and express the outcomes as a normalised set of probabilities.

Is the price a forecast?

It is what traders pay, a market-implied probability rather than a guarantee.

Do I normalise Narwhal’s numbers again?

No, the returned probability values already sum to 1. Read those values directly when you need the blended probabilities for a question. Apply the raw-price calculation to raw quotes rather than treating the returned probabilities as prices that still have an overround.

Worked example: convert raw outcome prices

The figures in this illustrative example are from 24 October 2026.

For example, take raw prices of 0.05 for cut, 0.88 for hold and 0.10 for hike. Add them to get 1.03. Subtract the full payout of 1 from that total: the overround is 0.03, or 3 percentage points.

Divide each price by 1.03 to get its share of the total. The raw implied percentages come directly from the prices; the normalised percentages use that shared denominator. Keep the same denominator for every outcome so the calculation includes the full set of prices.

OutcomeRaw priceRaw implied probabilityCalculationNormalised probability
Cut0.055.0%0.05 / 1.034.9%
Hold0.8888.0%0.88 / 1.0385.4%
Hike0.1010.0%0.10 / 1.039.7%

Published .