Formula Sheet

Every equation this site runs, with each symbol named and a worked example beside it. Open one to check our arithmetic.

Sports betting math runs on five quantities: an American moneyline ML, the vig-inclusive probability q it implies, the fair probability p left after the margin is removed, the decimal odds d, and the net odds b = d − 1. Every formula below either converts between them or prices a bet from them.

Notation

Fixed throughout. Where a formula reuses a letter differently, it says so on the spot.

MLML: American moneyline
An integer with ML100|ML| \ge 100. Negative is the favorite (risk ML|ML| to win $100); positive is the underdog (risk $100 to win MLML). Unitless.
qq: implied probability
What a posted price implies, including the house margin. A number in (0,1)(0, 1). The two sides of a real market sum above 1.
pp: fair probability
The de-vigged estimate: what is left after the margin is stripped out. In (0,1)(0, 1), and the two sides sum to exactly 1.
dd: decimal odds
Total return per $1 staked, stake included. Dollars per dollar, d>1d > 1.
bb: net odds
b=d1b = d - 1: profit per $1 staked, stake excluded. Dollars per dollar, b>0b > 0.

Subscripts aa and bb index the two sides of a two-outcome market. Kalshi sections add CC (contracts, an integer count) and PP (contract price in dollars, 0<P<10 < P < 1).

Quick reference: seventy-four equations

Seventy-four equations on one screen: the cheat sheet the board and the calculators actually run, grouped by what each one computes. Every group links to the page that derives it step by step, and the forty-two below restate them with their symbols, units and a worked number.

Odds conversions

Learn →

Convert between American (moneyline), decimal, fractional, and implied probability in every direction, plus the overround and combined parlay odds.

p={100100+MLML>0ML100MLML<0p = \begin{cases} \dfrac{100}{100 + ML} & ML > 0 \\[6pt] \dfrac{-ML}{100 - ML} & ML < 0 \end{cases}
American → implied probabilityTurn a moneyline price into the probability it implies (favorites use the negative branch, underdogs the positive).
ML={100p1pp0.5100(1p)pp<0.5ML = \begin{cases} -\dfrac{100\,p}{1 - p} & p \ge 0.5 \\[6pt] \dfrac{100\,(1 - p)}{p} & p < 0.5 \end{cases}
Implied probability → AmericanInvert a probability back into a moneyline price; probabilities at or above one-half give a negative (favorite) line.
d={ML100+1ML>0100ML+1ML<0d = \begin{cases} \dfrac{ML}{100} + 1 & ML > 0 \\[6pt] \dfrac{100}{-ML} + 1 & ML < 0 \end{cases}
American → decimalConvert a moneyline to decimal odds (total return per 1 unit staked, including the stake back).
ML={100(d1)d2100d1d<2ML = \begin{cases} 100\,(d - 1) & d \ge 2 \\[6pt] -\dfrac{100}{d - 1} & d < 2 \end{cases}
Decimal → AmericanConvert decimal odds to a moneyline; decimal at or above 2.0 is a positive (underdog) line, below is negative.
p=1dp = \dfrac{1}{d}
Decimal → implied probabilityThe reciprocal of decimal odds is the probability those odds imply (before removing vig).
d=1pd = \dfrac{1}{p}
Implied probability → decimalThe fair decimal odds for an event of probability p, with no margin added.
b=d1d=b+1b = d - 1 \quad\Longleftrightarrow\quad d = b + 1
Net odds ↔ decimalNet (mathematical) odds b are profit per unit staked; decimal odds d add the returned stake.
d=ND+1d = \dfrac{N}{D} + 1
Fractional → decimalA fractional price N/D (e.g. 5/2) becomes decimal odds by adding one for the returned stake.
ND=d1\dfrac{N}{D} = d - 1
Decimal → fractionalSubtract the stake to recover the profit ratio, then reduce it to a fraction (e.g. 3.5 → 5/2).
p=DN+Dp = \dfrac{D}{N + D}
Fractional → implied probabilityThe probability implied by a fractional price N/D (denominator over the sum of both parts).
v=p1+p21=1d1+1d21v = p_1 + p_2 - 1 = \dfrac{1}{d_1} + \dfrac{1}{d_2} - 1
Overround / vig (two outcomes)The book's margin: how much the two implied probabilities sum above 1 (0 would be a fair, vig-free market).
dparlay=i=1ndid_{\mathrm{parlay}} = \prod_{i=1}^{n} d_i
Parlay / combined decimal oddsMultiply the decimal odds of each independent leg to get the combined price of the whole parlay.where d_i is each leg’s decimal odds.

De-vigging (fair probability)

Learn →

Three ways to strip a book's margin out of two-outcome moneylines and recover fair, no-vig probabilities, from simplest to most sophisticated.

pi=qiqa+qbp_i = \dfrac{q_i}{q_a + q_b}
Proportional normalizationSimplest de-vig: divide each side's implied probability q by the overround (their sum) so the fair probabilities add to 1.
pi=qik,qak+qbk=1, k1p_i = q_i^{\,k}, \quad q_a^{\,k} + q_b^{\,k} = 1,\ k \ge 1
Power methodSolve for the exponent k that makes the powered probabilities sum to 1; shades longshots harder than proportional, matching favorite-longshot bias.where q_i is each side’s implied probability and k the exponent being solved for.
pi=z2+4(1z)qi2/sz2(1z),s=qa+qbp_i = \dfrac{\sqrt{z^2 + 4(1-z)\,q_i^2/s} - z}{2(1-z)}, \quad s = q_a + q_b
Shin (insider-trading) methodModels the book padding prices against a fraction z of insider money; z is chosen so the fair probabilities sum to 1 (z = 0 recovers the proportional case).where q_i is each side’s implied probability, s their sum, and z the modeled insider fraction.

Expected value (+EV)

Learn →

How a posted price is scored against the de-vigged sharp-consensus fair line: expected value per dollar staked and the edge in probability points.

EV=pb(1p)\mathrm{EV} = p\,b - (1 - p)
Expected value per $1 stakedThe core +EV number: p is the fair win probability, b the net profit per $1 if it wins; this is exactly analyze_market's ev = p*b - (1-p).
b={ML100,ML>0100ML,ML<0b = \begin{cases} \dfrac{ML}{100}, & ML > 0 \\[6pt] \dfrac{-100}{ML}, & ML < 0 \end{cases}
Net profit b from an American moneylineProfit per $1 staked implied by the price (Moneyline2Odds); the b that goes into the EV formula.
q={100100+ML,ML>0ML100ML,ML<0q = \begin{cases} \dfrac{100}{100 + ML}, & ML > 0 \\[6pt] \dfrac{-ML}{100 - ML}, & ML < 0 \end{cases}
Implied probability q of a priceThe win probability baked into a posted price, vig still included (Moneyline2Prob); the benchmark the fair prob is compared against.
edge=pq\text{edge} = p - q
Edge in probability pointsFair probability minus the price's implied probability; a positive edge is the signal that a price is mispriced (edge = p - Moneyline2Prob(ml)).
EV=pd1,d=b+1\mathrm{EV} = p\,d - 1, \quad d = b + 1
EV from decimal oddsThe same EV written with full decimal odds d (stake plus profit returned); algebraically identical to p*b - (1-p).
EV=pqq=edgeq\mathrm{EV} = \dfrac{p - q}{q} = \dfrac{\text{edge}}{q}
EV from edge and implied probabilityEV per $1 rewritten as the probability edge scaled by the price's implied probability; shows EV and edge always share a sign.
pbe=11+b=qp_{\mathrm{be}} = \dfrac{1}{1 + b} = q
Break-even probabilityThe fair probability at which EV = 0; it equals the price's own implied probability, so any p above it is +EV.
EV>0    p>q\mathrm{EV} > 0 \iff p > q
Positive-EV conditionA price is positive-EV exactly when the de-vigged fair probability exceeds the implied probability (is_positive_ev in /api/ev).
q=11+b,b=1qqq = \dfrac{1}{1 + b}, \qquad b = \dfrac{1 - q}{q}
Fair odds and implied probabilityConvert between a vig-free profit multiplier b and its implied probability q; the fair-price relationship underneath every EV comparison.
0<EV<0.150 < \mathrm{EV} < 0.15
Suspect-EV flag bandThe board only flags a price as a genuine edge in this band; EV of $0.15 or more per $1 is treated as a stale or erroneous line (EV_SUSPECT_PER_DOLLAR) and left unflagged.

Kelly staking

Learn →

How much of the bankroll to stake: the growth-optimal fraction, its noise-tolerant fractional version, and the joint objective for several simultaneous bets.

f=p1pbf^{*} = p - \dfrac{1-p}{b}
Full-Kelly fractionGrowth-optimal share of bankroll for a single bet, where p is win probability and b the net fractional odds; a negative value means no edge, so stake zero.
f=bpqb,q=1pf^{*} = \dfrac{b\,p - q}{b}, \quad q = 1 - p
Full-Kelly (edge/odds form)Algebraically identical rewrite: expected profit per unit staked (b·p − q) divided by the odds b.
f=λmax ⁣(f,0)f = \lambda \cdot \max\!\left(f^{*},\, 0\right)
Fractional KellyScale the full-Kelly fraction by λ (Teacher's Bet defaults to λ = 1/2) to blunt the ruin risk of an overestimated edge; the max clamp keeps the stake non-negative.
g(f)=pln(1+bf)+(1p)ln(1f)g(f) = p\,\ln(1 + b\,f) + (1-p)\,\ln(1 - f)
Expected log-wealth growthExpected log-growth per bet at stake fraction f; the value Kelly maximizes, and what f* is the argmax of.
maxfi0, ifi1 ωP(ω)ln ⁣(1+ifiXi)\max_{\,f_i \ge 0,\ \sum_i f_i \le 1}\ \sum_{\omega} P(\omega)\,\ln\!\left(1 + \sum_i f_i X_i\right)
Joint simultaneous KellyFor n simultaneous bets, jointly maximize expected log wealth over all 2^n win/loss outcomes ω (payoff X_i = +b_i on a win, −1 on a loss); avoids the overallocation of summing per-bet Kelly.where f_i is the fraction staked on bet i, ω one joint win/loss outcome of all bets, and X_i the payoff of bet i (+b_i on a win, −1 on a loss).

Arbitrage

Learn →

Locking a fixed return by taking the best price on each side of a two-outcome market across different books. The arithmetic holds only while both prices do.

d={1+ML100,ML>01+100ML,ML<0d = \begin{cases} 1 + \dfrac{ML}{100}, & ML > 0 \\[4pt] 1 + \dfrac{100}{\lvert ML \rvert}, & ML < 0 \end{cases}
Decimal odds from American moneylineConverts an American moneyline to decimal odds (stake included in payout), the input to every arb formula.
da=maxkda(k),db=maxkdb(k)d_a = \max_{k}\, d_a^{(k)}, \qquad d_b = \max_{k}\, d_b^{(k)}
Best price per sideTake the highest decimal odds offered on each side across all books; the two legs may come from different books.where a, b label the two sides of the market and k runs over the books (the two legs may come from different books).
S=i1di=1da+1dbS = \sum_{i} \dfrac{1}{d_i} = \dfrac{1}{d_a} + \dfrac{1}{d_b}
Inverse-odds sum (booksum)The sum of inverse best decimal odds across the outcomes; S is the quantity every arb test and stake compares against.where i runs over the two sides and d_i is the best decimal price on side i.
1da+1db<1\dfrac{1}{d_a} + \dfrac{1}{d_b} < 1
Two-way arbitrage conditionA two-outcome arb exists exactly when the inverse best prices sum below 1 (equivalently S < 1).
si=T1/dij1/dj=TdiSs_i = T \cdot \dfrac{1/d_i}{\sum_{j} 1/d_j} = \dfrac{T}{d_i\, S}
Stake split (proportional to inverse odds)Stake on outcome i given total stake T, sized so the payout is identical whichever outcome wins.where T is the total staked, s_i the stake on side i, and S the inverse-odds sum above.
P=Ti1/di=TSP = \dfrac{T}{\sum_{i} 1/d_i} = \dfrac{T}{S}
Locked payoutThe same payout received on either outcome when stakes are split by the formula above.where T is the total staked and S the inverse-odds sum.
r=1i1/di1=1S1r = \dfrac{1}{\sum_{i} 1/d_i} - 1 = \dfrac{1}{S} - 1
Locked return fractionThe locked-in return per unit staked; it is positive exactly when an arb exists (S < 1).

Closing line value

Learn →

CLV is the de-vigged closing fair probability minus your price's implied probability, the exact quantity the Report Card grades.

CLV=pfaircloseqimplied\mathrm{CLV} = p_{\mathrm{fair}}^{\,\mathrm{close}} - q_{\mathrm{implied}}
Closing line value (probability points)The de-vigged closing fair probability minus your price's implied probability; positive means your price beat the close. This is exactly what the Report Card grades (clv = fair - implied).
qimplied={100100+MLML>0ML100MLML<0q_{\mathrm{implied}} = \begin{cases} \dfrac{100}{100 + \mathrm{ML}} & \mathrm{ML} > 0 \\[4pt] \dfrac{-\mathrm{ML}}{100 - \mathrm{ML}} & \mathrm{ML} < 0 \end{cases}
American moneyline to implied probabilityRestates an American moneyline price as its vig-inclusive implied probability q, the number CLV subtracts from the fair line.
qimplied=1dq_{\mathrm{implied}} = \dfrac{1}{d}
Decimal odds to implied probabilityThe same implied probability from decimal odds d, the reciprocal of the payout multiplier; use when a book quotes decimal rather than American.
pi=qiqa+qbp_i = \dfrac{q_i}{q_a + q_b}
De-vigged fair probability (proportional)Removes a two-way market's vig by normalizing so the fair probabilities sum to 1; pooled across sharp books at close this gives the fair line CLV is measured against.
grade={ACLV0.025BCLV0.010CCLV0.005DCLV0.020Fotherwise\text{grade} = \begin{cases} A & \mathrm{CLV} \ge 0.025 \\ B & \mathrm{CLV} \ge 0.010 \\ C & \mathrm{CLV} \ge -0.005 \\ D & \mathrm{CLV} \ge -0.020 \\ F & \text{otherwise} \end{cases}
Report Card letter gradeThe site's grade cutoffs applied to CLV as a probability fraction: A at +2.5 points of edge over the close, down to F below -2.0 points.
GPA=1ni=1ngi\mathrm{GPA} = \dfrac{1}{n} \sum_{i=1}^{n} g_i
Report Card GPAThe plain mean of each logged bet's grade points (A = 4, B = 3, C = 2, D = 1, F = 0) across n graded bets.

Sharp-consensus fair line

Learn →

The public pooling math behind the consensus fair line: map each book's de-vigged price into log-odds, take a weighted average there, and invert back to a vig-free probability.

z=ln ⁣(p1p)z = \ln\!\left(\dfrac{p}{1-p}\right)
Logit (log-odds) transformMaps a de-vigged win probability p into log-odds space, where a weighted average behaves correctly; each book's fair price is mapped here before pooling.
p=11+ezp = \dfrac{1}{1+e^{-z}}
Sigmoid (inverse logit)The inverse of the logit transform; turns a pooled log-odds value back into a probability between 0 and 1.
zˉ=iwiziiwi\bar{z} = \dfrac{\sum_{i} w_i\, z_i}{\sum_{i} w_i}
Weighted logarithmic opinion poolThe core aggregator: a weighted average of the books' log-odds, which stays calibrated instead of drifting to the muddled middle the way a plain probability average does.where z_i is book i’s de-vigged log-odds and w_i its weight in the pool.
pA=11+ezˉ,pB=1pAp_A = \dfrac{1}{1+e^{-\bar{z}}}, \quad p_B = 1 - p_A
Fair line from the poolApply the sigmoid to the pooled log-odds for side A's fair probability; side B is one minus it, so the two-way line sums to 1 with no vig.
pA1pA=i(pA,i1pA,i)wi/jwj\dfrac{p_A}{1-p_A} = \prod_{i} \left(\dfrac{p_{A,i}}{1-p_{A,i}}\right)^{w_i / \sum_j w_j}
Odds-ratio product formEquivalent view of the same pool: it is a weighted geometric mean of each book's odds ratio, which is why it differs from an arithmetic average of probabilities.
σz=iwi(zizˉ)2iwi\sigma_z = \sqrt{\dfrac{\sum_i w_i\,(z_i-\bar{z})^2}{\sum_i w_i}}
Dispersion (agreement)Weighted spread of the books' log-odds around the pooled value; small means the books agree (tight line), large means they disagree (wide).

Price notations and payout

Learn →

Fractional odds and prediction-market contract prices as probabilities, the exact fractional reduction, and what a stake actually returns.

q=11+b,b=nmq = \dfrac{1}{1 + b}, \quad b = \dfrac{n}{m}
Fractional → implied probabilityFractional odds quote profit per unit risked, so 10/11 implies 11/21.
q=c100c=100pq = \dfrac{c}{100} \quad\Longleftrightarrow\quad c = 100\,p
Contract cents ↔ probabilityA prediction-market price in cents is a probability with the decimal point moved.
b=1ppnmb = \dfrac{1 - p}{p} \longrightarrow \dfrac{n}{m}
Probability → fractional oddsThe best rational approximation of the net odds under a denominator cap: exact for every American price.
profit=Sb\text{profit} = S\,b
Profit on a stakeWhat the bet pays on top of the stake, which is what American and fractional odds quote.
return=Sd\text{return} = S\,d
Total return on a stakeStake plus profit, which is what decimal odds quote. Confusing the two is the usual payout error.

Hedging

Learn →

Sizing a hedge on a bet already placed, what the position pays either way, and what buying the certainty costs.

H=Sd1d2H = \dfrac{S\,d_1}{d_2}
Equal-profit hedgeThe stake that pays the same whichever side wins. It divides the first bet’s TOTAL return, not its profit.
H=Sd21H = \dfrac{S}{d_2 - 1}
Stake-back hedgeThe smaller hedge that returns the original stake and no profit.
S(d11)HvsH(d21)SS(d_1 - 1) - H \quad\text{vs}\quad H(d_2 - 1) - S
The two outcomesEach side’s profit minus the other side’s stake. Equal at the equal-profit hedge.
cost=H(p2d21)\text{cost} = -H\left(p_2 d_2 - 1\right)
Expected cost of the hedgeThe hedge leg’s own expected value, signed as a cost. Negative when the hedge is priced above fair value.

Middles

Learn →

Two opposite-side prices at different numbers: the rate the window has to land, and the three ways the position can end.

σ=1d1+1d2\sigma = \dfrac{1}{d_1} + \dfrac{1}{d_2}
Combined implied probabilityThe two prices added as probabilities. Everything about the middle follows from it.
h=σ1h^{*} = \sigma - 1
Required hit rateHow often both tickets have to win for the position to return exactly zero. It is the overround on the pair.
h=11σh = 1 - \dfrac{1}{\sigma}
HoldThe share of every dollar risked, and what a miss costs. A smaller number than the required hit rate.
EV=P(1+h)T,P=Tσ\mathrm{EV} = P(1 + h) - T, \quad P = \dfrac{T}{\sigma}
Expected value of a middleOn your own estimate of the hit rate. An estimate on the required rate returns zero.

Teasers

Learn →

One price over several moved numbers: what each leg has to win, what the points have to add, and what the tease gives up.

w=(1dT)1/nw = \left(\dfrac{1}{d_T}\right)^{1/n}
Break-even per legFor equal, independent legs. More legs at the same price means each leg must be a bigger favorite.
must buy=w1dB\text{must buy} = w - \dfrac{1}{d_B}
What the points must buyThe gap between what a leg needs after the tease and what it needed before it.
given up=1dTdBn\text{given up} = 1 - \dfrac{d_T}{d_B^{\,n}}
Payout given upThe teaser price against the same legs parlayed straight at their untouched numbers.
EV=pndT1\mathrm{EV} = p^n d_T - 1
Expected value of a teaserOn your own per-leg estimate, so it inherits that estimate’s error raised to the leg count.

Round robins

Learn →

Every combination of a set of legs as its own parlay: how many tickets, how much is at risk, and what it averages.

T=k(nk),R=sTT = \sum_k \binom{n}{k}, \quad R = s\,T
Tickets and total riskThe stake is per ticket, so the ticket count multiplies the money at risk.
return(W)=jWsDj\text{return}(W) = \sum_{j \subseteq W} s\,D_j
Return at a hit levelA ticket cashes when every one of its legs won. All 2^n outcomes are enumerated exactly.
EV=js(pkjDj1)\mathrm{EV} = \sum_j s\left(p^{k_j} D_j - 1\right)
Expected value, additivePer dollar risked, the stake-weighted average of the parlays inside. Combining adds no edge.

Break-even win rates

Learn →

The rate a price needs, and the statistics that say whether a settled record has separated from it.

q=1dq = \dfrac{1}{d}
Break-even rate of a priceHow often the bet has to win for the price to be a coin flip. Vig-inclusive.
q=P+rP(1P)q = P + r\,P\,(1 - P)
Break-even rate of a contractThe exchange fee moves the requirement above the contract price. Heaviest at a coin flip.
z=p^qq(1q)/nz = \dfrac{\hat{p} - q}{\sqrt{q(1-q)/n}}
z against break-evenThe standard error is taken under the null, since q is the rate being tested against.
p^+z22n±zp^(1p^)n+z24n21+z2n\dfrac{\hat{p} + \frac{z^2}{2n} \pm z\sqrt{\frac{\hat{p}(1-\hat{p})}{n} + \frac{z^2}{4n^2}}}{1 + \frac{z^2}{n}}
Wilson score intervalThe interval on the observed rate. Stays inside 0 and 1 where the normal interval does not.
n=(zαq(1q)+zβp(1p))2(pq)2n = \dfrac{\left(z_\alpha\sqrt{q(1-q)} + z_\beta\sqrt{p(1-p)}\right)^{2}}{(p - q)^{2}}
Bets needed to detect an edgeHalving the edge quadruples the sample. About 20,000 bets for one point over −110.

Reference only: every formula here is a calculation on inputs you supply, never advice. Symbols: p a fair probability, q an implied probability, b net decimal profit per $1, d decimal odds, ML an American moneyline, f* the full-Kelly fraction, λ the Kelly multiplier.

Implied probability from an American moneyline

The probability a posted price implies, house margin included.

q=ML100ML  (ML<0),q=100100+ML  (ML>0)q = \dfrac{-ML}{100 - ML} \ \ (ML < 0), \qquad q = \dfrac{100}{100 + ML} \ \ (ML > 0)

where:

  • MLML: the American moneyline, unitless, ML100|ML| \ge 100.
  • qq: implied probability, a fraction in (0,1)(0,1). It is not a fair probability: the margin is still in it.
Worked example: the market −152 / +138
qa=152100+152=152252=0.6032    60.32%q_a = \frac{152}{100 + 152} = \frac{152}{252} = 0.6032 \;\Rightarrow\; 60.32\%
qb=100100+138=100238=0.4202    42.02%q_b = \frac{100}{100 + 138} = \frac{100}{238} = 0.4202 \;\Rightarrow\; 42.02\%
Both branches are the same statement: risk divided by total return. They sum to 102.33%, and the 2.33% above par is the margin.

Implemented as moneyline_to_prob. Lesson: how to read the odds. Calculator: implied probability.

Net odds from an American moneyline

Profit per dollar risked, which is what every expected-value and Kelly formula below consumes.

b=100ML  (ML<0),b=ML100  (ML>0),d=1+bb = \dfrac{-100}{ML} \ \ (ML < 0), \qquad b = \dfrac{ML}{100} \ \ (ML > 0), \qquad d = 1 + b

where:

  • bb: net odds, in dollars of profit per $1 staked.
  • dd: decimal odds, in dollars returned per $1 staked, stake included.
Worked example: −152 and +138
b(152)=100152=0.6579    d=1.6579b(-152) = \frac{100}{152} = 0.6579 \;\Rightarrow\; d = 1.6579
b(+138)=138100=1.3800    d=2.3800b(+138) = \frac{138}{100} = 1.3800 \;\Rightarrow\; d = 2.3800
A $100 stake at −152 returns $165.79: $65.79 of profit plus the stake back.

Implemented as moneyline_to_odds. Calculator: odds converter.

Fair decimal odds from a probability

The price at which a bet on a probability breaks even: the zero-margin price.

d=1pd = \dfrac{1}{p}

where:

  • pp: fair probability, a fraction in (0,1)(0,1).
  • dd: fair decimal odds, dollars returned per dollar staked.
Worked example: the fair price behind −152
pa=0.589416    d=10.589416=1.6966p_a = 0.589416 \;\Rightarrow\; d = \frac{1}{0.589416} = 1.6966
The posted −152 pays 1.6579. The fair price is 1.6966. That 0.0387 gap is the margin, expressed as odds rather than as probability.

Implemented as prob_to_decimal.

Fair American moneyline from a probability

The same fair price written back in American notation, which needs two branches because the notation flips at even money.

ML=100p1p  (p0.5),ML=100(1p)p  (p<0.5)ML = \dfrac{-100\,p}{1 - p} \ \ (p \ge 0.5), \qquad ML = \dfrac{100\,(1 - p)}{p} \ \ (p < 0.5)

where:

  • pp: fair probability in (0,1)(0,1).
  • MLML: the fair moneyline, unitless. Negative at or above 50%, positive below.
Worked example: both sides of −152 / +138
pa=0.589416    MLa=100×0.5894160.410584=143.56p_a = 0.589416 \;\Rightarrow\; ML_a = \frac{-100 \times 0.589416}{0.410584} = -143.56
pb=0.410584    MLb=100×0.5894160.410584=+143.56p_b = 0.410584 \;\Rightarrow\; ML_b = \frac{100 \times 0.589416}{0.410584} = +143.56
A de-vigged market is symmetric by construction: the two fair moneylines are the same number with opposite signs. Any two-sided fair line that isn’t symmetric has arithmetic wrong somewhere.

Implemented as prob_to_moneyline. Calculator: no-vig fair odds.

The overround (the book’s margin)

How far the two posted sides sum above 100%. It is the margin the house has priced in.

overround=qa+qb1\text{overround} = q_a + q_b - 1

where:

  • qa, qbq_a,\ q_b: the two implied probabilities, each a fraction in (0,1)(0,1).
  • The result is in probability points expressed as a fraction: 0.0233 means 2.33 points over par.
Worked example: −152 / +138
0.603175+0.4201681=0.023343    2.33%0.603175 + 0.420168 - 1 = 0.023343 \;\Rightarrow\; 2.33\%
hold=0.0233431.023343=0.02281    2.28% of handle\text{hold} = \frac{0.023343}{1.023343} = 0.02281 \;\Rightarrow\; 2.28\%\text{ of handle}
Overround and hold are different numbers and get confused constantly. Overround is the excess over par; hold is the share of money wagered the house keeps on a perfectly balanced book. Hold is always the smaller of the two.

Implemented as overround. Calculator: vig and hold.

Proportional de-vig

Strips the margin by scaling both implied probabilities down by the same factor until they sum to one.

pi=qiqa+qbp_i = \dfrac{q_i}{q_a + q_b}

where:

  • qiq_i: side ii’s implied probability, a fraction.
  • pip_i: side ii’s fair probability, a fraction. The two pip_i sum to exactly 1.
Worked example: −152 / +138
pa=0.6031751.023343=0.589416    58.94%p_a = \frac{0.603175}{1.023343} = 0.589416 \;\Rightarrow\; 58.94\%
pb=0.4201681.023343=0.410584    41.06%p_b = \frac{0.420168}{1.023343} = 0.410584 \;\Rightarrow\; 41.06\%
It assumes the house spreads its margin evenly across both sides. That is the simplest assumption available and not what real books do, which is why the next two methods exist.

Implemented as devig_proportional. Lesson: how to de-vig odds.

Power de-vig

Raises both implied probabilities to a common exponent chosen so they sum to one, which takes proportionally more away from the longshot.

find k1 with qak+qbk=1,pi=qik\text{find } k \ge 1 \text{ with } q_a^{\,k} + q_b^{\,k} = 1, \qquad p_i = q_i^{\,k}

where:

  • kk: the fitted exponent, unitless and 1\ge 1. Solved numerically by bisection; k=1k = 1 means no margin to remove.
  • qi, piq_i,\ p_i: implied and fair probabilities as above.
Worked example: −152 / +138
k=1.035312    0.6031751.035312+0.4201681.035312=1k = 1.035312 \;\Rightarrow\; 0.603175^{1.035312} + 0.420168^{1.035312} = 1
pa=0.592502    59.25%,pb=0.407498    40.75%p_a = 0.592502 \;\Rightarrow\; 59.25\%, \qquad p_b = 0.407498 \;\Rightarrow\; 40.75\%
Against proportional, the favorite gains 0.31 points and the longshot loses 0.31. Because q<1q < 1, an exponent above 1 shrinks the small number by more, which is the observed favorite–longshot bias written as one parameter.

Implemented as devig_power.

Shin de-vig

Models the margin as protection against a fraction of informed money, then solves for the fair probabilities that assumption implies.

pi=z2+4(1z)qi2/s    z2(1z),s=qa+qbp_i = \dfrac{\sqrt{z^{2} + 4(1-z)\,q_i^{2} / s} \; - \; z}{2(1-z)}, \qquad s = q_a + q_b

where:

  • zz: the estimated fraction of stake coming from insiders, a number in [0,1)[0, 1). Solved by bisection so the two pip_i sum to 1.
  • ss: the booksum qa+qbq_a + q_b, unitless and above 1 for any real market.
  • qi, piq_i,\ p_i: implied and fair probabilities as above.
Worked example: −152 / +138
s=1.023343,z=0.023361s = 1.023343, \qquad z = 0.023361
0.000546+1.388862=1.178731,1.1787310.023361=1.155370\sqrt{0.000546 + 1.388862} = 1.178731, \qquad 1.178731 - 0.023361 = 1.155370
pa=1.1553701.953278=0.591503    59.15%,pb=40.85%p_a = \frac{1.155370}{1.953278} = 0.591503 \;\Rightarrow\; 59.15\%, \qquad p_b = 40.85\%
Shin lands between the other two here: 58.94% / 59.15% / 59.25% for proportional / Shin / power. On a market this tight the three methods disagree by a third of a point. On a lopsided one they disagree by far more, which is why the EV calculator reports all three.

Implemented as devig_shin. Source: Shin, H. S. (1993), “Measuring the Incidence of Insider Trading in a Market for State-Contingent Claims,” The Economic Journal 103(420), 1141–1153.

Expected value per dollar staked

The average profit a price returns per dollar risked, if the same price could be taken over and over.

EV=pb(1p)  =  p(b+1)1\text{EV} = p \cdot b - (1 - p) \;=\; p\,(b + 1) - 1

where:

  • pp: the fair win probability of the side being priced, a fraction. It has to come from a different venue than the price, or the answer is zero by construction.
  • bb: net odds of the price being tested, dollars of profit per dollar staked.
  • EV\text{EV}: dollars of expected profit per $1 staked. Multiply by the stake for expected profit on the bet.
Worked example: reference −140 / +120, price +145
power de-vigpb=0.434435,+145b=1.45\text{power de-vig} \Rightarrow p_b = 0.434435, \qquad +145 \Rightarrow b = 1.45
EV=0.434435×1.450.565565=+0.06437    +6.44% per $1\text{EV} = 0.434435 \times 1.45 - 0.565565 = +0.06437 \;\Rightarrow\; +6.44\%\text{ per \$1}
6.4¢ per dollar on average, over many repetitions of this exact price. A single bet returns $1.45 or −$1.00 and never $0.064. When the arithmetic comes out at or below zero, the answer is $0: there is no rounding up here.

Calculator: expected value. Lesson: expected value betting. API: POST /api/ev.

Break-even probability

How often a price has to win just to return the stake: the bar the fair probability has to clear.

pbe=11+b=1d=qp_{be} = \dfrac{1}{1 + b} = \dfrac{1}{d} = q

where:

  • b, db,\ d: net and decimal odds of the price, dollars per dollar.
  • pbep_{be}: break-even probability, a fraction. Identical to the price’s own implied probability qq.
Worked example: +145
pbe=11+1.45=12.45=0.408163    40.82%p_{be} = \frac{1}{1 + 1.45} = \frac{1}{2.45} = 0.408163 \;\Rightarrow\; 40.82\%
EV is positive exactly when p>pbep > p_{be}. The two statements “this price is +EV” and “the fair probability beats 40.82%” are the same claim.

Calculator: break-even win rate.

The full-Kelly fraction

The share of a bankroll that maximizes its long-run growth rate at a given edge and price.

f=p1pb  =  bpqb,q=1pf^{*} = p - \dfrac{1 - p}{b} \;=\; \dfrac{b\,p - q}{b}, \qquad q = 1 - p

where:

  • pp: win probability, a fraction. Yours, not the book’s.
  • bb: net odds, dollars of profit per dollar staked.
  • qq: in this formula only, the losing probability 1p1 - p. Everywhere else on this page qq is a price’s implied probability. The two coincide only when the price is exactly fair.
  • ff^{*}: fraction of bankroll, unitless. Negative means no edge.
Worked example: 65% at −152
b=0.657895,f=0.650.350.657895=0.650.532=0.118b = 0.657895, \qquad f^{*} = 0.65 - \frac{0.35}{0.657895} = 0.65 - 0.532 = 0.118
11.8% of bankroll at full Kelly. That is the growth-maximizing stake if 65% is exactly right. A probability estimate never is, which is what the next formula is for.

Implemented as kelly_fraction. Lesson: the Kelly criterion.

Fractional Kelly

A fixed multiple of the full-Kelly stake, which trades a little growth for a lot less volatility.

f=λmax(f,0),λ=0.5 by defaultf = \lambda \cdot \max(f^{*},\, 0), \qquad \lambda = 0.5 \text{ by default}

where:

  • λ\lambda: the Kelly multiplier, unitless in (0,1](0, 1]. Half is the default here; a quarter is the more conservative option.
  • max(f,0)\max(f^{*}, 0): the clamp that makes the no-edge answer zero rather than a negative stake.
  • ff: fraction of bankroll. Multiply by the bankroll, in dollars, for the stake.
Worked example: the same edge, $1,000 bankroll
f=0.5×0.118=0.059    0.059×$1,000=$59.00f = 0.5 \times 0.118 = 0.059 \;\Rightarrow\; 0.059 \times \$1{,}000 = \$59.00
f0    f=0    stake=$0f^{*} \le 0 \;\Rightarrow\; f = 0 \;\Rightarrow\; \text{stake} = \$0
The second line is not a formality. When the inputs contain no edge, the honest output is $0: never a small positive number rounded up out of one.

Implemented as fractional_kelly. Calculator: Kelly stake size.

Expected log growth rate

The compounding rate per bet at a chosen stake fraction: the curve Kelly sits at the top of.

g(f)=pln(1+bf)+(1p)ln(1f)g(f) = p\,\ln(1 + b\,f) + (1 - p)\,\ln(1 - f)

where:

  • ff: the stake as a fraction of bankroll, in [0,1)[0, 1).
  • p, bp,\ b: win probability and net odds as above.
  • g(f)g(f): expected log growth per bet. Multiply by 100 to read it as a percent per bet.
Worked example: 65% at −152, full vs. half
g(0.118)=0.65ln(1.077632)+0.35ln(0.882)=+0.004651    +0.465% / betg(0.118) = 0.65\ln(1.077632) + 0.35\ln(0.882) = +0.004651 \;\Rightarrow\; +0.465\%\text{ / bet}
g(0.059)=+0.003469    +0.347% / betg(0.059) = +0.003469 \;\Rightarrow\; +0.347\%\text{ / bet}
Half the stake keeps 74.6% of the growth. That asymmetry (most of the upside for half the exposure) is the entire argument for betting a fraction.

Implemented as growth_rate.

Simultaneous (joint) Kelly

Sizes several bets that settle at the same time by maximizing expected log wealth over every way the slate can land, instead of sizing each bet as if it were alone.

maxfi0, ifi1 ωP(ω)ln ⁣(1+ifiXi),Xi={+biwin1loss\max_{f_i \ge 0,\ \sum_i f_i \le 1} \ \sum_{\omega} P(\omega)\,\ln\!\Big(1 + \sum_i f_i X_i\Big), \qquad X_i = \begin{cases} +b_i & \text{win} \\ -1 & \text{loss} \end{cases}

where:

  • fif_i: the fraction of bankroll on bet ii, unitless.
  • ω\omega: one of the 2n2^{n} win/loss outcomes across nn bets; P(ω)P(\omega) is its probability.
  • XiX_i: the payoff per dollar on bet ii: +bi+b_i on a win, 1-1 on a loss.
Worked example: two bets at once

Bet 1: 65% at −152 (b=0.6579b = 0.6579). Bet 2: 50% at +120 (b=1.20b = 1.20). Independent.

naive, bet-by-bet: 11.80%+8.33%=20.13% of bankroll\text{naive, bet-by-bet: } 11.80\% + 8.33\% = 20.13\%\text{ of bankroll}
joint: 11.70%+8.26%=19.96%\text{joint: } 11.70\% + 8.26\% = 19.96\%
at λ=0.5: $58.50+$41.28=$99.78 on a $1,000 bankroll\text{at } \lambda = 0.5: \ \$58.50 + \$41.28 = \$99.78 \text{ on a } \$1{,}000 \text{ bankroll}
Independent bets need only a small correction: 17 basis points here. Correlated ones need a large one: two bets that always land together are one bet at double stake, so the joint solution splits a single Kelly fraction between them.

Implemented as simultaneous_kelly. API: POST /api/kelly/simultaneous.

The inverse-odds sum

One number that says whether the best price on each side, taken together, sells the whole market for less than a dollar.

S=1da+1db,an arb exists    S<1S = \dfrac{1}{d_a} + \dfrac{1}{d_b}, \qquad \text{an arb exists} \iff S < 1

where:

  • da, dbd_a,\ d_b: the best available decimal odds on each side, possibly from different books.
  • SS: the inverse-odds sum, unitless. It is the cost, in dollars, of buying $1 of locked payout.
Worked example: +110 at one book, +115 at another
da=2.10,db=2.15d_a = 2.10, \quad d_b = 2.15
S=12.10+12.15=0.476190+0.465116=0.941307<1S = \frac{1}{2.10} + \frac{1}{2.15} = 0.476190 + 0.465116 = 0.941307 < 1
$0.9413 buys $1.00 of payout. Below 1 the market is being sold at a discount to certainty; at or above 1 there is nothing here and the honest answer is no arb.

Implemented as find_arbitrage. Calculator: arbitrage stake split.

The arbitrage stake split

How a fixed total divides across the two sides so the payout is identical whichever one wins.

si=T1/diSs_i = T \cdot \dfrac{1 / d_i}{S}

where:

  • TT: total amount staked across both sides, in dollars.
  • did_i: decimal odds taken on side ii.
  • sis_i: stake on side ii, in dollars. The two sum to TT.
Worked example: $1,000 across 2.10 and 2.15
sa=1000×0.4761900.941307=$505.88,sb=1000×0.4651160.941307=$494.12s_a = 1000 \times \frac{0.476190}{0.941307} = \$505.88, \qquad s_b = 1000 \times \frac{0.465116}{0.941307} = \$494.12
505.8824×2.10=$1,062.35,494.1176×2.15=$1,062.35505.8824 \times 2.10 = \$1{,}062.35, \qquad 494.1176 \times 2.15 = \$1{,}062.35
Both legs return the same $1,062.35 ($1,062.3529 at full stake precision), which is why the check above carries four decimals: rounding the stakes to whole cents first leaves a cent of drift. Matching payouts are the whole point of the split. This is arithmetic on two posted prices, and it assumes both fill at the quoted number, which, on a two-leg position placed by hand, is the assumption that fails.

Implemented as find_arbitrage. Lesson: arbitrage betting.

Locked payout and return

What the split pays and what that is as a percentage of the money put up.

P=TS,r=1S1P = \dfrac{T}{S}, \qquad r = \dfrac{1}{S} - 1

where:

  • PP: payout, in dollars, identical on either outcome.
  • rr: return as a fraction of TT. Profit in dollars is PT=rTP - T = r\,T.
Worked example: the same $1,000
P=10000.941307=$1,062.35,r=10.9413071=0.06235    6.24%P = \frac{1000}{0.941307} = \$1{,}062.35, \qquad r = \frac{1}{0.941307} - 1 = 0.06235 \;\Rightarrow\; 6.24\%
Above ARB_SUSPECT_RETURN = 12% the site stops calling it an arb and flags it as suspect. A two-way market that far apart is nearly always one venue that has not moved yet, and the leg that looks generous is the one that will be voided or already gone.

Implemented as find_arbitrage. Calculator: prediction-market arb.

Kalshi taker fee

What crossing the spread on a Kalshi event contract costs, charged on the trade and rounded up to the cent on the total.

feetaker=0.07CP(1P)cent\text{fee}_{\text{taker}} = \lceil\, 0.07 \cdot C \cdot P \cdot (1 - P) \,\rceil_{\text{cent}}

where:

  • CC: number of contracts, an integer count.
  • PP: contract price in dollars, 0<P<10 < P < 1 (a 50¢ contract is P=0.50P = 0.50).
  • cent\lceil \cdot \rceil_{\text{cent}}: round up to the next cent (ceil_cent), applied once to the total, not per contract.
  • Result is in dollars.
Worked example: 100 contracts at 50¢
0.07×100×0.50×0.50=1.75    $1.75 (1.75 cents per contract)0.07 \times 100 \times 0.50 \times 0.50 = 1.75 \;\Rightarrow\; \$1.75 \ \text{(1.75 cents per contract)}
cost=100×0.50=$50.00,total outlay=$51.75\text{cost} = 100 \times 0.50 = \$50.00, \qquad \text{total outlay} = \$51.75
The fee peaks at a coin flip and shrinks toward the tails: the exact inverse of sportsbook vig, which is heaviest on longshots.

Implemented as kalshi_fee. Source: kalshi.com/fee-schedule, July 2026 revision. Calculator: Kalshi fees.

Kalshi maker fee

The same shape at roughly a quarter of the rate, charged when a resting order is filled rather than taken.

feemaker=0.0175CP(1P)cent\text{fee}_{\text{maker}} = \lceil\, 0.0175 \cdot C \cdot P \cdot (1 - P) \,\rceil_{\text{cent}}

where:

  • C, PC,\ P: contracts and price in dollars, as above.
  • 0.0175 is one quarter of the 0.07 taker rate.
Worked example: 100 contracts at 50¢, resting
0.0175×100×0.50×0.50=0.4375    $0.440.0175 \times 100 \times 0.50 \times 0.50 = 0.4375 \;\Rightarrow\; \$0.44
0.4375 rounds up to $0.44, not down to $0.43. The rounding is always in the exchange’s favor, and on small orders it is a material share of the fee. A few major events carry a flat 0.25% maker fee instead, which on a sub-5¢ contract is a large fraction of the contract price, so read the contract’s own terms rather than assuming this formula.

Implemented as kalshi_fee with side="maker".

Fee-adjusted break-even

The true probability a contract has to clear once the entry fee is counted, not the price on the screen.

ptrueP+rateP(1P)p_{true} \ge P + \text{rate} \cdot P \cdot (1 - P)

where:

  • PP: contract price in dollars.
  • rate\text{rate}: 0.07 taker, 0.0175 maker, unitless.
  • ptruep_{true}: the fair probability needed to break even, a fraction.
Worked example: a 50¢ and a 5¢ contract, taker
P=0.50:0.50+0.07×0.50×0.50=0.5175    51.75%P = 0.50: \quad 0.50 + 0.07 \times 0.50 \times 0.50 = 0.5175 \;\Rightarrow\; 51.75\%
P=0.05:0.05+0.07×0.05×0.95=0.053325    5.33%P = 0.05: \quad 0.05 + 0.07 \times 0.05 \times 0.95 = 0.053325 \;\Rightarrow\; 5.33\%
A 50¢ contract is not a 50/50 proposition after fees; it needs 51.75%. The fair value and the fee-adjusted break-even are two different numbers and this site reports them separately: conflating them is how a break-even trade reads as an edge.

Implemented as kalshi_breakeven. API: POST /api/kalshifees.

Fee as a share of outlay

The same fee expressed against the money actually put up, which is where the tail contracts look very different.

feeCP=rate(1P)\dfrac{\text{fee}}{C \cdot P} = \text{rate} \cdot (1 - P)

where:

  • CPC \cdot P: the outlay in dollars: contracts times price.
  • The result is a fraction of stake, and CC cancels: it depends only on the price.
Worked example: 50¢ vs. 5¢, taker
P=0.50:0.07×0.50=0.035    3.5% of stakeP = 0.50: \quad 0.07 \times 0.50 = 0.035 \;\Rightarrow\; 3.5\%\text{ of stake}
P=0.05:0.07×0.95=0.0665    6.65% of stakeP = 0.05: \quad 0.07 \times 0.95 = 0.0665 \;\Rightarrow\; 6.65\%\text{ of stake}
In cents per contract the tail is cheap; as a share of what you put up it is nearly twice the price of a coin flip. Both readings are correct, and quoting only the first is how the cost of longshot contracts gets understated.

Implemented as kalshi_fee_of_outlay.

Round trip vs. holding to settlement

Trading out charges the fee twice; letting a contract resolve charges it once.

round trip=2×fee,settlement fee=0\text{round trip} = 2 \times \text{fee}, \qquad \text{settlement fee} = 0

where:

  • Entry and exit are each charged at the applicable taker or maker rate; the exit fee is computed at the exit price, so 2 × fee is the estimate at an unchanged price.
  • Settlement costs nothing, in dollars.
Worked example: 100 contracts at 50¢, taker
entry $1.75+exit $1.75=$3.50 round trip\text{entry } \$1.75 + \text{exit } \$1.75 = \$3.50 \text{ round trip}
entry $1.75+settlement $0.00=$1.75 held to resolution\text{entry } \$1.75 + \text{settlement } \$0.00 = \$1.75 \text{ held to resolution}
On a 100-contract position the difference is $1.75: 3.5% of the $50 outlay, and larger than most edges anyone finds. It is a fact about the fee schedule, stated so it can be included in the arithmetic.

Implemented as kalshi_fee_breakdown. Lesson: how Kalshi pricing works.

Fractional odds and the contract price

Two more ways of writing the same break-even probability. Fractional odds quote the profit, so they are net odds as a ratio; a prediction-market contract quotes the probability directly, in cents.

q=11+b,b=nm,q=c100q = \dfrac{1}{1 + b}, \qquad b = \dfrac{n}{m}, \qquad q = \dfrac{c}{100}

where:

  • bb net odds: profit per 1 unit staked
  • n/mn/m fractional odds as posted, for example 10/11
  • cc a contract price in cents, strictly between 0 and 100
Worked example: 10/11, and a 52.4¢ contract

A 10/11 price pays 10 profit on 11 risked, and a contract at 52.4¢ pays 47.6¢ on 52.4¢ risked. They are the same price to within rounding.

q=11+1011=1121=0.5238    52.38%q = \frac{1}{1 + \frac{10}{11}} = \frac{11}{21} = 0.5238 \;\Rightarrow\; 52.38\%
q=52.4100=0.5240    52.40%q = \frac{52.4}{100} = 0.5240 \;\Rightarrow\; 52.40\%
A contract price is a probability with the decimal point moved, which is why prediction markets need no conversion table. Both figures are still vig-inclusive: the exchange fee is a separate charge, not part of the price.

Implemented as price_to_prob, net_odds_to_prob, cents_to_prob and prob_to_cents. Lesson: prediction markets explained. Calculator: odds converter.

American odds from decimal odds

Decimal 2.00 is the hinge. At or above it the price is a plus number, below it a minus number.

ML={100(d1)d2100d1d<2ML = \begin{cases} 100\,(d - 1) & d \ge 2 \\[6pt] -\dfrac{100}{d - 1} & d < 2 \end{cases}

where:

  • dd decimal odds: total return per 1 unit staked, stake included
Worked example: decimal 1.909 and decimal 3.50

A 1.909 price is a favorite, a 3.50 price is a longshot.

ML=1001.9091=110,ML=100(3.501)=+250ML = -\frac{100}{1.909 - 1} = -110, \qquad ML = 100\,(3.50 - 1) = +250
Exactly 2.00 returns +100 here, where the fair-price conversion returns −100 for the same 50% price. Both are right: even money is posted as +100, EVEN or PK depending on the book, and the two functions inherit different sides of the tie. Nowhere else do they disagree.

Implemented as decimal_to_moneyline. Lesson: how to read the odds. Calculator: odds converter.

Reducing a price to fractional odds

Fractional odds are a rational number, so the reduction is a search for the best rational approximation of the net odds under a denominator cap. Continued-fraction convergents give it exactly.

b=1pp    nm  with mmmaxb = \dfrac{1 - p}{p} \;\longrightarrow\; \frac{n}{m} \ \text{ with } m \le m_{\max}

where:

  • mmaxm_{\max} the denominator cap: 200 for an ordinary price, and sized to the price for a very short one
Worked example: a 52.38% price, and a 1-in-250 longshot

Every American price is rational with a small denominator, so the reduction is exact rather than approximate.

b=10.52380.5238=1011,b=1249b = \frac{1 - 0.5238}{0.5238} = \frac{10}{11}, \qquad b = \frac{1}{249}
A flat cap of 200 cannot express 1/249 at all, and a search that gives up returns 0/1: a printed claim that the bet pays nothing. So the cap is sized to the price, and a reduction that is only approximate is flagged as approximate rather than presented as exact.

Implemented as prob_to_fractional, best_fraction and fraction_cap. Calculator: odds converter.

Payout on a stake

What a bet returns if it wins. Decimal odds quote the total return; American and fractional odds quote the profit. Confusing the two is the most common payout error there is.

profit=Sb,return=Sd=S(1+b)\text{profit} = S\,b, \qquad \text{return} = S\,d = S\,(1 + b)

where:

  • SS the stake, in whatever currency you are thinking in
Worked example: $100 at −110

A −110 price is 0.909 net odds, so a $100 stake wins $90.91 and returns $190.91 in all.

profit=100×0.9091=$90.91,return=100×1.9091=$190.91\text{profit} = 100 \times 0.9091 = \$90.91, \qquad \text{return} = 100 \times 1.9091 = \$190.91
Given the price on the other side of the same market, the pair can be de-vigged and the same stake priced at the fair line: at −110 / −105 the fair profit is $97.78, so the margin costs this bet $6.87. When the two prices carry no margin, that cost is zero, and it is printed as zero.

Implemented as payout. Lesson: how to read the odds. Calculator: bet payout.

The equal-profit hedge

You hold a bet at one price and the other side is now available at another. The stake that pays the same whichever side wins divides the first bet’s total return by the hedge price.

H=Sd1d2H = \dfrac{S\,d_1}{d_2}

where:

  • SS the original stake
  • d1d_1 decimal odds of the price you took
  • d2d_2 decimal odds available on the other side now
Worked example: $100 taken at +150, hedged at −130

The original bet returns $250 in all if it wins. Dividing that by the hedge price gives the stake that matches it.

H=100×2.501.7692=$141.30H = \frac{100 \times 2.50}{1.7692} = \$141.30
Dividing the profit instead of the total return is the classic error, and it under-hedges: $150 / 1.7692 = $84.78, which leaves a swing of more than $56 between the two outcomes.

Implemented as equal_profit_stake and hedge_stake. Calculator: hedge calculator.

What the position pays either way

Two bets, two outcomes. Each one is the winning side’s profit minus the losing side’s stake.

original wins=S(d11)H,hedge wins=H(d21)S\text{original wins} = S(d_1 - 1) - H, \qquad \text{hedge wins} = H(d_2 - 1) - S

where:

  • HH the hedge stake actually placed, which need not be the equal-profit one
Worked example: the same $141.30 hedge, and the stake-back alternative

At the equal-profit stake both outcomes are identical. A smaller hedge of $130 instead returns the original stake and nothing more if the hedge side wins.

100(2.501)141.30=$8.70,141.30(1.76921)100=$8.70100(2.50 - 1) - 141.30 = \$8.70, \qquad 141.30(1.7692 - 1) - 100 = \$8.70
H=Sd21=1000.7692=$130    130(0.7692)100=$0H = \frac{S}{d_2 - 1} = \frac{100}{0.7692} = \$130 \;\Rightarrow\; 130(0.7692) - 100 = \$0
Whether the locked figure is a profit or a loss depends entirely on the two prices. Hedging a position at a worse price than you took locks a loss, and the arithmetic says so rather than presenting it as certainty won.

Implemented as stake_back_stake and hedge_breakdown. Calculator: hedge calculator.

What the certainty costs

Sizing a hedge is bookkeeping. Whether to hedge is a question about the price, and the answer is the hedge leg’s own expected value: a hedge below fair value buys certainty and pays for it.

cost per $1 hedged=1p2d2,expected cost=H(p2d21)\text{cost per \$1 hedged} = 1 - p_2 d_2, \qquad \text{expected cost} = -H(p_2 d_2 - 1)

where:

  • p2p_2 the de-vigged fair probability of the hedge side, from the two CURRENT prices
Worked example: hedging at −180 while your own side sits at +150

De-vigging +150 / −180 puts the hedge side at 61.64% fair against a 64.29% break-even, so each dollar hedged gives up about 4 cents.

10.6164×1.5556=0.0411    4.11c per $1 hedged1 - 0.6164 \times 1.5556 = 0.0411 \;\Rightarrow\; 4.11\text{c per \$1 hedged}
The figure goes negative when the two current prices cross, which means the hedge is priced above fair value and is not a cost at all. It is reported as negative rather than floored at zero, because pretending a free hedge costs nothing to buy would hide the more interesting fact that it pays.

Implemented as hedge_breakdown. Lesson: how to de-vig odds. Calculator: hedge calculator.

The required hit rate of a middle

A middle is two opposite-side prices at different numbers, so there is a window where both tickets win. Everything about it follows from the combined implied probability of the pair.

σ=1d1+1d2,h=σ1\sigma = \dfrac{1}{d_1} + \dfrac{1}{d_2}, \qquad h^{*} = \sigma - 1

where:

  • σ\sigma the two prices’ combined implied probability
  • hh^{*} how often the window has to land for the position to return exactly zero
Worked example: −110 on each side

Two −110 prices imply 52.38% each, so the pair sums to 104.76%.

h=1.0476191=0.047619    4.76%h^{*} = 1.047619 - 1 = 0.047619 \;\Rightarrow\; 4.76\%
The required hit rate is exactly the overround on the two prices. Below zero it means the pair sums under 100%, both sides already clear, and what you hold is an arbitrage with a bonus rather than a middle.

Implemented as required_hit_rate and inverse_odds_sum. Calculator: middle calculator.

Hold, which is not the required hit rate

Two numbers that look alike and are not. The required hit rate is in probability points of hit rate. The hold is the share of every dollar risked, and it is what a miss actually costs.

h=σ1σ=11σh = \dfrac{\sigma - 1}{\sigma} = 1 - \dfrac{1}{\sigma}
Worked example: −110 on each side, again

The same pair that requires a 4.76% hit rate holds 4.55% of the money.

h=0.0476191.047619=0.045455    4.55%h = \frac{0.047619}{1.047619} = 0.045455 \;\Rightarrow\; 4.55\%
A $100 middle on that pair loses $4.55 when it misses, not $4.76. The field uses the words overround and hold for both quantities, which is why both are printed here rather than one being left to inference.

Implemented as middle_breakdown, and as hold for a single two-way market. Calculator: vig and hold.

The three-cell payoff grid

Stake each side proportional to 1 over its price and one winning side always returns the same amount. What changes is how many sides win.

si=Tdiσ,P=Tσ,miss=PT,hit=2PTs_i = \dfrac{T}{d_i\,\sigma}, \qquad P = \dfrac{T}{\sigma}, \qquad \text{miss} = P - T, \qquad \text{hit} = 2P - T

where:

  • TT the total staked across both sides
  • PP what one winning side returns
Worked example: $100 across −110 / −110

The stakes split evenly, and one winning ticket returns $95.45.

miss=95.45100=$4.55,hit=190.91100=+$90.91\text{miss} = 95.45 - 100 = -\$4.55, \qquad \text{hit} = 190.91 - 100 = +\$90.91
A hit is exactly one extra winning side better than a miss, which is the whole appeal: risk the hold to win a multiple of it. Expected value is P(1+h)TP(1 + h) - T on your own estimate of the hit rate, and an estimate sitting on the required rate returns exactly zero.

Implemented as middle_stakes and middle_breakdown. Calculator: middle calculator.

The per-leg break-even of a teaser

A teaser is one quoted price over several legs whose numbers have all been moved. For equal, independent legs the ticket’s break-even chance splits evenly by taking the nth root.

w=(1dT)1/nw = \left(\dfrac{1}{d_T}\right)^{1/n}

where:

  • dTd_T decimal odds of the quoted teaser price
  • nn the number of legs
  • ww the win rate each leg needs after the tease
Worked example: a two-team six-point tease at −120

A −120 ticket needs 54.55%, so each of two equal legs needs the square root of that.

w=(0.545455)1/2=0.7385    73.85%w = (0.545455)^{1/2} = 0.7385 \;\Rightarrow\; 73.85\%
More legs at the same quoted price means each leg has to be a bigger favorite, not a smaller one: 73.85% at two legs, 81.71% at three, 85.94% at four. Independence is doing real work here, and a tease off one game’s key numbers is correlated.

Implemented as teaser_breakeven. Calculator: teaser calculator.

What the bought points have to be worth

The only part of a teaser that is arithmetic: the gap between what each leg needs after the tease and what it already needed before it.

must buy=w1dB,per point=w1/dBpoints\text{must buy} = w - \dfrac{1}{d_B}, \qquad \text{per point} = \dfrac{w - 1/d_B}{\text{points}}

where:

  • dBd_B decimal odds of one leg at its untouched number
Worked example: the same tease, off −110 legs

A −110 leg is already a 52.38% proposition, so the six points have to add 21.47 probability points.

must buy=0.73850.5238=0.2147,per point=0.21476=0.0358\text{must buy} = 0.7385 - 0.5238 = 0.2147, \qquad \text{per point} = \frac{0.2147}{6} = 0.0358
Per point is an average across points of very unequal value: the ones beside 3 and 7 are worth several times the rest. This is what the points have to be worth. Whether they are is a question about where football margins land, and no formula on this page answers it.

Implemented as points_needed. Calculator: teaser calculator.

The payout a tease gives up

The points are not free: the teaser price is worse than the same legs parlayed straight, and the difference is what you are paying.

given up=1dTdBn,EV=pndT1\text{given up} = 1 - \dfrac{d_T}{d_B^{\,n}}, \qquad \mathrm{EV} = p^n d_T - 1

where:

  • pp your own estimate of each leg’s win rate after the tease
Worked example: −120 against two −110 legs parlayed

Two −110 legs parlay to 3.645. The teaser pays 1.833.

given up=11.83333.6446=0.4970    49.70%\text{given up} = 1 - \frac{1.8333}{3.6446} = 0.4970 \;\Rightarrow\; 49.70\%
Expected value is pndT1p^n d_T - 1 on your own per-leg estimate, so it inherits that estimate’s error raised to the power of the leg count. Comparing the tease against the straight price at the teased numbers, where the book will sell you the same position, is the only apples-to-apples test.

Implemented as teaser_breakdown. Calculator: teaser calculator.

Tickets and total risk

A round robin bets every combination of a chosen size as a separate parlay. The stake is per ticket, so the ticket count multiplies the money at risk.

T=k(nk),R=sT,Dj=ijdiT = \sum_k \binom{n}{k}, \qquad R = s\,T, \qquad D_j = \prod_{i \in j} d_i

where:

  • nn the number of legs
  • kk each combination size requested
  • ss the stake per ticket
  • DjD_j decimal odds of ticket j: the product of its legs
Worked example: four legs by 2s and 3s at $10 a ticket

Four legs give six pairs and four trebles.

T=(42)+(43)=6+4=10,R=10×$10=$100T = \binom{4}{2} + \binom{4}{3} = 6 + 4 = 10, \qquad R = 10 \times \$10 = \$100
The single biggest surprise on a round-robin slip is right here: a $10 round robin is not a $10 bet. Three legs by 2s risks $30, and nine legs by 2s and 3s risks $1,200.

Implemented as ticket_count and combination_tickets. Calculator: round robin calculator.

What each hit level returns

For a given set of winning legs, a ticket cashes if every one of its legs is in that set. Enumerating all sets gives the exact distribution, not an estimate.

return(W)=jWsDj,Pr(m correct)=(nm)pm(1p)nm\text{return}(W) = \sum_{j \subseteq W} s\,D_j, \qquad \Pr(m \text{ correct}) = \binom{n}{m} p^m (1-p)^{n-m}

where:

  • WW the set of legs that won
  • mm how many legs were correct
  • pp a common per-leg win rate, assuming independent legs
Worked example: three −110 legs by 2s, $10 a ticket

Three tickets, $30 at risk. Two correct legs cashes exactly one of them.

2 correct:  $36.45    +$6.45,3 correct:  $109.34    +$79.342 \text{ correct}: \; \$36.45 \;\Rightarrow\; +\$6.45, \qquad 3 \text{ correct}: \; \$109.34 \;\Rightarrow\; +\$79.34
All 2n2^n sets of winning legs are enumerated exactly, which is why the leg count is capped at nine. The per-level probabilities assume independent legs at a common rate; legs from the same game are neither.

Implemented as round_robin_breakdown. Calculator: round robin calculator.

Expected value is additive across tickets

Nothing about combining legs creates edge. Expected value sums over the tickets, so per dollar risked a round robin is exactly the stake-weighted average of the parlays inside it.

EV=js(pkjDj1)\mathrm{EV} = \sum_j s\left(p^{k_j} D_j - 1\right)

where:

  • kjk_j the number of legs on ticket j
Worked example: fair legs, any combination

At a per-leg rate equal to the price, every parlay inside the round robin is a fair bet, so the whole slip is one too.

p=1d    pkDj=(1d)kdk=1    EV=$0p = \frac{1}{d} \;\Rightarrow\; p^{k} D_j = \left(\frac{1}{d}\right)^{k} d^{\,k} = 1 \;\Rightarrow\; \mathrm{EV} = \$0
Splitting the same money over more tickets changes the spread of outcomes, not the mean. That is the honest reading of a round robin: it buys a different shape of risk, and the arithmetic prints $0 where there is no edge to print.

Implemented as round_robin_breakdown. Calculator: round robin calculator.

The win rate a price needs

The break-even rate is the price read as a probability. On a prediction-market contract the trading fee moves it, so the requirement sits above the contract price.

q=1d,q=P+rP(1P)q = \dfrac{1}{d}, \qquad q = P + r\,P\,(1 - P)

where:

  • PP a contract price in dollars
  • rr the exchange fee rate: 0.07 taker, 0.0175 maker
Worked example: −110, and a 50¢ contract

A −110 bet has to win 52.38% of the time. A 50-cent contract bought as a taker has to resolve YES 51.75% of the time.

q=11.9091=52.38%,q=0.50+0.07(0.50)(0.50)=51.75%q = \frac{1}{1.9091} = 52.38\%, \qquad q = 0.50 + 0.07(0.50)(0.50) = 51.75\%
The sportsbook figure carries the venue’s margin, so it is not a fair probability. The exchange figure carries the fee instead, which is heaviest at a coin flip: the exact inverse of vig, which is heaviest on longshots.

Implemented as breakeven_win_rate. Lesson: how Kalshi pricing works. Calculator: break-even win rate.

Testing a record against that rate

A win rate is a sample mean of a coin flip, and a sample mean is not a skill level. The standard error is taken under the null hypothesis, since the break-even rate is what the record is being tested against.

z=p^qq(1q)/n,p2-sided=erfc ⁣(z2)z = \dfrac{\hat{p} - q}{\sqrt{q(1-q)/n}}, \qquad p_{\text{2-sided}} = \operatorname{erfc}\!\left(\dfrac{|z|}{\sqrt{2}}\right)

where:

  • p^\hat{p} the observed rate, wins divided by bets settled
  • nn bets settled
Worked example: 55 wins in 100 bets at −110

That is 2.62 points above break-even, on a standard error of 4.99 points.

z=0.55000.52380.049943=0.52    p=0.60z = \frac{0.5500 - 0.5238}{0.049943} = 0.52 \;\Rightarrow\; p = 0.60
A p-value of 0.60 is no evidence of an edge at all. The same 55% rate over 10,000 bets gives z = 5.24: identical performance, completely different amount of evidence. The tail is computed directly rather than as one minus something close to one, so a small p-value keeps its digits.

Implemented as proportion_test and two_sided_p. Calculator: break-even win rate.

The interval on the rate itself

The interval, not the point estimate, is the result. The Wilson score interval is used rather than the textbook normal interval, which runs off the end of the scale exactly where betting records live.

p^+z22n±zp^(1p^)n+z24n21+z2n\dfrac{\hat{p} + \dfrac{z^2}{2n} \pm z\sqrt{\dfrac{\hat{p}(1-\hat{p})}{n} + \dfrac{z^2}{4n^2}}}{1 + \dfrac{z^2}{n}}

where:

  • zz the two-sided critical value: 1.959963985 for 95%
Worked example: the same 55 of 100

The 95% interval runs from 45.2% to 64.4%.

[0.4524,  0.6439]q=0.5238[\,0.4524,\; 0.6439\,] \ni q = 0.5238
Break-even sits inside the interval, which is the whole verdict: a 55% record over 100 bets is entirely consistent with having no edge. One win in twelve bets is the sharper illustration, where the normal interval runs below zero and Wilson does not.

Implemented as wilson_interval. Calculator: break-even win rate.

How many bets an edge needs

The sample size at which a true rate can be told apart from break-even, at a chosen confidence and power. This is usually the number that ends the argument.

n=(zαq(1q)+zβp(1p))2(pq)2n = \dfrac{\left(z_\alpha\sqrt{q(1-q)} + z_\beta\sqrt{p(1-p)}\right)^{2}}{(p - q)^{2}}

where:

  • zαz_\alpha two-sided 95%: 1.959963985
  • zβz_\beta 80% power: 0.841621234
  • pp the true rate you are trying to detect
Worked example: a one-point and a two-point edge over −110

Halving the edge quadruples the sample, because the difference enters squared.

n4,886 at 2 points,n19,564 at 1 pointn \approx 4{,}886 \ \text{at 2 points}, \qquad n \approx 19{,}564 \ \text{at 1 point}
Roughly 2,850 settled bets to confirm a 55% rate at −110, and nearly 20,000 for a one-point edge. Any claim of a proven edge on a few hundred bets is a claim about noise, and this is the arithmetic that says so.

Implemented as required_sample_size. Calculator: break-even win rate.

Why this page can’t drift

These equations also ship as FORMULAS.md inside the Python package, and a test asserts the two stay in step: the six section names here have to match the six in the markdown, and every library function named there has to appear here. Add a formula to the library without documenting it and the test fails.

The mirrored JavaScript implementation the site runs at the edge is checked against the Python by golden-value tests, so a change to either has to reproduce the other’s digits before it ships. Methodology covers what the site does with these formulas once real prices are involved; this page is only the arithmetic.