Twenty-two equations. Every one of them is what the calculators on this site actually run, with the symbols named, the units stated, and a worked number underneath.
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.
ML — American moneyline
An integer with ∣ML∣≥100. Negative is the favorite (risk ∣ML∣ to win $100); positive is the underdog (risk $100 to win ML). Unitless.
q — implied probability
What a posted price implies, including the house margin. A number in (0,1). The two sides of a real market sum above 1.
p — fair probability
The de-vigged estimate: what is left after the margin is stripped out. In (0,1), and the two sides sum to exactly 1.
d — decimal odds
Total return per $1 staked, stake included. Dollars per dollar, d>1.
b — net odds
b=d−1: profit per $1 staked, stake excluded. Dollars per dollar, b>0.
Subscripts a and b index the two sides of a two-outcome market. Kalshi sections add C (contracts, an integer count) and P (contract price in dollars, 0<P<1).
Implied probability from an American moneyline
The probability a posted price implies, house margin included.
q=100−ML−ML(ML<0),q=100+ML100(ML>0)
where:
ML — the American moneyline, unitless, ∣ML∣≥100.
q — implied probability, a fraction in (0,1). It is not a fair probability: the margin is still in it.
Worked example — the market −152 / +138
qa=100+152152=252152=0.6032⇒60.32%
qb=100+138100=238100=0.4202⇒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.
Profit per dollar risked, which is what every expected-value and Kelly formula below consumes.
b=ML−100(ML<0),b=100ML(ML>0),d=1+b
where:
b — net odds, in dollars of profit per $1 staked.
d — decimal odds, in dollars returned per $1 staked, stake included.
Worked example — −152 and +138
b(−152)=152100=0.6579⇒d=1.6579
b(+138)=100138=1.3800⇒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=p1
where:
p — fair probability, a fraction in (0,1).
d — fair decimal odds, dollars returned per dollar staked.
Worked example — the fair price behind −152
pa=0.589416⇒d=0.5894161=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=1−p−100p(p≥0.5),ML=p100(1−p)(p<0.5)
where:
p — fair probability in (0,1).
ML — the fair moneyline, unitless. Negative at or above 50%, positive below.
Worked example — both sides of −152 / +138
pa=0.589416⇒MLa=0.410584−100×0.589416=−143.56
pb=0.410584⇒MLb=0.410584100×0.589416=+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.
How far the two posted sides sum above 100%. It is the margin the house has priced in.
overround=qa+qb−1
where:
qa,qb — the two implied probabilities, each a fraction in (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.420168−1=0.023343⇒2.33%
hold=1.0233430.023343=0.02281⇒2.28% 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=qa+qbqi
where:
qi — side i’s implied probability, a fraction.
pi — side i’s fair probability, a fraction. The two pi sum to exactly 1.
Worked example — −152 / +138
pa=1.0233430.603175=0.589416⇒58.94%
pb=1.0233430.420168=0.410584⇒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.
Raises both implied probabilities to a common exponent chosen so they sum to one, which takes proportionally more away from the longshot.
find k≥1 with qak+qbk=1,pi=qik
where:
k — the fitted exponent, unitless and ≥1. Solved numerically by bisection; k=1 means no margin to remove.
qi,pi — implied and fair probabilities as above.
Worked example — −152 / +138
k=1.035312⇒0.6031751.035312+0.4201681.035312=1
pa=0.592502⇒59.25%,pb=0.407498⇒40.75%
Against proportional, the favorite gains 0.31 points and the longshot loses 0.31. Because q<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=2(1−z)z2+4(1−z)qi2/s−z,s=qa+qb
where:
z — the estimated fraction of stake coming from insiders, a number in [0,1). Solved by bisection so the two pi sum to 1.
s — the booksum qa+qb, unitless and above 1 for any real market.
qi,pi — implied and fair probabilities as above.
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=p⋅b−(1−p)=p(b+1)−1
where:
p — 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.
b — net odds of the price being tested, dollars of profit per dollar staked.
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-vig⇒pb=0.434435,+145⇒b=1.45
EV=0.434435×1.45−0.565565=+0.06437⇒+6.44% 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.
The share of a bankroll that maximizes its long-run growth rate at a given edge and price.
f∗=p−b1−p=bbp−q,q=1−p
where:
p — win probability, a fraction. Yours, not the book’s.
b — net odds, dollars of profit per dollar staked.
q — in this formula only, the losing probability 1−p. Everywhere else on this page q is a price’s implied probability. The two coincide only when the price is exactly fair.
f∗ — fraction of bankroll, unitless. Negative means no edge.
Worked example — 65% at −152
b=0.657895,f∗=0.65−0.6578950.35=0.65−0.532=0.118
11.8% of bankroll at full Kelly. That is the growth-maximizing stake if 65% is exactly right — and a probability estimate never is, which is what the next formula is for.
The compounding rate per bet at a chosen stake fraction — the curve Kelly sits at the top of.
g(f)=pln(1+bf)+(1−p)ln(1−f)
where:
f — the stake as a fraction of bankroll, in [0,1).
p,b — win probability and net odds as above.
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% / bet
g(0.059)=+0.003469⇒+0.347% / 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.
fi — the fraction of bankroll on bet i, unitless.
ω — one of the 2n win/loss outcomes across n bets; P(ω) is its probability.
Xi — the payoff per dollar on bet i: +bi on a win, −1 on a loss.
Worked example — two bets at once
Bet 1: 65% at −152 (b=0.6579). Bet 2: 50% at +120 (b=1.20). Independent.
naive, bet-by-bet: 11.80%+8.33%=20.13% of bankroll
joint: 11.70%+8.26%=19.96%
at λ=0.5:$58.50+$41.28=$99.78 on a $1,000 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.
One number that says whether the best price on each side, taken together, sells the whole market for less than a dollar.
S=da1+db1,an arb exists⟺S<1
where:
da,db — the best available decimal odds on each side, possibly from different books.
S — the inverse-odds sum, unitless. It is the cost, in dollars, of buying $1 of guaranteed payout.
Worked example — +110 at one book, +115 at another
da=2.10,db=2.15
S=2.101+2.151=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.
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.
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.
The same shape at roughly a quarter of the rate, charged when a resting order is filled rather than taken.
feemaker=⌈0.0175⋅C⋅P⋅(1−P)⌉cent
where:
C,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.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 — on a sub-5¢ contract that 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.
ptrue≥P+rate⋅P⋅(1−P)
where:
P — contract price in dollars.
rate — 0.07 taker, 0.0175 maker, unitless.
ptrue — 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.05:0.05+0.07×0.05×0.95=0.053325⇒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.
The same fee expressed against the money actually put up, which is where the tail contracts look very different.
C⋅Pfee=rate⋅(1−P)
where:
C⋅P — the outlay in dollars: contracts times price.
The result is a fraction of stake, and C 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 stake
P=0.05:0.07×0.95=0.0665⇒6.65% 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
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
entry $1.75+settlement $0.00=$1.75 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.
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.