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:
- strips each bookmaker margin (Power method for the two-way pairs, Shin for the three-way 1X2) to fair probabilities;
- back-solves the period's goal rates (λₕ, λₐ) by nested bisection — the Total quote fixes how many goals, the Handicap quote fixes who scores them;
- 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);
- prices every market below off the pipeline's last stage.

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.
↑/↓ 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).
| A=0 | A=1 | A=2 | A=3 | A=4 | A=5 | A=6 | A=7 | A=8 | |
|---|---|---|---|---|---|---|---|---|---|
| H=0 | 8.75 | 5.18 | 3.17 | 1.07 | 0.27 | 0.06 | 0.01 | 0.00 | 0.00 |
| H=1 | 9.51 | 14.30 | 5.46 | 1.85 | 0.47 | 0.10 | 0.02 | 0.00 | 0.00 |
| H=2 | 9.10 | 9.24 | 5.67 | 1.59 | 0.40 | 0.08 | 0.01 | 0.00 | 0.00 |
| H=3 | 5.21 | 5.29 | 2.69 | 1.10 | 0.23 | 0.05 | 0.01 | 0.00 | 0.00 |
| H=4 | 2.24 | 2.27 | 1.15 | 0.39 | 0.12 | 0.02 | 0.00 | 0.00 | 0.00 |
| H=5 | 0.77 | 0.78 | 0.40 | 0.13 | 0.03 | 0.01 | 0.00 | 0.00 | 0.00 |
| H=6 | 0.22 | 0.22 | 0.11 | 0.04 | 0.01 | 0.00 | 0.00 | 0.00 | 0.00 |
| H=7 | 0.05 | 0.06 | 0.03 | 0.01 | 0.00 | 0.00 | 0.00 | 0.00 | 0.00 |
| H=8 | 0.01 | 0.01 | 0.01 | 0.00 | 0.00 | 0.00 | 0.00 | 0.00 | 0.00 |
| Outcome | Odds |
|---|---|
| Home | 1.928 |
| Draw | 3.167 |
| Away | 4.641 |
How these numbers are computed
A two-way Malay price converts to decimal ( if , else ), which implies a probability ; the two sides sum to an overround . The Power method finds the exponent that deflates them to a fair pair , and the stripped (margin-free) decimal odds are the reciprocals . 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.
| Home | Away | |
|---|---|---|
| Malay quote | +0.96 | +0.96 |
| Decimal | 1.9600 | 1.9600 |
| Implied | 0.5102 | 0.5102 |
| Fair | 0.5000 | 0.5000 |
| Fair decimal | 2.0000 | 2.0000 |
| Over | Under | |
|---|---|---|
| Malay quote | +0.95 | +0.95 |
| Decimal | 1.9500 | 1.9500 |
| Implied | 0.5128 | 0.5128 |
| Fair | 0.5000 | 0.5000 |
| Fair decimal | 2.0000 | 2.0000 |
| Home | Draw | Away | |
|---|---|---|---|
| Decimal quote | 1.8900 | 3.1300 | 4.7000 |
| Implied | 0.5291 | 0.3195 | 0.2128 |
| Fair (Shin) | 0.5060 | 0.2995 | 0.1945 |
| Fair decimal | 1.9762 | 3.3389 | 5.1420 |
Try the strips standalone — Margin — two-way (Power) · Margin — multi-way (Shin): the same math on any quotes, with the bisection narrated.
Step 1 left three fair targets, and the model has matching knobs — the scoring rates plus the diagonal lift φ (step 5). Model each side’s goals as Poisson — — and independent. Independent Poissons add — — so the match total depends only on : 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 and push mass of that one total — point masses — and the fair over-probability is . 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:
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 : first each component line’s Poisson masses, then the weighted and , then the fair check against the target:
(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 ⟺ ; an exact hit () is a push: the stake refunds, so a two-way fair probability renormalizes it away, (win mass over non-push mass). A .5 line cannot push, so and the formula degenerates to — same rule, not a shortcut method; a quarter line (±0.25, ±0.75, …) puts half the stake on each neighbouring line, so and are the ½-weighted sums over the two components. The same settlement applies to the Handicap (step 3) and the priced ladders (step 6).
The Handicap decides who scores them — and settling it needs the full scoreline distribution, the score grid: independence makes each cell a plain product of the two Poisson masses,
— exactly the grid the score-grid panel’s Poisson stage displays. Hold fixed and slide the home share (with ). Home covers ⟺ , an exact is a push — step 2’s one rule again, with the masses now read off the grid: and (½-weighted across a quarter line’s two components), fair cover probability — which rises with , so the same solver shape applies:
At the converged split the grid masses and the fair check are:
The recovered pair 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).
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:
The tilted grid is renormalized to (ρ is valid only while every τ stays positive). That reshaping breaks the step 2–3 fit — the same λ pair now prices differently, because and are sums over a grid whose mass just moved. Nothing else changes: the targets stay step 1’s, the settlement rule stays , and the same two nested bisections simply run again with the τ-tilted grid underneath. In the same solver order as steps 2–3:
Step 3 ended on with ; step 4 ends on the same 0.5000 with . That is by construction, not coincidence: 0.5000 is the target — step 1’s — 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.5000 ✓ | 0.4882 ✗ |
| step-4 pair (1.6331, 1.0411) | 0.5117 ✗ | 0.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.5000 → 0.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 and sum over: step 3’s is summed off the product grid, step 4’s 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 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 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 , 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 with to decide which half of the bracket survives:
| k | lo | hi | trial λ_total | inner λₕ | fair P(over) | move |
|---|---|---|---|---|---|---|
| 1 | 0.020000 | 8.000000 | 4.010000 | 2.286293 | 0.76319375 | ↓ |
| 2 | 0.020000 | 4.010000 | 2.015000 | 1.312023 | 0.32737692 | ↑ |
| 3 | 2.015000 | 4.010000 | 3.012500 | 1.798293 | 0.57955654 | ↓ |
| 4 | 2.015000 | 3.012500 | 2.513750 | 1.554844 | 0.45968894 | ↑ |
| 5 | 2.513750 | 3.012500 | 2.763125 | 1.676530 | 0.52167833 | ↓ |
| 6 | 2.513750 | 2.763125 | 2.638437 | 1.615675 | 0.49115104 | ↑ |
| 7 | 2.638437 | 2.763125 | 2.700781 | 1.646100 | 0.50653826 | ↓ |
| 8 | 2.638437 | 2.700781 | 2.669609 | 1.630887 | 0.49887476 | ↑ |
| 9 | 2.669609 | 2.700781 | 2.685195 | 1.638493 | 0.50271414 | ↓ |
| 10 | 2.669609 | 2.685195 | 2.677402 | 1.634690 | 0.50079635 | ↓ |
| 11 | 2.669609 | 2.677402 | 2.673506 | 1.632788 | 0.49983603 | ↑ |
| 12 | 2.673506 | 2.677402 | 2.675454 | 1.633739 | 0.50031630 | ↓ |
| 13 | 2.673506 | 2.675454 | 2.674480 | 1.633264 | 0.50007619 | ↓ |
| 14 | 2.673506 | 2.674480 | 2.673993 | 1.633026 | 0.49995612 | ↑ |
| 15 | 2.673993 | 2.674480 | 2.674236 | 1.633145 | 0.50001616 | ↓ |
| 16 | 2.673993 | 2.674236 | 2.674115 | 1.633085 | 0.49998614 | ↑ |
| 17 | 2.674115 | 2.674236 | 2.674176 | 1.633115 | 0.50000115 | ↓ |
| 18 | 2.674115 | 2.674176 | 2.674145 | 1.633100 | 0.49999364 | ↑ |
| 19 | 2.674145 | 2.674176 | 2.674160 | 1.633108 | 0.49999740 | ↑ |
| 20 | 2.674160 | 2.674176 | 2.674168 | 1.633111 | 0.49999927 | ↑ |
| 21 | 2.674168 | 2.674176 | 2.674172 | 1.633113 | 0.50000021 | ↓ |
| 22 | 2.674168 | 2.674172 | 2.674170 | 1.633112 | 0.49999974 | ↑ |
| 23 | 2.674170 | 2.674172 | 2.674171 | 1.633113 | 0.49999998 | ✓ |
Inner loop — split. At the converged , each row prices the τ-grid at and checks fair against :
| j | lo | hi | trial λₕ | fair P(cover) | move |
|---|---|---|---|---|---|
| 1 | 0.010000 | 2.664171 | 1.337085 | 0.35785478 | ↑ |
| 2 | 1.337085 | 2.664171 | 2.000628 | 0.67699314 | ↓ |
| 3 | 1.337085 | 2.000628 | 1.668857 | 0.51752852 | ↓ |
| 4 | 1.337085 | 1.668857 | 1.502971 | 0.43653752 | ↑ |
| 5 | 1.502971 | 1.668857 | 1.585914 | 0.47689072 | ↑ |
| 6 | 1.585914 | 1.668857 | 1.627385 | 0.49719266 | ↑ |
| 7 | 1.627385 | 1.668857 | 1.648121 | 0.50735869 | ↓ |
| 8 | 1.627385 | 1.648121 | 1.637753 | 0.50227491 | ↓ |
| 9 | 1.627385 | 1.637753 | 1.632569 | 0.49973356 | ↑ |
| 10 | 1.632569 | 1.637753 | 1.635161 | 0.50100418 | ↓ |
| 11 | 1.632569 | 1.635161 | 1.633865 | 0.50036886 | ↓ |
| 12 | 1.632569 | 1.633865 | 1.633217 | 0.50005120 | ↓ |
| 13 | 1.632569 | 1.633217 | 1.632893 | 0.49989238 | ↑ |
| 14 | 1.632893 | 1.633217 | 1.633055 | 0.49997179 | ↑ |
| 15 | 1.633055 | 1.633217 | 1.633136 | 0.50001150 | ↓ |
| 16 | 1.633055 | 1.633136 | 1.633096 | 0.49999164 | ↑ |
| 17 | 1.633096 | 1.633136 | 1.633116 | 0.50000157 | ↓ |
| 18 | 1.633096 | 1.633116 | 1.633106 | 0.49999661 | ↑ |
| 19 | 1.633106 | 1.633116 | 1.633111 | 0.49999909 | ↑ |
| 20 | 1.633111 | 1.633116 | 1.633113 | 0.50000033 | ↓ |
| 21 | 1.633111 | 1.633113 | 1.633112 | 0.49999971 | ↑ |
| 22 | 1.633112 | 1.633113 | 1.633113 | 0.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 |
|---|---|---|---|---|---|
| Poisson | 1.6091 | 1.0652 | 2.6743 | 8.4e-9 | 1.6e-10 |
| Dixon-Coles | 1.6331 | 1.0411 | 2.6742 | 1.9e-8 | 2.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):
| A=0 | A=1 | A=2 | A=3 | A=4 | A=5 | |
|---|---|---|---|---|---|---|
| H=0 | 0.0690 | 0.0735 | 0.0391 | 0.0139 | 0.0037 | 0.0008 |
| H=1 | 0.1110 | 0.1182 | 0.0629 | 0.0223 | 0.0060 | 0.0013 |
| H=2 | 0.0893 | 0.0951 | 0.0506 | 0.0180 | 0.0048 | 0.0010 |
| H=3 | 0.0479 | 0.0510 | 0.0272 | 0.0096 | 0.0026 | 0.0005 |
| H=4 | 0.0193 | 0.0205 | 0.0109 | 0.0039 | 0.0010 | 0.0002 |
| H=5 | 0.0062 | 0.0066 | 0.0035 | 0.0012 | 0.0003 | 0.0001 |
| A=0 | A=1 | A=2 | A=3 | A=4 | A=5 | |
|---|---|---|---|---|---|---|
| H=0 | 0.0807 | 0.0601 | 0.0374 | 0.0130 | 0.0034 | 0.0007 |
| H=1 | 0.1009 | 0.1290 | 0.0610 | 0.0212 | 0.0055 | 0.0011 |
| H=2 | 0.0920 | 0.0957 | 0.0498 | 0.0173 | 0.0045 | 0.0009 |
| H=3 | 0.0501 | 0.0521 | 0.0271 | 0.0094 | 0.0025 | 0.0005 |
| H=4 | 0.0204 | 0.0213 | 0.0111 | 0.0038 | 0.0010 | 0.0002 |
| H=5 | 0.0067 | 0.0070 |