Skip to main content

Odds Generation — soccer · goal · regular

Enter a period's Handicap and Total in Malay and its 1X2 in decimal — margins included. The engine:

  1. strips the margins (Power for the two-way pairs, Shin for the 1X2) to fair probabilities;
  2. back-solves the goal rates (λₕ, λₐ) by nested bisection — Total fixes how many goals, Handicap fixes who scores them;
  3. refines the score grid in stages — Poisson baseline, Dixon-Coles ρ, optional φ draw lift;
  4. prices every market off the last stage.
Stage 1 — Poisson marginals form the joint score grid
Stage 1 — (λₕ, λₐ) outer-product into the joint score grid

Flip Poisson / Dixon-Coles / φ on the grid to see what ρ and φ move.

Each period — full match, 1st half, 2nd half — is its own inversion. Timing and cross-half markets (HT/FT, First Goal, …) are out of scope; see the Markets reference.

Primary Quotes
Handicap (Malay)
Total (Malay)
Dixon-Coles
1X2 quote (Decimal) optional ·

/ steps a field, Shift steps bigger; on a Malay pair the partner moves the opposite way. Handicap/Total ladders use your line ±0.25; team-total, 3-way and which-team lines are illustrative — probabilities are exact given λ.

Valid inputs: Malay in [−1, +1] and never 0, 1X2 decimals above 1, and each book must carry margin (implied probabilities summing over 1).

λₕ 1.7339λₐ 1.0174λtotal 2.7512φ 0.2042round-trip Δp 1.7e-9 / 2.1e-8 / 2.0e-10draw 0.27060.2995grid N=5 · Poisson → Dixon-Coles → 1X2 φ
Score grid — P(home = h, away = a) ×100
Poisson
λₕ 1.6378λₐ 1.0670draw 0.2459
A=0A=1A=2A=3A=4A=5
H=06.697.143.811.350.360.08
H=110.9511.696.242.220.590.13
H=28.979.575.111.820.480.10
H=34.905.232.790.990.260.06
H=42.012.141.140.410.110.02
H=50.660.700.370.130.040.01
home Σ 0.5000 draw Σ 0.2459 away Σ 0.2465
Dixon-Coles
λₕ 1.6469λₐ 1.0427draw 0.2706
A=0A=1A=2A=3A=4A=5
H=08.025.963.721.290.340.07
H=110.0912.936.132.130.560.12
H=29.289.685.041.750.460.10
H=35.095.312.770.960.250.05
H=42.102.191.140.400.100.02
H=50.690.720.380.130.030.01
home Σ 0.5000 draw Σ 0.2706 away Σ 0.2294
1X2 φ
λₕ 1.7339λₐ 1.0174φ 0.2042draw 0.2995
A=0A=1A=2A=3A=4A=5
H=08.675.153.171.070.270.06
H=19.5314.305.491.860.470.10
H=29.209.365.731.610.410.08
H=35.325.412.751.120.240.05
H=42.302.341.190.400.120.02
H=50.800.810.410.140.040.01
home Σ 0.5000 draw Σ 0.2995 away Σ 0.2005
shade ∝ probability · each stage re-solves (λₕ, λₐ) against the same fair targets
21 in scope
1-01019
2-01130
2-11017
3-01883
3-11850
3-23457
4-041270
4-140172
4-276194
4-3196301
0-0
11
1-1
6.8
2-2
17
3-3
80
4-4
482
AOS
37
How these numbers are computed
1 · Strip the bookmaker margins — Power (two-way) · Shin (three-way)

A two-way Malay price converts to decimal (d=1+md = 1 + m if m>0m > 0, else d=11/md = 1 - 1/m), which implies a probability q=1/dq = 1/d; the two sides sum to an overround Q>1Q > 1. The Power method finds the exponent xx that deflates them to a fair pair pi=qi1/xp_i = q_i^{1/x}, and the stripped (margin-free) decimal odds are the reciprocals 1/pi1/p_i. The three-way 1X2 needs a different deflation — Shin (the formula is in step 5) — but lands in the same table shape. The fair numbers are the constraints the solver must reproduce.

Handicap -0.50 → P(home covers -0.50)
HomeAway
Malay quote+0.96+0.96
Decimal dd1.96001.9600
Implied q=1/dq = 1/d0.51020.5102
Fair p=q1/xp = q^{1/x}0.50000.5000
Fair decimal 1/p1/p2.00002.0000
overround Q = 1.0204 → solve q11/x+q21/x=1q_1^{1/x} + q_2^{1/x} = 1 → x = 0.9709 fair P(home covers) = 0.5000
Total 2.50 → P(over 2.50)
OverUnder
Malay quote+0.95+0.95
Decimal dd1.95001.9500
Implied q=1/dq = 1/d0.51280.5128
Fair p=q1/xp = q^{1/x}0.50000.5000
Fair decimal 1/p1/p2.00002.0000
overround Q = 1.0256 → solve q11/x+q21/x=1q_1^{1/x} + q_2^{1/x} = 1 → x = 0.9635 fair P(over) = 0.5000
1X2 (Decimal) → P(home win), P(draw), P(away win) — Shin
HomeDrawAway
Decimal quote dd1.89003.13004.7000
Implied q=1/dq = 1/d0.52910.31950.2128
Fair pp (Shin)0.50600.29950.1945
Fair decimal 1/p1/p1.97623.33895.1420
overround Q = 1.0614 → bisect Shin’s insider fraction z until pi=1\textstyle\sum p_i = 1 (step 5) → z = 0.0308 → fair draw = 0.2995, the φ target

Try the strips standalone — Margin — two-way (Power) · Margin — multi-way (Shin): the same math on any quotes, with the bisection narrated.

2 · Size — recover λ_total from the Total

Step 1 left three fair targets, and the model has matching knobs — the scoring rates λh,λa\lambda_h, \lambda_a plus the diagonal lift φ (step 5). Model each side’s goals as Poisson — P(k;λ)=eλλk/k!P(k;\lambda) = e^{-\lambda}\lambda^{k}/k! — and independent. Independent Poissons add — X+YPoisson(λh+λa)X + Y \sim \mathrm{Poisson}(\lambda_h + \lambda_a) — so the match total depends only on λtotal=λh+λa\lambda_{\text{total}} = \lambda_h + \lambda_a: the Total quote pins the match size on its own, before caring who scores (step 3’s job). Every line class settles by the same rule (the line rules below): take the win mass WW and push mass RR of that one total — point masses P(total=t)=eλλt/t!P(\text{total} = t) = e^{-\lambda}\lambda^{t}/t! — and the fair over-probability is W/(1R)W/(1-R). That makes size a one-dimensional root-find, laid out below in the order a solver runs it — target, search, then the evaluation every iteration repeats:

target (step 1): pover  =  fair P(over 2.50)  =  0.50000000p^{\ast}_{\text{over}} \;=\; \text{fair } P(\text{over } 2.50) \;=\; 0.50000000
search: bisect λtotal[0.02,8]   until   W/(1R)=pover    λtotal=2.704832\text{bisect } \lambda_{\text{total}} \in [0.02,\, 8] \;\text{ until }\; W/(1-R) = p^{\ast}_{\text{over}} \;\Rightarrow\; \lambda_{\text{total}} = 2.704832
Cross-check in the Bisection Calculator: paste Ptail(2.50, x) = 0.50000000 (tolerance 1e-8; the target needs its full precision — dλ/dP4d\lambda/dP \approx 4 here). Its search lands on λtotal=2.674060\lambda_{\text{total}} = 2.674060 — close to, but not the 2.7048322.704832 above: Δ=3.1×102\Delta = 3.1 \times 10^{-2}. The calculator inverts the closed-form total X+YPoisson(λtotal)X + Y \sim \text{Poisson}(\lambda_{\text{total}}), while this stage inverts the score grid truncated at N = 5 (no renormalization), which clips the upper tail. That gap is a model difference, not rounding — the 6-dp λtotal\lambda_{\text{total}} above is what a faithful N = 5 re-implementation reproduces; the two agree only where the truncated tail is negligible.

Each trial λ is scored the same way — the settlement rule evaluated under Poisson(λ). These are the figures a re-implementation should reproduce at the converged λ=λtotal=2.704832\lambda = \lambda_{\text{total}} = 2.704832: first each component line’s Poisson masses, then the weighted WW and RR, then the fair check against the target:

P(total>2.50)  =  1t=02eλλtt!  =  0.5000P(total=2.50)  =  0    (totals are integers)P(\text{total} > 2.50) \;=\; 1 - \textstyle\sum_{t=0}^{2} \tfrac{e^{-\lambda}\lambda^{t}}{t!} \;=\; 0.5000 \qquad P(\text{total} = 2.50) \;=\; 0 \;\; \text{(totals are integers)}
W=P(total>2.50)=0.5000W = P(\text{total} > 2.50) = 0.5000
R=P(total=2.50)=0.0000R = P(\text{total} = 2.50) = 0.0000
fair P(over 2.50)  =  W1R  =  0.500010.0000  =  0.5000  =  pover    \text{fair } P(\text{over } 2.50) \;=\; \frac{W}{1-R} \;=\; \frac{0.5000}{1 - 0.0000} \;=\; 0.5000 \;=\; p^{\ast}_{\text{over}} \;\; \checkmark
    λtotal=2.704832\Longrightarrow\;\; \lambda_{\text{total}} = 2.704832

(Additivity is exact only for the plain independent-Poisson grid, so this λ is the Poisson stage’s; the τ and φ adjustments of the later stages perturb it, so each re-solves size and split jointly against the same targets — all the recovered λ’s land in the per-stage tables (steps 4–5).)

Line rules — over wins ⟺ h+a>Th + a > T; an exact hit (h+a=Th + a = T) is a push: the stake refunds, so a two-way fair probability renormalizes it away, fair=W/(1R)\text{fair} = W/(1-R) (win mass over non-push mass). A .5 line cannot push, so R=0R = 0 and the formula degenerates to fair=W\text{fair} = W — same rule, not a shortcut method; a quarter line (±0.25, ±0.75, …) puts half the stake on each neighbouring line, so WW and RR are the ½-weighted sums over the two components. The same settlement applies to the Handicap (step 3) and the priced ladders (step 6).

3 · Split — recover λₕ and λₐ from the Handicap

The Handicap decides who scores them — and settling it needs the full scoreline distribution, the score grid: independence makes each cell (h,a)(h, a) a plain product of the two Poisson masses,

J[h][a]  =  P(home=h;λh)P(away=a;λa)h,a=05J[h][a] \;=\; P(\text{home} = h;\, \lambda_h) \cdot P(\text{away} = a;\, \lambda_a) \qquad h, a = 0 \ldots 5

— exactly the grid the score-grid panel’s Poisson stage displays. Hold λtotal\lambda_{\text{total}} fixed and slide the home share λh\lambda_h (with λa=λtotalλh\lambda_a = \lambda_{\text{total}} - \lambda_h). Home covers ⟺ h+L>ah + L > a, an exact h+L=ah + L = a is a push — step 2’s one rule again, with the masses now read off the grid: W=h+L>aJ[h][a]W = \textstyle\sum_{h + L > a} J[h][a] and R=h+L=aJ[h][a]R = \textstyle\sum_{h + L = a} J[h][a] (½-weighted across a quarter line’s two components), fair cover probability W/(1R)W/(1-R) — which rises with λh\lambda_h, so the same solver shape applies:

target (step 1): pcover  =  fair P(home covers 0.50)  =  0.50000000p^{\ast}_{\text{cover}} \;=\; \text{fair } P(\text{home covers } -0.50) \;=\; 0.50000000
search: bisect λh(0,λtotal)   until   W/(1R)=pcover    λh=1.637850,    λa=λtotalλh=1.066982\text{bisect } \lambda_h \in (0,\, \lambda_{\text{total}}) \;\text{ until }\; W/(1-R) = p^{\ast}_{\text{cover}} \;\Rightarrow\; \lambda_h = 1.637850,\;\; \lambda_a = \lambda_{\text{total}} - \lambda_h = 1.066982
Cross-check in the Bisection Calculator — and a closer look at what P(home covers 0.50)P(\text{home covers } -0.50) actually sums. Step 2's Total was a sum of the two goal counts (one rate, one Ptail); the Handicap turns on their difference — the goal margin XYX - Y (home goals minus away goals). A margin depends on both rates at once — its distribution is a Skellam, the difference of two Poissons — so no single Ptail in λtotal\lambda_{\text{total}} can express it. The trick is to condition on the away score aa: once aa is pinned, only the home goals still vary, and the cover collapses to one plain home tail (Ptail(k;λ)=P(Xk)\mathrm{Ptail}(k;\, \lambda) = P(X \ge k)). Home covers     ha+1\iff h \ge a + 1 (a half-line cannot push), so each away score contributes its Poisson mass times that tail:
P(home covers 0.50)  =  a0P(away=a;λa)Ptail(a+1;λh)P(\text{home covers } -0.50) \;=\; \sum_{a \ge 0} P(\text{away} = a;\, \lambda_a)\,\mathrm{Ptail}(a + 1;\, \lambda_h)
-5-4-3-2-10+1+2+3+4+5+6goal margin m = home − away
The goal margin m=ham = h - a — a Skellam, the difference of two Poissons. Shaded by how the 0.50-0.50 line settles: home covers (m+1m \ge +1), away.
Now substitute the search variable x=λhx = \lambda_h (with λa=λtotalx\lambda_a = \lambda_{\text{total}} - x, and λtotal=2.704832\lambda_{\text{total}} = 2.704832 held fixed from step 2) so the whole cover is one function of xx:
W  =  a0P(a;λtotalx)Ptail(a+1;x)W \;=\; \sum_{a \ge 0} P(a;\, \lambda_{\text{total}} - x)\,\mathrm{Ptail}(a + 1;\, x)
fair cover  =  W(no push, so R=0)\text{fair cover} \;=\; W \quad (\text{no push, so } R = 0)
Truncate the away sum at N = 5 and paste this equation — one line per away score aa, interval [0,λtotal][0,\, \lambda_{\text{total}}], tolerance 1e-8:
  P(0, 2.704832-x)*Ptail(1, x)
+ P(1, 2.704832-x)*Ptail(2, x)
+ P(2, 2.704832-x)*Ptail(3, x)
+ P(3, 2.704832-x)*Ptail(4, x)
+ P(4, 2.704832-x)*Ptail(5, x)
+ P(5, 2.704832-x)*Ptail(6, x)
= 0.50000000
Its search lands on λh=1.623928\lambda_h = 1.623928; at that xx the 6 terms evaluate and add straight up to the target (λa=λtotalλh=1.080904\lambda_a = \lambda_{\text{total}} - \lambda_h = 1.080904):
0.2724+0.1770+0.0442+0.0059+0.0005+0.0000  =  0.5000  =  pcover    0.2724 + 0.1770 + 0.0442 + 0.0059 + 0.0005 + 0.0000 \;=\; 0.5000 \;=\; p^{\ast}_{\text{cover}} \;\; \checkmark
That λh\lambda_h is close to, but not exactly, the 1.6378501.637850 from the grid solve above — a gap of Δ=1.4×102\Delta = 1.4 \times 10^{-2}. It is the same effect as the Total's: the calculator uses the full distribution (goals can run past 5 a side), while this page's grid stops at 5 and quietly drops the sliver of probability beyond it — the faded tail in the figure below. Dropping it leaves a hair less mass on the home side, so the grid nudges λh\lambda_h up a touch to land on the same target; that nudge is Δ\Delta. Where the dropped tail is negligible, the two agree.
0123456789goals, one side
One side's goal count (Poisson). The grid keeps 0–5 and drops the faded tail past the dashed cap — here just 0.67% of the mass. That sliver is the whole source of Δ\Delta.

At the converged split the grid masses and the fair check are:

W=P(h0.50>a)=0.5000W = P(h - 0.50 > a) = 0.5000
R=P(h0.50=a)=0.0000R = P(h - 0.50 = a) = 0.0000
fair P(home covers 0.50)  =  W1R  =  0.500010.0000  =  0.5000  =  pcover    \text{fair } P(\text{home covers } -0.50) \;=\; \frac{W}{1-R} \;=\; \frac{0.5000}{1 - 0.0000} \;=\; 0.5000 \;=\; p^{\ast}_{\text{cover}} \;\; \checkmark
    λh=1.637850λa=1.066982\Longrightarrow\;\; \lambda_h = 1.637850 \qquad \lambda_a = 1.066982

The recovered pair (λh,λa)(\lambda_h,\, \lambda_a) is the Poisson stage’s chips in the grid panel — and with it both quotes are reproduced exactly. That closes the fit, but not the model: the two quotes pinned just two numbers, size and split, while step 6 prices whole ladders off the grid’s shape — and that shape so far rests entirely on the independence assumption. The next steps correct the shape where independence is known to fail, then re-solve so the quotes still hold: Dixon-Coles’ low-score τ (step 4), then the 1X2 draw lift φ (step 5).

4 · Dixon-Coles — re-solve with the low-score tilt τ

Steps 2–3 hit both targets exactly — so what is left? Infinitely many grids satisfy those same two constraints; the independent product is merely the simplest of them, and it is empirically wrong in one known corner: real matches produce slightly more 0-0 and 1-1, and fewer 1-0/0-1, than independence predicts (the Dixon-Coles finding). The fix multiplies exactly those four cells by a tilt τ driven by a correlation knob ρ. Note ρ is not recovered from your quotes — steps 2–3 already spent both of them — it is a modelling input, the ρ field in the Dixon-Coles section above (league-calibrated in practice). Negative ρ lifts 0-0/1-1 and trims 1-0/0-1; positive ρ the reverse; τ = 1 leaves everything else alone:

J[h][a]    J[h][a]τ(h,a)τ=1  everywhere except the four low-score cellsJ[h][a] \;\mapsto\; J[h][a] \cdot \tau(h,a) \qquad \tau = 1 \;\text{everywhere except the four low-score cells}
with ρ = -0.10 at the re-solved pair (λₕ, λₐ) = (1.6469, 1.0427) from below:
τ(0,0)  =  1λhλaρ  =  11.6469×1.0427×(0.10)  =  1.1717\tau(0,0) \;=\; 1 - \lambda_h \cdot \lambda_a \cdot \rho \;=\; 1 - 1.6469 \times 1.0427 \times (-0.10) \;=\; 1.1717
τ(0,1)  =  1+λhρ  =  1+1.6469×(0.10)  =  0.8353\tau(0,1) \;=\; 1 + \lambda_h \cdot \rho \;=\; 1 + 1.6469 \times (-0.10) \;=\; 0.8353
τ(1,0)  =  1+λaρ  =  1+1.0427×(0.10)  =  0.8957\tau(1,0) \;=\; 1 + \lambda_a \cdot \rho \;=\; 1 + 1.0427 \times (-0.10) \;=\; 0.8957
τ(1,1)  =  1ρ  =  1(0.10)  =  1.1000\tau(1,1) \;=\; 1 - \rho \;=\; 1 - (-0.10) \;=\; 1.1000

The tilted grid is renormalized to J=1\textstyle\sum J = 1 (ρ is valid only while every τ stays positive). That reshaping breaks the step 2–3 fit — the same λ pair now prices differently, because WW and RR are sums over a grid whose mass just moved. Nothing else changes: the targets stay step 1’s, the settlement rule stays W/(1R)W/(1-R), and the same two nested bisections simply run again with the τ-tilted grid underneath. In the same solver order as steps 2–3:

targets (step 1, unchanged): pover=0.5000pcover=0.5000p^{\ast}_{\text{over}} = 0.5000 \qquad p^{\ast}_{\text{cover}} = 0.5000
old pair on the τ-grid: (λh,λa)=(1.6378,1.0670):fair P(over)=0.5038fair P(cover)=0.4920both off target(\lambda_h,\, \lambda_a) = (1.6378,\, 1.0670): \quad \text{fair } P(\text{over}) = 0.5038 \qquad \text{fair } P(\text{cover}) = 0.4920 \qquad \text{both off target}
search: bisect λtotal[0.02,8] and λh(0,λtotal) exactly as in steps 2–3, W and R now summed off the τ-grid\text{bisect } \lambda_{\text{total}} \in [0.02,\, 8] \text{ and } \lambda_h \in (0,\, \lambda_{\text{total}}) \text{ exactly as in steps 2–3, } W \text{ and } R \text{ now summed off the } \tau\text{-grid}
check (new pair, τ-grid): at (λh,λa)=(1.6469,1.0427) ⁣:fair P(over 2.50)  =  Wτ1Rτ  =  0.500010.0000  =  0.5000  =  pover    \text{at } (\lambda_h,\, \lambda_a) = (1.6469,\, 1.0427)\!: \quad \text{fair } P(\text{over } 2.50) \;=\; \frac{W_{\tau}}{1-R_{\tau}} \;=\; \frac{0.5000}{1 - 0.0000} \;=\; 0.5000 \;=\; p^{\ast}_{\text{over}} \;\; \checkmark
fair P(home covers 0.50)  =  Wτ1Rτ  =  0.500010.0000  =  0.5000  =  pcover    \text{fair } P(\text{home covers } -0.50) \;=\; \frac{W_{\tau}}{1-R_{\tau}} \;=\; \frac{0.5000}{1 - 0.0000} \;=\; 0.5000 \;=\; p^{\ast}_{\text{cover}} \;\; \checkmark
    (λh,λa):  (1.6378,1.0670)    τ,  ρ=0.10    (1.6469,1.0427)λtotal:  2.70482.6896\Longrightarrow\;\; (\lambda_h,\, \lambda_a): \; (1.6378,\, 1.0670) \;\xrightarrow{\;\tau,\;\rho \,=\, -0.10\;}\; (1.6469,\, 1.0427) \qquad \lambda_{\text{total}}: \; 2.7048 \to 2.6896

Step 3 ended on fair P(home covers 0.50)=0.5000\text{fair } P(\text{home covers } -0.50) = 0.5000 with λh=1.6378\lambda_h = 1.6378; step 4 ends on the same 0.5000 with λh=1.6469\lambda_h = 1.6469. That is by construction, not coincidence: 0.5000 is the target — step 1’s pcoverp^{\ast}_{\text{cover}} — and a bisection only stops when it lands there, so every ✓ line prints the same number no matter which grid sits underneath. The fair value is a function of two inputs, the grid and the λ pair; the λ’s differ precisely because the grid differs. Evaluate both pairs on both grids and the compensation becomes visible:

fair P(home covers -0.50)product grid (step 3)τ-grid, ρ = -0.10 (step 4)
step-3 pair (1.6378, 1.0670)0.50000.4920
step-4 pair (1.6469, 1.0427)0.50780.5000

Read it by row — same pair, swap the grid — and the tilt shows: at the step-3 pair, τ alone drags the cover value 0.50000.4920. Read it by column — same grid, swap the pair — and the repair shows: on the τ-grid, moving to the step-4 pair brings it back to 0.5000. Each grid has exactly one ✓ cell; tilting the grid moved the solution point, and finding its new location is all the step-4 bisection does. ρ itself never enters the settlement rule — it acts one layer down, inside the cells that WW and RR sum over: step 3’s WW is summed off the product grid, step 4’s WτW_{\tau} off the τ-tilted grid (the subscript names the grid the sum runs over — it is not a power). For example the 1-0 cell (a τ cell) goes J[1][0]:0.10950.1009(τ(1,0)=1+λaρ=0.8957)J[1][0]: 0.1095 \to 0.1009 \quad (\tau(1,0) = 1 + \lambda_a \rho = 0.8957) while the re-split of λₕ vs λₐ moves the untouched cells by exactly enough that the aggregate lands back on the targets. The side-by-side grids at the end of this step show that recomposition cell by cell.

Unroll the search — every bisection iteration

Outer loop — size. Each row takes the bracket midpoint as a trial λtotal\lambda_{\text{total}}, runs the full inner bisection (second table) to find the λₕ that restores the cover target on that trial’s τ-grid, then compares the resulting fair P(over)P(\text{over}) with pover=0.5000p^{\ast}_{\text{over}} = 0.5000 to decide which half of the bracket survives:

klohitrial λ_totalinner λₕfair P(over)move
10.0200008.0000004.0100002.3140640.75390658
20.0200004.0100002.0150001.3140160.32573724
32.0150004.0100003.0125001.8079820.57445562
42.0150003.0125002.5137501.5596430.45654525
52.5137503.0125002.7631251.6834770.51759954
62.5137502.7631252.6384371.6214780.48755270
72.6384372.7631252.7007811.6524570.50270268
82.6384372.7007812.6696091.6369620.49515858
92.6696092.7007812.6851951.6447080.49893845
102.6851952.7007812.6929881.6485820.50082253
112.6851952.6929882.6890921.6466450.49988098
122.6890922.6929882.6910401.6476140.50035188
132.6890922.6910402.6900661.6471300.50011646
142.6890922.6900662.6895791.6468880.49999873
152.6895792.6900662.6898221.6470090.50005760
162.6895792.6898222.6897011.6469480.50002816
172.6895792.6897012.6896401.6469180.50001345
182.6895792.6896402.6896091.6469020.50000609
192.6895792.6896092.6895941.6468950.50000241
202.6895792.6895942.6895861.6468910.50000057
212.6895792.6895862.6895831.6468890.49999965
222.6895832.6895862.6895851.6468900.50000011
232.6895832.6895852.6895841.6468900.49999988
242.6895842.6895852.6895841.6468900.49999999

Inner loop — split. At the converged λtotal=2.689584\lambda_{\text{total}} = 2.689584, each row prices the τ-grid at (λh,  λtotalλh)(\lambda_h,\; \lambda_{\text{total}} - \lambda_h) and checks fair P(cover)P(\text{cover}) against pcover=0.5000p^{\ast}_{\text{cover}} = 0.5000:

jlohitrial λₕfair P(cover)move
10.0100002.6795841.3447920.35759231
21.3447922.6795842.0121880.67290199
31.3447922.0121881.6784900.51520853
41.3447921.6784901.5116410.43527488
51.5116411.6784901.5950660.47509906
61.5950661.6784901.6367780.49513575
71.6367781.6784901.6576340.50516984
81.6367781.6576341.6472060.50015194
91.6367781.6472061.6419920.49764360
101.6419921.6472061.6445990.49889772
111.6445991.6472061.6459020.49952482
121.6459021.6472061.6465540.49983838
131.6465541.6472061.6468800.49999516
141.6468801.6472061.6470430.50007355
151.6468801.6470431.6469610.50003436
161.6468801.6469611.6469210.50001476
171.6468801.6469211.6469000.50000496
181.6468801.6469001.6468900.50000006

move: ↑ = fair below target → keep the upper half (lo = mid) · ↓ = above → keep the lower half (hi = mid) · ✓ = |fair − target| < 1e-7 (the dc-stage tolerance; 60-iteration cap). The two final rows land on (1.6469, 1.0427) — step 4’s pair in the ⟹ line above. Every earlier outer row ran this same inner loop against its own trial λ_total; the inner table shown is the one belonging to the winning size.

Reading the repair: each miss has its own knob — a Total miss moves the size (step 2’s bisection on λ_total), a Handicap miss moves the split (step 3’s on λₕ). Here the tilt knocked the cover target off harder (by 0.0080, vs 0.0038 for the over) — ρ < 0 parks its extra mass on the draw cells 0-0/1-1, and on a home -0.50 line a draw is a lost cover — so the correction lands mainly in the split: λₕ +0.0090, λₐ −0.0243, λ_total −0.0152.

Both stages so far are the same nested solve (steps 2–3), each run on its own grid:

Stageλₕλₐλₕ+λₐΔ coverΔ over
Poisson1.63781.06702.70481.9e-91.4e-9
Dixon-Coles1.64691.04272.68966.0e-88.0e-9

These rows are the score-grid panel’s λ chips; the Δ’s are each stage’s achieved |model − target| residuals — the convergence check. One optional constraint remains before the markets price — step 5.

Side by side, the tilt becomes visible — the low-score corner of both grids, every cell shaded by how Dixon-Coles moved it (green = up, red = down; hover a cell for the exact before → after, and click any Dixon-Coles cell for its full derivation from the Poisson pieces):

Poisson (λₕ 1.6378 · λₐ 1.0670)
A=0A=1A=2A=3A=4A=5
H=00.06690.07140.03810.01350.00360.0008
H=10.10950.11690.06240.02220.00590.0013
H=20.08970.09570.05110.01820.00480.0010
H=30.04900.05230.02790.00990.00260.0006
H=40.02010.02140.01140.00410.00110.0002
H=50.00660.00700.00370.00130.00040.0001
Dixon-Coles, re-solved (λₕ 1.6469 · λₐ 1.0427)
A=0A=1A=2A=3A=4A=5
H=00.08020.05960.03720.01290.00340.0007
H=10.10090.12930.06130.02130.00560.0012
H=20.09280.09680.05040.01750.00460.0010
H=30.05090.05310.02770.00960.00250.0005
H=40.02100.02190.01140.00400.00100.0002
H=50.00690.00720.00380.00130.00030.0001
mass up vs Poisson mass down the four τ cellsshade ∝ √|Δ| · both grids share the same shading · shown 0–5, higher cells barely move
5 · Lift the diagonal to the 1X2 draw (φ · Method A) — optional

The 1X2 is a three-way book, so Shin stripped it in step 1: with implied qi=1/diq_i = 1/d_i and overround Q=qiQ = \textstyle\sum q_i, Shin’s insider fraction zz deflates each side to

pi(z)  =  z2+4(1z)qi2/Qz2(1z)bisect z[0,1) until pi=1    z=0.0308p_i(z) \;=\; \frac{\sqrt{z^{2} + 4(1-z)\,q_i^{2}/Q\,} - z}{2(1-z)} \qquad \text{bisect } z \in [0,1) \text{ until } \textstyle\sum p_i = 1 \;\Rightarrow\; z = 0.0308

giving fair P(home)0.5060P(\text{home})\, 0.5060, draw0.2995\text{draw}\, 0.2995, P(away)0.1945P(\text{away})\, 0.1945. The handicap already fixes the win sides; the draw — the grid’s diagonal kJ[k][k]\textstyle\sum_k J[k][k] — is the new constraint. Multiplying every equal-score cell by (1+φ)(1 + \varphi), renormalizing the grid to J=1\textstyle\sum J = 1, and re-solving (λh,λa)(\lambda_h, \lambda_a) so the Handicap and Total still hold, a third bisection lands φ on the draw (Method A: one flat factor across the whole diagonal, i.e. per-cell weights wk=1w_k = 1). The “two-input draw” below is the φ = 0 grid’s diagonal mass — the Dixon-Coles stage’s draw chip in the score-grid panel:

0.2706two-input draw    φ=0.2042    0.29951X2 draw targetΔ=2.0×1010\underbrace{0.2706}_{\text{two-input draw}} \;\xrightarrow{\;\varphi \,=\, 0.2042\;}\; \underbrace{0.2995}_{\text{1X2 draw target}} \qquad \Delta = 2.0 \times 10^{-10}
Unroll the φ search — every bisection iteration

Third loop — the draw. Each row lifts every equal-score cell by (1+φ)(1 + \varphi) at its trial φ, renormalizes, re-solves (λh,λa)(\lambda_h,\, \lambda_a) against the Handicap and Total targets — the entire two-level bisection unrolled in step 4, now on the lifted grid — and reads the solved grid’s diagonal kJ[k][k]\textstyle\sum_k J[k][k] against the draw target 0.29950.2995. Bracket: the two-input draw 0.2706 < target → inflate it: φ ∈ [0.0000, 1.0000]:

ilohitrial φλₕλₐdrawmove
10.0000001.0000000.500000001.8514420.9803290.333069327
20.0000000.5000000.250000001.7526761.0116260.305280237
30.0000000.2500000.125000001.7007121.0272530.288930801
40.1250000.2500000.187500001.7269201.0194540.297333627
50.1875000.2500000.218750001.7398531.0155420.301362045
60.1875000.2187500.203125001.7334001.0174990.299361869
70.2031250.2187500.210937501.7366301.0165210.300365439
80.2031250.2109380.207031251.7350161.0170100.299864494
90.2031250.2070310.205078131.7342081.0172550.299613402
100.2031250.2050780.204101561.7338041.0173770.299487680
110.2041020.2050780.204589841.7340071.0173160.299550541
120.2041020.2045900.204345701.7339061.0173460.299519081
130.2041020.2043460.204223631.7338551.0173610.299503397
140.2042240.2043460.204284671.7338801.0173540.299511273
150.2042240.2042850.204254151.7338681.0173580.299507338
160.2042240.2042540.204238891.7338611.0173590.299505365
170.2042240.2042390.204231261.7338581.0173600.299504384
180.2042240.2042310.204227451.7338571.0173610.299503893
190.2042240.2042270.204225541.7338561.0173610.299503661
200.2042240.2042260.204224591.7338561.0173610.299503495
210.2042250.2042260.204225061.7338561.0173610.299503578
220.2042250.2042260.204225301.7338561.0173610.299503619
230.2042250.2042260.204225421.7338561.0173610.299503640
240.2042250.2042250.204225361.7338561.0173610.299503630
250.2042250.2042250.204225391.7338561.0173610.299503635
260.2042250.2042250.204225381.7338561.0173610.299503632
270.2042250.2042250.204225371.7338561.0173610.299503631

move: ↑ = draw below target → keep the upper half (lo = mid) · ↓ = above → keep the lower half (hi = mid) · ✓ = |draw − target| < 1e-9 (48-iteration cap). The ✓ row is the stage’s result: φ = 0.2042 with the re-solved pair (1.7339, 1.0174) — the 1X2 φ chips in the grid panel and the last row of the table below. Every row re-ran the whole step-4 nest at its own trial φ.

The φ stage re-runs the same nested solve with this third constraint attached, completing step 4’s per-stage table:

Stageλₕλₐλₕ+λₐφΔ coverΔ overΔ draw
Poisson1.63781.06702.70481.9e-91.4e-9
Dixon-Coles1.64691.04272.68966.0e-88.0e-9
1X2 φ1.73391.01742.75120.20421.7e-92.1e-82.0e-10

Every market below prices off the last row’s grid; Δ draw is the φ bisection’s achieved residual.

Consistency — the Handicap owns the tilt, so the 1X2 win legs are a cross-check, not a constraint: model P(home win) 0.5000 vs 1X2 0.5060, P(away win) 0.2005 vs 0.1945. A large gap means the three quotes disagree (different books or times). One draw number fixes the diagonal’s level only — the 2-2/3-3/4-4 shape rides on the flat wₖ; pin it with correct-score quotes. Flat wₖ also lifts only even totals (every k-k totals 2k), so the fit nudges Odd/Even and Exact-Total toward even — Method A is not draw-isolated. ρ and φ both lift 0-0/1-1, so φ absorbs part of ρ — the two are not independently interpretable; flip the Dixon-Coles and 1X2 φ stages in the grid panel to see φ’s residual move.

6 · Read “Correct Score” off the score grid

With λₕ, λₐ and φ fixed, the last stage’s grid J[h][a]J[h][a] (step 5) is fully determined — the score-grid panel above — and every market probability is just a sum of its matching cells. Each outcome is one grid cell J[h][a]; scores beyond the board cap (4-4 full match, 3-3 halves) fold into “AOS”.

OutcomeΣ from gridFairPriced dec
0-00.08670.086711.139
0-10.05150.051518.615
0-20.03170.031729.890
0-30.01070.010783.286
0-40.00270.0027269.624
1-00.09530.095310.142
1-10.14300.14306.784
1-20.05490.054917.468
18 more

Raw masses are normalized to Σ = 1, then inflated by Shin to overround 1 + 0.05 — the insider model run forward: qi=Stiq_i = S \cdot t_i with ti=pi((1z)pi+z)t_i = \sqrt{p_i((1-z)p_i + z)} and S=tiS = \textstyle\sum t_i, bisecting zz until qi=1.05\textstyle\sum q_i = 1.05 (this run: z=0.0021z = 0.0021).

7 · Implementation notes — nesting, brackets, normalization
targets   tH = powerStrip(HCP pair)      # fair P(home covers L)         — step 1
          tT = powerStrip(Total pair)    # fair P(over T)                — step 1
          tD = shinStrip(1X2).draw       # fair P(draw); Method A only   — step 5

bisect φ ∈ (−1, ∞)                       # outermost; skip (φ = 0) with no 1X2
  bisect λ_total ∈ [0.02, 8]             # size — step 2
    bisect λₕ ∈ (0, λ_total)             # split — step 3; λₐ = λ_total − λₕ
      J = Poisson(λₕ, λₐ) on 0…N         # ×τ + renorm (DC — step 4); φ stage: diag ×(1+φ) + renorm
    until fairHcp(J, L) = tH             # line rules — step 2
  until fairTot(J, T) = tT
until Σₖ J[k][k] = tD

The grid panel’s stages run this same nest with the adjustments off/on — Poisson: neither, Dixon-Coles: τ only, 1X2 φ: both. Every residual is monotone in its knob — cover rises with λₕ, over with λ_total, draw with φ — so plain bisection converges: 48–60 iterations per loop at tolerances 1e-9…1e-7 (the round-trip Δp above is this run’s achieved error). The φ bracket doubles upward from [0, 1], or flips to (−1, 0] when the two-input draw already exceeds the 1X2 target. The grid truncates at N = 5: the plain Poisson grid is not renormalized, the τ- and φ-adjusted grids are, and every market group renormalizes its outcome masses to Σ = 1 before its margin is applied — that absorbs the truncation loss. The executable reference for all of the above is docs/src/lib/odds/core.ts + markets.ts, held to the original simulator by the golden-master test in docs/src/lib/odds/__tests__/.