Skip to main content

Odds Generation — goal · regular

Pick a period and enter that period's Handicap and Total quotes in Malay and its 1X2 in decimal — margins still embedded in all three. The engine:

  1. strips each bookmaker margin (Power method for the two-way pairs, Shin for the three-way 1X2) to fair probabilities;
  2. back-solves the period's goal rates (λₕ, λₐ) by nested bisection — the Total quote fixes how many goals, the Handicap quote fixes who scores them;
  3. refines the score grid (the joint final-score distribution) in fixed stages — the independent-Poisson baseline, then Dixon-Coles' low-score correlation ρ (lifts draws and 0-0/1-1 at the expense of 1-0/0-1), then an optional diagonal lift φ that lands the draw mass on the 1X2 draw (toggle in the 1X2 box; off = the plain two-quote inversion);
  4. prices every market below off the pipeline's last stage.
Stage 1 — Poisson baseline: two Poisson marginals outer-product into the joint score grid
Stage 1 — the solved rates (λₕ, λₐ) outer-product into the joint score grid: P(h,a) = P(h;λₕ) · P(a;λₐ)

Each stage re-solves (λₕ, λₐ) against the same fair targets, so the score grid's stage switcher is a true before/after — flip Poisson / Dixon-Coles / 1X2 φ to see exactly what ρ and φ move.

Each period — full match, 1st half, 2nd half — is its own inversion from its own quotes. Markets that need goal timing, scoring method, in-match trajectory, or both halves at once (Half Time/Full Time, Highest Scoring Half, First/Next Goal, …) are out of scope here; see the Markets reference for the full catalog.

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.7191λₐ 1.0155λtotal 2.7346φ 0.2098round-trip Δp 7.1e-8 / 3.1e-8 / 1.2e-10draw 0.27000.2995grid N=8 · Poisson → Dixon-Coles → 1X2 φ
Score grid — P(home = h, away = a) ×100
λₕ 1.7191λₐ 1.0155φ 0.2098draw 0.2995
A=0A=1A=2A=3A=4A=5A=6A=7A=8
H=08.755.183.171.070.270.060.010.000.00
H=19.5114.305.461.850.470.100.020.000.00
H=29.109.245.671.590.400.080.010.000.00
H=35.215.292.691.100.230.050.010.000.00
H=42.242.271.150.390.120.020.000.000.00
H=50.770.780.400.130.030.010.000.000.00
H=60.220.220.110.040.010.000.000.000.00
H=70.050.060.030.010.000.000.000.000.00
H=80.010.010.010.000.000.000.000.000.00
home win draw away winshade ∝ probability
21 in scope
OutcomeOdds
Home1.928
Draw3.167
Away4.641
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.5000p^{\ast}_{\text{over}} \;=\; \text{fair } P(\text{over } 2.50) \;=\; 0.5000
search: bisect λtotal[0.02,8]   until   W/(1R)=pover    λtotal=2.6743\text{bisect } \lambda_{\text{total}} \in [0.02,\, 8] \;\text{ until }\; W/(1-R) = p^{\ast}_{\text{over}} \;\Rightarrow\; \lambda_{\text{total}} = 2.6743

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.6743\lambda = \lambda_{\text{total}} = 2.6743: 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.6743\Longrightarrow\;\; \lambda_{\text{total}} = 2.6743

(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=08J[h][a] \;=\; P(\text{home} = h;\, \lambda_h) \cdot P(\text{away} = a;\, \lambda_a) \qquad h, a = 0 \ldots 8

— 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.5000p^{\ast}_{\text{cover}} \;=\; \text{fair } P(\text{home covers } -0.50) \;=\; 0.5000
search: bisect λh(0,λtotal)   until   W/(1R)=pcover    λh=1.6091,    λa=λtotalλh=1.0652\text{bisect } \lambda_h \in (0,\, \lambda_{\text{total}}) \;\text{ until }\; W/(1-R) = p^{\ast}_{\text{cover}} \;\Rightarrow\; \lambda_h = 1.6091,\;\; \lambda_a = \lambda_{\text{total}} - \lambda_h = 1.0652

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.6091λa=1.0652\Longrightarrow\;\; \lambda_h = 1.6091 \qquad \lambda_a = 1.0652

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.6331, 1.0411) from below:
τ(0,0)  =  1λhλaρ  =  11.6331×1.0411×(0.10)  =  1.1700\tau(0,0) \;=\; 1 - \lambda_h \cdot \lambda_a \cdot \rho \;=\; 1 - 1.6331 \times 1.0411 \times (-0.10) \;=\; 1.1700
τ(0,1)  =  1+λhρ  =  1+1.6331×(0.10)  =  0.8367\tau(0,1) \;=\; 1 + \lambda_h \cdot \rho \;=\; 1 + 1.6331 \times (-0.10) \;=\; 0.8367
τ(1,0)  =  1+λaρ  =  1+1.0411×(0.10)  =  0.8959\tau(1,0) \;=\; 1 + \lambda_a \cdot \rho \;=\; 1 + 1.0411 \times (-0.10) \;=\; 0.8959
τ(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.6091,1.0652):fair P(over)=0.5000fair P(cover)=0.4882cover off target(\lambda_h,\, \lambda_a) = (1.6091,\, 1.0652): \quad \text{fair } P(\text{over}) = 0.5000 \qquad \text{fair } P(\text{cover}) = 0.4882 \qquad \text{cover 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.6331,1.0411) ⁣:fair P(over 2.50)  =  Wτ1Rτ  =  0.500010.0000  =  0.5000  =  pover    \text{at } (\lambda_h,\, \lambda_a) = (1.6331,\, 1.0411)\!: \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.6091,1.0652)    τ,  ρ=0.10    (1.6331,1.0411)λtotal:  2.67432.6742\Longrightarrow\;\; (\lambda_h,\, \lambda_a): \; (1.6091,\, 1.0652) \;\xrightarrow{\;\tau,\;\rho \,=\, -0.10\;}\; (1.6331,\, 1.0411) \qquad \lambda_{\text{total}}: \; 2.6743 \to 2.6742

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.6091\lambda_h = 1.6091; step 4 ends on the same 0.5000 with λh=1.6331\lambda_h = 1.6331. 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.6091, 1.0652)0.50000.4882
step-4 pair (1.6331, 1.0411)0.51170.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.4882. 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.11100.1009(τ(1,0)=1+λaρ=0.8959)J[1][0]: 0.1110 \to 0.1009 \quad (\tau(1,0) = 1 + \lambda_a \rho = 0.8959) 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.

(The table tracks the cover value because at a total line of 2.50 all four τ cells sit on the under side, so the tilt’s net mass shift nearly cancels and fair P(over)P(\text{over}) barely moves — off target only past 4 dp. The visible repair is almost entirely on the cover side.)

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.2862930.76319375
20.0200004.0100002.0150001.3120230.32737692
32.0150004.0100003.0125001.7982930.57955654
42.0150003.0125002.5137501.5548440.45968894
52.5137503.0125002.7631251.6765300.52167833
62.5137502.7631252.6384371.6156750.49115104
72.6384372.7631252.7007811.6461000.50653826
82.6384372.7007812.6696091.6308870.49887476
92.6696092.7007812.6851951.6384930.50271414
102.6696092.6851952.6774021.6346900.50079635
112.6696092.6774022.6735061.6327880.49983603
122.6735062.6774022.6754541.6337390.50031630
132.6735062.6754542.6744801.6332640.50007619
142.6735062.6744802.6739931.6330260.49995612
152.6739932.6744802.6742361.6331450.50001616
162.6739932.6742362.6741151.6330850.49998614
172.6741152.6742362.6741761.6331150.50000115
182.6741152.6741762.6741451.6331000.49999364
192.6741452.6741762.6741601.6331080.49999740
202.6741602.6741762.6741681.6331110.49999927
212.6741682.6741762.6741721.6331130.50000021
222.6741682.6741722.6741701.6331120.49999974
232.6741702.6741722.6741711.6331130.49999998

Inner loop — split. At the converged λtotal=2.674171\lambda_{\text{total}} = 2.674171, 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.6641711.3370850.35785478
21.3370852.6641712.0006280.67699314
31.3370852.0006281.6688570.51752852
41.3370851.6688571.5029710.43653752
51.5029711.6688571.5859140.47689072
61.5859141.6688571.6273850.49719266
71.6273851.6688571.6481210.50735869
81.6273851.6481211.6377530.50227491
91.6273851.6377531.6325690.49973356
101.6325691.6377531.6351610.50100418
111.6325691.6351611.6338650.50036886
121.6325691.6338651.6332170.50005120
131.6325691.6332171.6328930.49989238
141.6328931.6332171.6330550.49997179
151.6330551.6332171.6331360.50001150
161.6330551.6331361.6330960.49999164
171.6330961.6331361.6331160.50000157
181.6330961.6331161.6331060.49999661
191.6331061.6331161.6331110.49999909
201.6331111.6331161.6331130.50000033
211.6331111.6331131.6331120.49999971
221.6331121.6331131.6331130.50000002

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.6331, 1.0411) — 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.0118, vs 0.0000 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.0240, λₐ −0.0241, λ_total −0.0001.

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

Stageλₕλₐλₕ+λₐΔ coverΔ over
Poisson1.60911.06522.67438.4e-91.6e-10
Dixon-Coles1.63311.04112.67421.9e-82.4e-8

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.6091 · λₐ 1.0652)
A=0A=1A=2A=3A=4A=5
H=00.06900.07350.03910.01390.00370.0008
H=10.11100.11820.06290.02230.00600.0013
H=20.08930.09510.05060.01800.00480.0010
H=30.04790.05100.02720.00960.00260.0005
H=40.01930.02050.01090.00390.00100.0002
H=50.00620.00660.00350.00120.00030.0001
Dixon-Coles, re-solved (λₕ 1.6331 · λₐ 1.0411)
A=0A=1A=2A=3A=4A=5
H=00.08070.06010.03740.01300.00340.0007
H=10.10090.12900.06100.02120.00550.0011
H=20.09200.09570.04980.01730.00450.0009
H=30.05010.05210.02710.00940.00250.0005
H=40.02040.02130.01110.00380.00100.0002
H=50.00670.00700.00360.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.2700two-input draw    φ=0.2098    0.29951X2 draw targetΔ=1.2×1010\underbrace{0.2700}_{\text{two-input draw}} \;\xrightarrow{\;\varphi \,=\, 0.2098\;}\; \underbrace{0.2995}_{\text{1X2 draw target}} \qquad \Delta = 1.2 \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.2700 < target → inflate it: φ ∈ [0.0000, 1.0000]:

ilohitrial φλₕλₐdrawmove
10.0000001.0000000.500000001.8293780.9797860.332246282
20.0000000.5000000.250000001.7349351.0105300.304544039
30.0000000.2500000.125000001.6850021.0258840.288248091
40.1250000.2500000.187500001.7102061.0182200.296623306
50.1875000.2500000.218750001.7226291.0143780.300638584
60.1875000.2187500.203125001.7164321.0163000.298644906
70.2031250.2187500.210937501.7195341.0153390.299645194
80.2031250.2109380.207031251.7179841.0158200.299145939
90.2070310.2109380.208984381.7187601.0155790.299395765
100.2089840.2109380.209960941.7191471.0154590.299520543
110.2089840.2099610.209472661.7189531.0155190.299458184
120.2094730.2099610.209716801.7190501.0154890.299489334
130.2097170.2099610.209838871.7190991.0154740.299504958
140.2097170.2098390.209777831.7190741.0154820.299497180
150.2097780.2098390.209808351.7190871.0154780.299501031
160.2098080.2098390.209823611.7190921.0154760.299503028
170.2098240.2098390.209831241.7190961.0154750.299503960
180.2098240.2098310.209827421.7190941.0154750.299503475
190.2098270.2098310.209829331.7190951.0154750.299503734
200.2098270.2098290.209828381.7190941.0154760.299503607
210.2098280.2098290.209828851.7190951.0154750.299503651
220.2098280.2098290.209828621.7190951.0154750.299503610
230.2098290.2098290.209828731.7190951.0154750.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.2098 with the re-solved pair (1.7191, 1.0155) — 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.60911.06522.67438.4e-91.6e-10
Dixon-Coles1.63311.04112.67421.9e-82.4e-8
1X2 φ1.71911.01552.73460.20987.1e-83.1e-81.2e-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 “1X2” 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. Home sums every grid cell with home > away, Draw the diagonal, Away the cells with home < away.

OutcomeΣ from gridFairPriced dec
Home0.50000.50001.928
Draw0.29950.29953.167
Away0.20050.20054.641

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.0251z = 0.0251).

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 = 8: 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__/.