① The primitive — American → decimal → probability
dec(a) = a/100 + 1 if a > 0 e.g. dec(+144) = 2.44
= 100/(-a) + 1 if a < 0 e.g. dec(-130) = 1.7692
implied_probability(a) = 1 / dec(a)
Every calculation below reduces to this. (No-vig exchanges like Novig price in probability; that's converted to American upstream, so the edge finder only ever sees American odds.)
② Arbitrage — best price each side; profit if implied probs sum < 1
inv = 1/dec(bestA) + 1/dec(bestB)
ARB iff inv < 1 AND bestA.book ≠ bestB.book
profit_pct = (1 - inv) × 100
loading live trace…
③ +EV — de-vig each book quoting both sides → consensus fair → edge vs best price
per book quoting both sides: fair_A(book) = (1/dec A) / (1/dec A + 1/dec B) ← strips the vig
consensus fair_A = mean over all such books (need ≥ 2)
EV_pct = (consensus_fair × dec(best_price) - 1) × 100 ship if ≥ 0.5
loading live trace…
④ Middles — Over X / Under Y with Y>X; any total in the gap wins both
middle_numbers = integers strictly between lo (Over line) and lu (Under line)
cost = 1/dec(over) + 1/dec(under) - 1 cost < 0 ⇒ FREE middle (also an arb)
loading live trace…
⑤ The guardrails — fake edges we permanently refuse
- Signed-line spreads: pair by the signed
(team, line) pair, never abs(line) (mixing +1.5/−1.5 fabricated ~25% arbs).
- Extreme-odds cap: exclude
|american| > 1500 — suspended/resumption leftovers aren't real edges.
- Different books required for any arb/middle; one-sided (yes-only) markets are skipped for EV; only
state=="open" rows enter.