Skip to main content

Odds Generation — game · set + set · set (tennis)

Enter the match's Game Handicap and Game Total in Malay and its Moneyline in decimal — margins still embedded. Tennis scores are not counts: they are a nested race — point → game (win by 2 from deuce) → set (first to 6 by 2, tiebreak at 6-6) → match — so totals come out bimodal (straight sets vs a decider) with a parity comb (a set never totals 11 games; a 7-6 counts 13). The engine (ADR-030):

  1. strips each bookmaker margin (Power method — every book here is two-way; tennis has no draw);
  2. pins the serve sum pA + pB to the tour/surface prior (ATP ≈ 1.29, WTA ≈ 1.14) and bisects the serve difference against the Game Handicap — the match quotes leave the sum on a near-flat ridge, so alone they cannot fit it;
  3. breaks the ridge with the Set-1 Total when the book quotes set 1 (Saba does): more serve ⇒ more holds ⇒ longer sets, so P(set-1 over) rises monotonically with the sum — stage Set 1 Σ bisects the sum against that quote and the prior becomes a fallback (a shape prior upgraded to a per-match reading, ADR-030 O2);
  4. consumes the Game Total with whichever knob can reach it: τ, a match-level form mixture (matches shorten), or extra serve sum (matches lengthen; disabled once set-1 pinned the sum — τ only) — the difference re-solves at every trial;
  5. never fits the Moneyline or the Set-1 Handicap: they are the cross-anchor consistency readouts (Δ ML, Δ S1hcp) — a large value means the book's quotes disagree with each other, a risk signal;
  6. prices both scopes off the one solved distribution — set · set (Moneyline, Set Handicap, Set Total) and game · set (match game lines plus every per-set sheet, conditional on the set being played).
Stage 1 — the nested race: point → game (win by 2 from deuce) → set (first to 6 by 2, tiebreak at 6-6) → match (best of 3); every level is a race, no level is a count
Stage 1 — a race nested three levels deep: point → game (win by 2 from deuce) → set (first to 6 by 2, tiebreak at 6-6) → match — every level a race, no level a count

Each stage re-solves the same fair targets, so the stage switcher is a true before/after — flip iid @ prior / Set 1 Σ / Length and watch the totals hump move while the handicap holds (clear the Set-1 quotes to see the prior-only pipeline). Best-of-3 and best-of-5 are format configs (all four slams play a 10-point decider tiebreak since 2022); switching loads that format's seed quotes.

Game Handicap (Malay)
Game Total (Malay)
Moneyline (Decimal) — consistency readout
Set-1 Total (Malay) — pins Σ per match
Set-1 Handicap (Malay) — consistency readout
Serve-sum prior · margins

/ steps a field, Shift steps bigger; Malay pairs step their partner the opposite way. The Moneyline and the Set-1 handicap are never fitted — they are cross-anchor consistency readouts (Δ ML / Δ S1hcp); clear either to skip it.

The Set-1 total is the ridge breaker: when present it pins the serve sum per match (stage Set 1 Σ) and the prior becomes a fallback — clear it to see the prior-driven pipeline. Valid inputs: Malay in [−1, +1] non-zero with margin, decimals above 1, serve-sum prior in (1.04, 1.54).

p_A 0.6620p_B 0.6225τ 0.0292P(set 3) 41.8%TB 42.2%round-trip Δp 1.0e-7 / 4.7e-6Δ ML 0.03%Δ S1hcp 0.17%
Match distribution
p_A 0.6620p_B 0.6225Σ 1.285 ←S1τ 0.0292TB 42.2%E[games] 24.4
Final sets score — P(home s, away s) ×100
A=0A=1A=2
H=017.5
H=116.9
H=240.724.8
Games margin pmf — P(home games − away games) ×100
-10-9-8-7-6-5-4-3-2-10+1+2+3+4+5+6+7+8+9+10+11
0.10.30.71.93.15.26.76.24.73.53.84.16.59.912.711.48.45.92.81.40.40.1
Games total pmf ×100
131415161718192021222324252627282930313233343536373839
0.10.51.63.05.97.08.27.85.38.26.11.23.44.63.23.94.24.45.04.93.12.32.91.70.30.60.5
two humps — straight sets vs a decider — with a parity comb: no set totals 11 games, a 7-6 counts 13
home awayone distribution, both scopes: the sets table is set·set, the pmfs are game·set
8 in scope
a match always has a winner — no tie leg
OutcomeFairDecPricedMalay
Home65.6%1.5251.492+0.49
Away34.4%2.9042.748-0.57
How these numbers are computed
1 · Strip the bookmaker margins (Power method — every book here is two-way)
Game Handicap -2.50 → P(home covers)
HomeAway
Malay quote+0.82-0.95
Decimal dd1.82002.0526
Implied q=1/dq = 1/d0.54950.4872
Fair p=q1/xp = q^{1/x}0.53170.4683
Fair decimal 1/p1/p1.88082.1353
overround Q = 1.0366 → solve q11/x+q21/x=1q_1^{1/x} + q_2^{1/x} = 1 → x = 0.9480fair P(home covers) = 53.17%
Game Total 22.50 → P(over)
OverUnder
Malay quote+0.85-0.98
Decimal dd1.85002.0204
Implied q=1/dq = 1/d0.54050.4949
Fair p=q1/xp = q^{1/x}0.52320.4768
Fair decimal 1/p1/p1.91142.0972
overround Q = 1.0355 → solve q11/x+q21/x=1q_1^{1/x} + q_2^{1/x} = 1 → x = 0.9496fair P(over) = 52.32%
Set-1 Total — stripped as the SERVE-SUM anchor (the ridge breaker)
OverUnder
Malay quote+0.71-0.83
Decimal dd1.71002.2048
Implied q=1/dq = 1/d0.58480.4536
Fair p=q1/xp = q^{1/x}0.56680.4332
Fair decimal 1/p1/p1.76422.3086
overround Q = 1.0383 → solve q11/x+q21/x=1q_1^{1/x} + q_2^{1/x} = 1 → x = 0.9450fair P(set-1 over) = 56.68%
Moneyline — stripped for the CONSISTENCY READOUT, never fitted
HomeAway
Decimal quote1.502.79
Decimal dd1.50002.7900
Implied q=1/dq = 1/d0.66670.3584
Fair p=q1/xp = q^{1/x}0.65600.3440
Fair decimal 1/p1/p1.52452.9067
overround Q = 1.0251 → solve q11/x+q21/x=1q_1^{1/x} + q_2^{1/x} = 1 → x = 0.9616fair P(home ML) = 65.60%

Standalone strips: Margin — two-way (Power).

2 · The nested race — point → game → set → match

Tennis games are not counts: every level is a race with absorbing barriers. A server holding with point probability pp wins the game with the closed form

Phold(p)=p4 ⁣(1+4q+10q2)+20p3q3p212pqq=1pP_{\text{hold}}(p) = p^4\!\left(1 + 4q + 10q^2\right) + 20p^3q^3\,\frac{p^2}{1-2pq} \qquad q = 1-p

(deuce is a geometric race; this run: hold(A) = 0.849, hold(B) = 0.781). A tiny DP walks the tiebreak over the real serve rotation (F, S, S, F, F, …; the 6-6 deuce closes as α/(α+β)\alpha/(\alpha+\beta)), the set lattice alternates servers by game — a set totals {6..10, 12, 13} games, never 11, and a 7-6 counts 13 — and the match folds sets carrying the games margin and total pmfs, the sets joint and every per-set grid. The pre-match serve coin toss is averaged. Everything is exact DP; the engine was validated against a 200k-run Monte Carlo.

3 · The ridge — the sum is a prior until a Set-1 quote reads it per match

The handicap pins the serve difference, but (HDP, OU, ML) leave the serve sum and the form shock τ on a near-flat ridge: a weak-serve iid fit can match all three quotes yet misprice every tiebreak-sensitive tail. Without more quotes the sum comes from the tour/surface prior (1.29 here; ATP ≈ 1.29, WTA ≈ 1.14). With a Set-1 total quote (Saba quotes Set 1), stage Set 1 Σ bisects the sum against it — more serve ⇒ more holds ⇒ longer sets, so P(set-1 over) rises monotonically with Σ — and the prior becomes a fallback (ADR-030 O2: a shape prior upgraded to a per-match reading). The match totals anchor is then consumed by τ\tau — a 3-node mixture (pA+zτ,  pBzτ), z{3,0,+3}(p_A + z\tau,\; p_B - z\tau),\ z \in \{-\sqrt3, 0, +\sqrt3\} that preserves the sum but compounds over sets — or, only when no Set-1 quote pins Σ, by extra sum when the market runs longer than the iid baseline.

StageΣ = p_A + p_BΣ srcp_Ap_BτknobΔ coverΔ totalΔ S1totΔ ML (readout)
iid @ prior1.2900prior0.66420.62580.00001.4e-76.4e-23.3e-22.75%
Set 1 Σ1.2469S10.64100.60590.00002.6e-74.7e-27.2e-71.58%
Length (τ)1.2845S10.66200.62250.0292tau1.0e-74.7e-62.1e-30.03%

The ML — and the Set-1 handicap when quoted — are deliberately not fitting targets: with the sum right they land on their own (Δ ≈ 0 on the seed quotes); a large readout means the book's quotes disagree with each other — a risk signal, not a solver failure.

4 · Periods — sets are random, so per-set prices are conditional

Unlike basketball quarters, set 3 exists only with probability 41.8% here (set 3 with 41.8%). Per-set markets are void if the set is not played, so their fair prices condition on it — and under the τ mixture the conditioning re-weights the form nodes (deciders come disproportionately from the close-form nodes). Set 1 is unconditional. The same fold also yields the set·set scope for free: the sets joint prices the ML, set handicap and set totals with zero extra parameters.

5 · Read “Moneyline” · margins · notes

Full match: P(home wins the set race) off the sets joint — no tie leg. Per set: the set winner, conditional on the set being played (void otherwise). Fair groups are re-margined exactly as in goal-regular (Power ladder two-way, Shin multi-way).

targets  tH = powerStrip(HDP pair)   tO = powerStrip(OU pair)   tS1 = powerStrip(Set-1 OU pair)?
         [ML and Set-1 HDP stripped → readouts only]

stage iid    : sum = PRIOR(tour/surface)       bisect diff  until P(A covers | dist) = tH
stage set1   : (with tS1)  bisect sum          until P(set-1 over | dist) = tS1   — ridge broken
stage length : with tS1  : bisect τ ∈ [0, .06] only (extra sum would contradict the S1 reading)
               without   : model over > tO ? bisect τ (form mixture — matches shorten)
                                           : bisect sum upward (more serve — matches lengthen)
               — the difference re-solves inside every trial (same-targets discipline)

dist: hold(p) closed form → tiebreak DP (serve rotation) → set lattice (alternating serve;
      totals ∈ {6..10,12,13}, 7-6 = 13 games) → match fold over (sets, first server)
scopes: ONE dist prices set·set (ML, set HDP/OU) and game·set (match + per-set, conditional)

Engine + invariants: docs/src/lib/odds/tennis.ts, __tests__/tennis.test.ts; decision record ADR-030 (extends ADR-029).