FAILURE MAP
← Case archive

FA-84591 / Betting odds conversion / Open access

Arbitrage stakes proportional to price instead of implied probability · case 01

The stake split loses money on one outcome.

Verified by executionVariant 1 · 7 checks per implementationDownload source bundle ↓JSON ↗

ROOT CAUSE

Stakes are weighted by the decimal price.

VERIFIED REPAIR

Weight stakes by 1/d_i normalised by S.

Unsuccessful approach: Splitting the total equally only equalises returns when the prices are equal.

Case contract

Arbitrage finder. books rows are [bookmaker, outcome, decimal price]. For each outcome take the highest price; ties go to the alphabetically first bookmaker. S = sum of 1/best price. If S >= 1 return ["no arb"]. Otherwise stake_i = floor(total * (1/d_i) / S) cents; guaranteed return = min over outcomes of floor(stake_i * d_i). Return ["arb", [[outcome, bookmaker, stake] sorted by outcome], guaranteed return - sum of stakes].

Why this case matters

Odds comparison tools flag sure bets and split a bankroll across bookmakers.

1 / The failure

Exit 1
"""Failure Map reference implementation. Python standard library only."""
import json
from fractions import Fraction
import math
N = 1
observations = []
def solve(books, total_cents):
    best = {}
    for book, outcome, price in books:
        d = Fraction(price)
        cur = best.get(outcome)
        if cur is None or d > cur[0] or (d == cur[0] and book < cur[1]):
            best[outcome] = (d, book)
    S = sum(1 / d for d, _ in best.values())
    if S >= 1:
        return ['no arb']
    rows = []
    ret = None
    for outcome in sorted(best):
        d, book = best[outcome]
        stake = math.floor(total_cents * d / sum(x for x, _ in best.values()))
        rows.append([outcome, book, stake])
        r = math.floor(stake * d)
        ret = r if ret is None else min(ret, r)
    return ['arb', rows, ret - sum(r[2] for r in rows)]
def check(label, actual, expected):
    observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
def run(args):
    try:
        return solve(*args)
    except Exception as exc:
        return 'raised ' + type(exc).__name__
cases = [[('control two-way arb',
   ([['alpha', 'home', '2.10'], ['bravo', 'away', '2.10'], ['bravo', 'home', '1.90']], 10000),
   ['arb', [['away', 'bravo', 5000], ['home', 'alpha', 5000]], 500]),
  ('boundary exactly fair book',
   ([['alpha', 'home', '2.00'], ['bravo', 'away', '2.00']], 10000),
   ['no arb']),
  ('boundary tie goes to first name',
   ([['kilo', 'home', '2.20'], ['alpha', 'home', '2.20'], ['bravo', 'away', '2.20']], 10000),
   ['arb', [['away', 'bravo', 5000], ['home', 'alpha', 5000]], 1000]),
  ('control no arb', ([['alpha', 'home', '1.90'], ['alpha', 'away', '1.90']], 10000), ['no arb']),
  ('regression: stake proportion',
   ([['kilo', 'home', '1.77'], ['bravo', 'home', '1.70'], ['alpha', 'away', '2.31']], 10000),
   ['arb', [['away', 'alpha', 4338], ['home', 'kilo', 5661]], 20]),
  ('variant scenario 1',
   ([['alpha', 'home', '3.03'],
     ['kilo', 'home', '3.37'],
     ['bravo', 'home', '3.49'],
     ['alpha', 'draw', '2.44'],
     ['kilo', 'draw', '2.76'],
     ['bravo', 'away', '3.15'],
     ['alpha', 'away', '3.31'],
     ['bravo', 'home', '3.03']],
    10000),
   ['arb', [['away', 'alpha', 3176], ['draw', 'kilo', 3810], ['home', 'bravo', 3013]], 513]),
  ('variant scenario 2',
   ([['kilo', 'home', '2.80'],
     ['delta', 'draw', '2.92'],
     ['alpha', 'draw', '2.54'],
     ['kilo', 'draw', '2.85'],
     ['kilo', 'away', '3.32'],
     ['delta', 'away', '3.86'],
     ['alpha', 'away', '3.71']],
    10000),
   ['arb', [['away', 'delta', 2702], ['draw', 'delta', 3572], ['home', 'kilo', 3725]], 430])],
 [('control two-way arb',
   ([['alpha', 'home', '2.10'], ['bravo', 'away', '2.10'], ['bravo', 'home', '1.90']], 10000),
   ['arb', [['away', 'bravo', 5000], ['home', 'alpha', 5000]], 500]),
  ('boundary exactly fair book',
   ([['alpha', 'home', '2.00'], ['bravo', 'away', '2.00']], 10000),
   ['no arb']),
  ('boundary tie goes to first name',
   ([['kilo', 'home', '2.20'], ['alpha', 'home', '2.20'], ['bravo', 'away', '2.20']], 10000),
   ['arb', [['away', 'bravo', 5000], ['home', 'alpha', 5000]], 1000]),
  ('control no arb', ([['alpha', 'home', '1.90'], ['alpha', 'away', '1.90']], 10000), ['no arb']),
  ('regression: stake proportion',
   ([['bravo', 'home', '2.41'],
     ['delta', 'home', '2.58'],
     ['delta', 'away', '1.71'],
     ['kilo', 'away', '1.73'],
     ['alpha', 'home', '2.41']],
    25000),
   ['arb', [['away', 'kilo', 14965], ['home', 'delta', 10034]], 888]),
  ('variant scenario 1',
   ([['alpha', 'home', '2.55'],
     ['bravo', 'home', '2.43'],
     ['bravo', 'draw', '3.12'],
     ['alpha', 'away', '3.68'],
     ['delta', 'away', '4.14'],
     ['kilo', 'away', '4.12']],
    25000),
   ['arb', [['away', 'delta', 6328], ['draw', 'bravo', 8397], ['home', 'alpha', 10274]], 1198]),
  ('variant scenario 2',
   ([['bravo', 'home', '1.81'],
     ['delta', 'draw', '4.47'],
     ['kilo', 'away', '4.69'],
     ['bravo', 'away', '4.85'],
     ['bravo', 'home', '1.81']],
    9999),
   ['arb', [['away', 'bravo', 2098], ['draw', 'delta', 2277], ['home', 'bravo', 5623]], 177])],
 [('control two-way arb',
   ([['alpha', 'home', '2.10'], ['bravo', 'away', '2.10'], ['bravo', 'home', '1.90']], 10000),
   ['arb', [['away', 'bravo', 5000], ['home', 'alpha', 5000]], 500]),
  ('boundary exactly fair book',
   ([['alpha', 'home', '2.00'], ['bravo', 'away', '2.00']], 10000),
   ['no arb']),
  ('boundary tie goes to first name',
   ([['kilo', 'home', '2.20'], ['alpha', 'home', '2.20'], ['bravo', 'away', '2.20']], 10000),
   ['arb', [['away', 'bravo', 5000], ['home', 'alpha', 5000]], 1000]),
  ('control no arb', ([['alpha', 'home', '1.90'], ['alpha', 'away', '1.90']], 10000), ['no arb']),
  ('regression: stake proportion',
   ([['alpha', 'home', '4.00'],
     ['delta', 'home', '4.38'],
     ['bravo', 'home', '4.21'],
     ['kilo', 'draw', '1.87'],
     ['bravo', 'draw', '1.93'],
     ['delta', 'draw', '1.87'],
     ['bravo', 'away', '3.76'],
     ['kilo', 'away', '4.13'],
     ['delta', 'away', '4.11']],
    25000),
   ['arb', [['away', 'kilo', 6123], ['draw', 'bravo', 13103], ['home', 'delta', 5773]], 286]),
  ('variant scenario 1',
   ([['bravo', 'home', '3.11'],
     ['delta', 'home', '3.18'],
     ['delta', 'draw', '4.37'],
     ['bravo', 'draw', '4.52'],
     ['kilo', 'draw', '4.14'],
     ['bravo', 'away', '2.15']],
    25000),
   ['no arb']),
  ('variant scenario 2',
   ([['alpha', 'home', '2.53'],
     ['delta', 'home', '2.41'],
     ['kilo', 'home', '2.24'],
     ['bravo', 'away', '1.78'],
     ['delta', 'away', '1.55']],
    25000),
   ['arb', [['away', 'bravo', 14675], ['home', 'alpha', 10324]], 1120])],
 [('control two-way arb',
   ([['alpha', 'home', '2.10'], ['bravo', 'away', '2.10'], ['bravo', 'home', '1.90']], 10000),
   ['arb', [['away', 'bravo', 5000], ['home', 'alpha', 5000]], 500]),
  ('boundary exactly fair book',
   ([['alpha', 'home', '2.00'], ['bravo', 'away', '2.00']], 10000),
   ['no arb']),
  ('boundary tie goes to first name',
   ([['kilo', 'home', '2.20'], ['alpha', 'home', '2.20'], ['bravo', 'away', '2.20']], 10000),
   ['arb', [['away', 'bravo', 5000], ['home', 'alpha', 5000]], 1000]),
  ('control no arb', ([['alpha', 'home', '1.90'], ['alpha', 'away', '1.90']], 10000), ['no arb']),
  ('regression: stake proportion',
   ([['bravo', 'home', '2.35'],
     ['kilo', 'home', '2.21'],
     ['delta', 'home', '2.23'],
     ['kilo', 'draw', '2.92'],
     ['bravo', 'draw', '3.06'],
     ['alpha', 'draw', '2.87'],
     ['delta', 'away', '4.09'],
     ['bravo', 'away', '4.25'],
     ['alpha', 'away', '4.23']],
    10000),
   ['arb', [['away', 'bravo', 2382], ['draw', 'bravo', 3308], ['home', 'bravo', 4308]], 124]),
  ('variant scenario 1',
   ([['delta', 'home', '1.77'],
     ['alpha', 'home', '1.75'],
     ['bravo', 'home', '1.66'],
     ['bravo', 'away', '2.34'],
     ['kilo', 'away', '2.44'],
     ['delta', 'away', '2.39']],
    9999),
   ['arb', [['away', 'kilo', 4203], ['home', 'delta', 5795]], 257]),
  ('variant scenario 2',
   ([['delta', 'home', '1.88'],
     ['alpha', 'home', '2.19'],
     ['bravo', 'home', '2.04'],
     ['kilo', 'draw', '5.15'],
     ['alpha', 'away', '2.93']],
    10000),
   ['arb', [['away', 'alpha', 3440], ['draw', 'kilo', 1957], ['home', 'alpha', 4602]], 79])],
 [('control two-way arb',
   ([['alpha', 'home', '2.10'], ['bravo', 'away', '2.10'], ['bravo', 'home', '1.90']], 10000),
   ['arb', [['away', 'bravo', 5000], ['home', 'alpha', 5000]], 500]),
  ('boundary exactly fair book',
   ([['alpha', 'home', '2.00'], ['bravo', 'away', '2.00']], 10000),
   ['no arb']),
  ('boundary tie goes to first name',
   ([['kilo', 'home', '2.20'], ['alpha', 'home', '2.20'], ['bravo', 'away', '2.20']], 10000),
   ['arb', [['away', 'bravo', 5000], ['home', 'alpha', 5000]], 1000]),
  ('control no arb', ([['alpha', 'home', '1.90'], ['alpha', 'away', '1.90']], 10000), ['no arb']),
  ('regression: stake proportion',
   ([['kilo', 'home', '2.14'],
     ['bravo', 'home', '2.12'],
     ['alpha', 'home', '1.97'],
     ['delta', 'away', '1.68'],
     ['bravo', 'away', '1.77'],
     ['kilo', 'away', '1.89']],
    25000),
   ['arb', [['away', 'kilo', 13275], ['home', 'kilo', 11724]], 90]),
  ('variant scenario 1',
   ([['alpha', 'home', '2.52'],
     ['bravo', 'home', '2.60'],
     ['delta', 'draw', '2.13'],
     ['kilo', 'away', '4.85'],
     ['alpha', 'away', '4.61']],
    10000),
   ['no arb']),
  ('variant scenario 2',
   ([['bravo', 'home', '2.64'],
     ['kilo', 'home', '2.42'],
     ['delta', 'home', '2.49'],
     ['bravo', 'away', '1.55']],
    25000),
   ['no arb'])]]
for label, args, expected in cases[N - 1]:
    check(label, run(args), expected)
print(json.dumps({"observations": observations, "passed": all(x["passed"] for x in observations)}, ensure_ascii=False))
raise SystemExit(0 if all(x["passed"] for x in observations) else 1)
Boundary fixtureActualExpectedOutcome
control two-way arb['arb', [['away', 'bravo', 5000], ['home', 'alpha', 5000]], 500]['arb', [['away', 'bravo', 5000], ['home', 'alpha', 5000]], 500]Passed
boundary exactly fair book['no arb']['no arb']Passed
boundary tie goes to first name['arb', [['away', 'bravo', 5000], ['home', 'alpha', 5000]], 1000]['arb', [['away', 'bravo', 5000], ['home', 'alpha', 5000]], 1000]Passed
control no arb['no arb']['no arb']Passed
regression: stake proportion['arb', [['away', 'alpha', 5661], ['home', 'kilo', 4338]], -2321]['arb', [['away', 'alpha', 4338], ['home', 'kilo', 5661]], 20]Failed
variant scenario 1['arb', [['away', 'alpha', 3462], ['draw', 'kilo', 2887], ['home', 'bravo', 3650]], -2031]['arb', [['away', 'alpha', 3176], ['draw', 'kilo', 3810], ['home', 'bravo', 3013]], 513]Failed
variant scenario 2['arb', [['away', 'delta', 4029], ['draw', 'delta', 3048], ['home', 'kilo', 2922]], -1818]['arb', [['away', 'delta', 2702], ['draw', 'delta', 3572], ['home', 'kilo', 3725]], 430]Failed

SHA-256 / 814f220cf92bb541738e8d95793884755452d99521f1099b405cffc7d7685004

2 / The unsuccessful fix

Exit 1
"""Failure Map reference implementation. Python standard library only."""
import json
from fractions import Fraction
import math
N = 1
observations = []
def solve(books, total_cents):
    best = {}
    for book, outcome, price in books:
        d = Fraction(price)
        cur = best.get(outcome)
        if cur is None or d > cur[0] or (d == cur[0] and book < cur[1]):
            best[outcome] = (d, book)
    S = sum(1 / d for d, _ in best.values())
    if S >= 1:
        return ['no arb']
    rows = []
    ret = None
    for outcome in sorted(best):
        d, book = best[outcome]
        stake = total_cents // len(best)
        rows.append([outcome, book, stake])
        r = math.floor(stake * d)
        ret = r if ret is None else min(ret, r)
    return ['arb', rows, ret - sum(r[2] for r in rows)]
def check(label, actual, expected):
    observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
def run(args):
    try:
        return solve(*args)
    except Exception as exc:
        return 'raised ' + type(exc).__name__
cases = [[('control two-way arb',
   ([['alpha', 'home', '2.10'], ['bravo', 'away', '2.10'], ['bravo', 'home', '1.90']], 10000),
   ['arb', [['away', 'bravo', 5000], ['home', 'alpha', 5000]], 500]),
  ('boundary exactly fair book',
   ([['alpha', 'home', '2.00'], ['bravo', 'away', '2.00']], 10000),
   ['no arb']),
  ('boundary tie goes to first name',
   ([['kilo', 'home', '2.20'], ['alpha', 'home', '2.20'], ['bravo', 'away', '2.20']], 10000),
   ['arb', [['away', 'bravo', 5000], ['home', 'alpha', 5000]], 1000]),
  ('control no arb', ([['alpha', 'home', '1.90'], ['alpha', 'away', '1.90']], 10000), ['no arb']),
  ('regression: stake proportion',
   ([['kilo', 'home', '1.77'], ['bravo', 'home', '1.70'], ['alpha', 'away', '2.31']], 10000),
   ['arb', [['away', 'alpha', 4338], ['home', 'kilo', 5661]], 20]),
  ('variant scenario 1',
   ([['alpha', 'home', '3.03'],
     ['kilo', 'home', '3.37'],
     ['bravo', 'home', '3.49'],
     ['alpha', 'draw', '2.44'],
     ['kilo', 'draw', '2.76'],
     ['bravo', 'away', '3.15'],
     ['alpha', 'away', '3.31'],
     ['bravo', 'home', '3.03']],
    10000),
   ['arb', [['away', 'alpha', 3176], ['draw', 'kilo', 3810], ['home', 'bravo', 3013]], 513]),
  ('variant scenario 2',
   ([['kilo', 'home', '2.80'],
     ['delta', 'draw', '2.92'],
     ['alpha', 'draw', '2.54'],
     ['kilo', 'draw', '2.85'],
     ['kilo', 'away', '3.32'],
     ['delta', 'away', '3.86'],
     ['alpha', 'away', '3.71']],
    10000),
   ['arb', [['away', 'delta', 2702], ['draw', 'delta', 3572], ['home', 'kilo', 3725]], 430])],
 [('control two-way arb',
   ([['alpha', 'home', '2.10'], ['bravo', 'away', '2.10'], ['bravo', 'home', '1.90']], 10000),
   ['arb', [['away', 'bravo', 5000], ['home', 'alpha', 5000]], 500]),
  ('boundary exactly fair book',
   ([['alpha', 'home', '2.00'], ['bravo', 'away', '2.00']], 10000),
   ['no arb']),
  ('boundary tie goes to first name',
   ([['kilo', 'home', '2.20'], ['alpha', 'home', '2.20'], ['bravo', 'away', '2.20']], 10000),
   ['arb', [['away', 'bravo', 5000], ['home', 'alpha', 5000]], 1000]),
  ('control no arb', ([['alpha', 'home', '1.90'], ['alpha', 'away', '1.90']], 10000), ['no arb']),
  ('regression: stake proportion',
   ([['bravo', 'home', '2.41'],
     ['delta', 'home', '2.58'],
     ['delta', 'away', '1.71'],
     ['kilo', 'away', '1.73'],
     ['alpha', 'home', '2.41']],
    25000),
   ['arb', [['away', 'kilo', 14965], ['home', 'delta', 10034]], 888]),
  ('variant scenario 1',
   ([['alpha', 'home', '2.55'],
     ['bravo', 'home', '2.43'],
     ['bravo', 'draw', '3.12'],
     ['alpha', 'away', '3.68'],
     ['delta', 'away', '4.14'],
     ['kilo', 'away', '4.12']],
    25000),
   ['arb', [['away', 'delta', 6328], ['draw', 'bravo', 8397], ['home', 'alpha', 10274]], 1198]),
  ('variant scenario 2',
   ([['bravo', 'home', '1.81'],
     ['delta', 'draw', '4.47'],
     ['kilo', 'away', '4.69'],
     ['bravo', 'away', '4.85'],
     ['bravo', 'home', '1.81']],
    9999),
   ['arb', [['away', 'bravo', 2098], ['draw', 'delta', 2277], ['home', 'bravo', 5623]], 177])],
 [('control two-way arb',
   ([['alpha', 'home', '2.10'], ['bravo', 'away', '2.10'], ['bravo', 'home', '1.90']], 10000),
   ['arb', [['away', 'bravo', 5000], ['home', 'alpha', 5000]], 500]),
  ('boundary exactly fair book',
   ([['alpha', 'home', '2.00'], ['bravo', 'away', '2.00']], 10000),
   ['no arb']),
  ('boundary tie goes to first name',
   ([['kilo', 'home', '2.20'], ['alpha', 'home', '2.20'], ['bravo', 'away', '2.20']], 10000),
   ['arb', [['away', 'bravo', 5000], ['home', 'alpha', 5000]], 1000]),
  ('control no arb', ([['alpha', 'home', '1.90'], ['alpha', 'away', '1.90']], 10000), ['no arb']),
  ('regression: stake proportion',
   ([['alpha', 'home', '4.00'],
     ['delta', 'home', '4.38'],
     ['bravo', 'home', '4.21'],
     ['kilo', 'draw', '1.87'],
     ['bravo', 'draw', '1.93'],
     ['delta', 'draw', '1.87'],
     ['bravo', 'away', '3.76'],
     ['kilo', 'away', '4.13'],
     ['delta', 'away', '4.11']],
    25000),
   ['arb', [['away', 'kilo', 6123], ['draw', 'bravo', 13103], ['home', 'delta', 5773]], 286]),
  ('variant scenario 1',
   ([['bravo', 'home', '3.11'],
     ['delta', 'home', '3.18'],
     ['delta', 'draw', '4.37'],
     ['bravo', 'draw', '4.52'],
     ['kilo', 'draw', '4.14'],
     ['bravo', 'away', '2.15']],
    25000),
   ['no arb']),
  ('variant scenario 2',
   ([['alpha', 'home', '2.53'],
     ['delta', 'home', '2.41'],
     ['kilo', 'home', '2.24'],
     ['bravo', 'away', '1.78'],
     ['delta', 'away', '1.55']],
    25000),
   ['arb', [['away', 'bravo', 14675], ['home', 'alpha', 10324]], 1120])],
 [('control two-way arb',
   ([['alpha', 'home', '2.10'], ['bravo', 'away', '2.10'], ['bravo', 'home', '1.90']], 10000),
   ['arb', [['away', 'bravo', 5000], ['home', 'alpha', 5000]], 500]),
  ('boundary exactly fair book',
   ([['alpha', 'home', '2.00'], ['bravo', 'away', '2.00']], 10000),
   ['no arb']),
  ('boundary tie goes to first name',
   ([['kilo', 'home', '2.20'], ['alpha', 'home', '2.20'], ['bravo', 'away', '2.20']], 10000),
   ['arb', [['away', 'bravo', 5000], ['home', 'alpha', 5000]], 1000]),
  ('control no arb', ([['alpha', 'home', '1.90'], ['alpha', 'away', '1.90']], 10000), ['no arb']),
  ('regression: stake proportion',
   ([['bravo', 'home', '2.35'],
     ['kilo', 'home', '2.21'],
     ['delta', 'home', '2.23'],
     ['kilo', 'draw', '2.92'],
     ['bravo', 'draw', '3.06'],
     ['alpha', 'draw', '2.87'],
     ['delta', 'away', '4.09'],
     ['bravo', 'away', '4.25'],
     ['alpha', 'away', '4.23']],
    10000),
   ['arb', [['away', 'bravo', 2382], ['draw', 'bravo', 3308], ['home', 'bravo', 4308]], 124]),
  ('variant scenario 1',
   ([['delta', 'home', '1.77'],
     ['alpha', 'home', '1.75'],
     ['bravo', 'home', '1.66'],
     ['bravo', 'away', '2.34'],
     ['kilo', 'away', '2.44'],
     ['delta', 'away', '2.39']],
    9999),
   ['arb', [['away', 'kilo', 4203], ['home', 'delta', 5795]], 257]),
  ('variant scenario 2',
   ([['delta', 'home', '1.88'],
     ['alpha', 'home', '2.19'],
     ['bravo', 'home', '2.04'],
     ['kilo', 'draw', '5.15'],
     ['alpha', 'away', '2.93']],
    10000),
   ['arb', [['away', 'alpha', 3440], ['draw', 'kilo', 1957], ['home', 'alpha', 4602]], 79])],
 [('control two-way arb',
   ([['alpha', 'home', '2.10'], ['bravo', 'away', '2.10'], ['bravo', 'home', '1.90']], 10000),
   ['arb', [['away', 'bravo', 5000], ['home', 'alpha', 5000]], 500]),
  ('boundary exactly fair book',
   ([['alpha', 'home', '2.00'], ['bravo', 'away', '2.00']], 10000),
   ['no arb']),
  ('boundary tie goes to first name',
   ([['kilo', 'home', '2.20'], ['alpha', 'home', '2.20'], ['bravo', 'away', '2.20']], 10000),
   ['arb', [['away', 'bravo', 5000], ['home', 'alpha', 5000]], 1000]),
  ('control no arb', ([['alpha', 'home', '1.90'], ['alpha', 'away', '1.90']], 10000), ['no arb']),
  ('regression: stake proportion',
   ([['kilo', 'home', '2.14'],
     ['bravo', 'home', '2.12'],
     ['alpha', 'home', '1.97'],
     ['delta', 'away', '1.68'],
     ['bravo', 'away', '1.77'],
     ['kilo', 'away', '1.89']],
    25000),
   ['arb', [['away', 'kilo', 13275], ['home', 'kilo', 11724]], 90]),
  ('variant scenario 1',
   ([['alpha', 'home', '2.52'],
     ['bravo', 'home', '2.60'],
     ['delta', 'draw', '2.13'],
     ['kilo', 'away', '4.85'],
     ['alpha', 'away', '4.61']],
    10000),
   ['no arb']),
  ('variant scenario 2',
   ([['bravo', 'home', '2.64'],
     ['kilo', 'home', '2.42'],
     ['delta', 'home', '2.49'],
     ['bravo', 'away', '1.55']],
    25000),
   ['no arb'])]]
for label, args, expected in cases[N - 1]:
    check(label, run(args), expected)
print(json.dumps({"observations": observations, "passed": all(x["passed"] for x in observations)}, ensure_ascii=False))
raise SystemExit(0 if all(x["passed"] for x in observations) else 1)
Boundary fixtureActualExpectedOutcome
control two-way arb['arb', [['away', 'bravo', 5000], ['home', 'alpha', 5000]], 500]['arb', [['away', 'bravo', 5000], ['home', 'alpha', 5000]], 500]Passed
boundary exactly fair book['no arb']['no arb']Passed
boundary tie goes to first name['arb', [['away', 'bravo', 5000], ['home', 'alpha', 5000]], 1000]['arb', [['away', 'bravo', 5000], ['home', 'alpha', 5000]], 1000]Passed
control no arb['no arb']['no arb']Passed
regression: stake proportion['arb', [['away', 'alpha', 5000], ['home', 'kilo', 5000]], -1150]['arb', [['away', 'alpha', 4338], ['home', 'kilo', 5661]], 20]Failed
variant scenario 1['arb', [['away', 'alpha', 3333], ['draw', 'kilo', 3333], ['home', 'bravo', 3333]], -800]['arb', [['away', 'alpha', 3176], ['draw', 'kilo', 3810], ['home', 'bravo', 3013]], 513]Failed
variant scenario 2['arb', [['away', 'delta', 3333], ['draw', 'delta', 3333], ['home', 'kilo', 3333]], -667]['arb', [['away', 'delta', 2702], ['draw', 'delta', 3572], ['home', 'kilo', 3725]], 430]Failed

SHA-256 / 0fc3b084115ae606d74a2e9d987b5d7469fc24e2e5f50d0a0eeb775f67f1bc0f

3 / The verified repair

Exit 0
"""Failure Map reference implementation. Python standard library only."""
import json
from fractions import Fraction
import math
N = 1
observations = []
def solve(books, total_cents):
    best = {}
    for book, outcome, price in books:
        d = Fraction(price)
        cur = best.get(outcome)
        if cur is None or d > cur[0] or (d == cur[0] and book < cur[1]):
            best[outcome] = (d, book)
    S = sum(1 / d for d, _ in best.values())
    if S >= 1:
        return ['no arb']
    rows = []
    ret = None
    for outcome in sorted(best):
        d, book = best[outcome]
        stake = math.floor(total_cents * (1 / d) / S)
        rows.append([outcome, book, stake])
        r = math.floor(stake * d)
        ret = r if ret is None else min(ret, r)
    return ['arb', rows, ret - sum(r[2] for r in rows)]
def check(label, actual, expected):
    observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
def run(args):
    try:
        return solve(*args)
    except Exception as exc:
        return 'raised ' + type(exc).__name__
cases = [[('control two-way arb',
   ([['alpha', 'home', '2.10'], ['bravo', 'away', '2.10'], ['bravo', 'home', '1.90']], 10000),
   ['arb', [['away', 'bravo', 5000], ['home', 'alpha', 5000]], 500]),
  ('boundary exactly fair book',
   ([['alpha', 'home', '2.00'], ['bravo', 'away', '2.00']], 10000),
   ['no arb']),
  ('boundary tie goes to first name',
   ([['kilo', 'home', '2.20'], ['alpha', 'home', '2.20'], ['bravo', 'away', '2.20']], 10000),
   ['arb', [['away', 'bravo', 5000], ['home', 'alpha', 5000]], 1000]),
  ('control no arb', ([['alpha', 'home', '1.90'], ['alpha', 'away', '1.90']], 10000), ['no arb']),
  ('regression: stake proportion',
   ([['kilo', 'home', '1.77'], ['bravo', 'home', '1.70'], ['alpha', 'away', '2.31']], 10000),
   ['arb', [['away', 'alpha', 4338], ['home', 'kilo', 5661]], 20]),
  ('variant scenario 1',
   ([['alpha', 'home', '3.03'],
     ['kilo', 'home', '3.37'],
     ['bravo', 'home', '3.49'],
     ['alpha', 'draw', '2.44'],
     ['kilo', 'draw', '2.76'],
     ['bravo', 'away', '3.15'],
     ['alpha', 'away', '3.31'],
     ['bravo', 'home', '3.03']],
    10000),
   ['arb', [['away', 'alpha', 3176], ['draw', 'kilo', 3810], ['home', 'bravo', 3013]], 513]),
  ('variant scenario 2',
   ([['kilo', 'home', '2.80'],
     ['delta', 'draw', '2.92'],
     ['alpha', 'draw', '2.54'],
     ['kilo', 'draw', '2.85'],
     ['kilo', 'away', '3.32'],
     ['delta', 'away', '3.86'],
     ['alpha', 'away', '3.71']],
    10000),
   ['arb', [['away', 'delta', 2702], ['draw', 'delta', 3572], ['home', 'kilo', 3725]], 430])],
 [('control two-way arb',
   ([['alpha', 'home', '2.10'], ['bravo', 'away', '2.10'], ['bravo', 'home', '1.90']], 10000),
   ['arb', [['away', 'bravo', 5000], ['home', 'alpha', 5000]], 500]),
  ('boundary exactly fair book',
   ([['alpha', 'home', '2.00'], ['bravo', 'away', '2.00']], 10000),
   ['no arb']),
  ('boundary tie goes to first name',
   ([['kilo', 'home', '2.20'], ['alpha', 'home', '2.20'], ['bravo', 'away', '2.20']], 10000),
   ['arb', [['away', 'bravo', 5000], ['home', 'alpha', 5000]], 1000]),
  ('control no arb', ([['alpha', 'home', '1.90'], ['alpha', 'away', '1.90']], 10000), ['no arb']),
  ('regression: stake proportion',
   ([['bravo', 'home', '2.41'],
     ['delta', 'home', '2.58'],
     ['delta', 'away', '1.71'],
     ['kilo', 'away', '1.73'],
     ['alpha', 'home', '2.41']],
    25000),
   ['arb', [['away', 'kilo', 14965], ['home', 'delta', 10034]], 888]),
  ('variant scenario 1',
   ([['alpha', 'home', '2.55'],
     ['bravo', 'home', '2.43'],
     ['bravo', 'draw', '3.12'],
     ['alpha', 'away', '3.68'],
     ['delta', 'away', '4.14'],
     ['kilo', 'away', '4.12']],
    25000),
   ['arb', [['away', 'delta', 6328], ['draw', 'bravo', 8397], ['home', 'alpha', 10274]], 1198]),
  ('variant scenario 2',
   ([['bravo', 'home', '1.81'],
     ['delta', 'draw', '4.47'],
     ['kilo', 'away', '4.69'],
     ['bravo', 'away', '4.85'],
     ['bravo', 'home', '1.81']],
    9999),
   ['arb', [['away', 'bravo', 2098], ['draw', 'delta', 2277], ['home', 'bravo', 5623]], 177])],
 [('control two-way arb',
   ([['alpha', 'home', '2.10'], ['bravo', 'away', '2.10'], ['bravo', 'home', '1.90']], 10000),
   ['arb', [['away', 'bravo', 5000], ['home', 'alpha', 5000]], 500]),
  ('boundary exactly fair book',
   ([['alpha', 'home', '2.00'], ['bravo', 'away', '2.00']], 10000),
   ['no arb']),
  ('boundary tie goes to first name',
   ([['kilo', 'home', '2.20'], ['alpha', 'home', '2.20'], ['bravo', 'away', '2.20']], 10000),
   ['arb', [['away', 'bravo', 5000], ['home', 'alpha', 5000]], 1000]),
  ('control no arb', ([['alpha', 'home', '1.90'], ['alpha', 'away', '1.90']], 10000), ['no arb']),
  ('regression: stake proportion',
   ([['alpha', 'home', '4.00'],
     ['delta', 'home', '4.38'],
     ['bravo', 'home', '4.21'],
     ['kilo', 'draw', '1.87'],
     ['bravo', 'draw', '1.93'],
     ['delta', 'draw', '1.87'],
     ['bravo', 'away', '3.76'],
     ['kilo', 'away', '4.13'],
     ['delta', 'away', '4.11']],
    25000),
   ['arb', [['away', 'kilo', 6123], ['draw', 'bravo', 13103], ['home', 'delta', 5773]], 286]),
  ('variant scenario 1',
   ([['bravo', 'home', '3.11'],
     ['delta', 'home', '3.18'],
     ['delta', 'draw', '4.37'],
     ['bravo', 'draw', '4.52'],
     ['kilo', 'draw', '4.14'],
     ['bravo', 'away', '2.15']],
    25000),
   ['no arb']),
  ('variant scenario 2',
   ([['alpha', 'home', '2.53'],
     ['delta', 'home', '2.41'],
     ['kilo', 'home', '2.24'],
     ['bravo', 'away', '1.78'],
     ['delta', 'away', '1.55']],
    25000),
   ['arb', [['away', 'bravo', 14675], ['home', 'alpha', 10324]], 1120])],
 [('control two-way arb',
   ([['alpha', 'home', '2.10'], ['bravo', 'away', '2.10'], ['bravo', 'home', '1.90']], 10000),
   ['arb', [['away', 'bravo', 5000], ['home', 'alpha', 5000]], 500]),
  ('boundary exactly fair book',
   ([['alpha', 'home', '2.00'], ['bravo', 'away', '2.00']], 10000),
   ['no arb']),
  ('boundary tie goes to first name',
   ([['kilo', 'home', '2.20'], ['alpha', 'home', '2.20'], ['bravo', 'away', '2.20']], 10000),
   ['arb', [['away', 'bravo', 5000], ['home', 'alpha', 5000]], 1000]),
  ('control no arb', ([['alpha', 'home', '1.90'], ['alpha', 'away', '1.90']], 10000), ['no arb']),
  ('regression: stake proportion',
   ([['bravo', 'home', '2.35'],
     ['kilo', 'home', '2.21'],
     ['delta', 'home', '2.23'],
     ['kilo', 'draw', '2.92'],
     ['bravo', 'draw', '3.06'],
     ['alpha', 'draw', '2.87'],
     ['delta', 'away', '4.09'],
     ['bravo', 'away', '4.25'],
     ['alpha', 'away', '4.23']],
    10000),
   ['arb', [['away', 'bravo', 2382], ['draw', 'bravo', 3308], ['home', 'bravo', 4308]], 124]),
  ('variant scenario 1',
   ([['delta', 'home', '1.77'],
     ['alpha', 'home', '1.75'],
     ['bravo', 'home', '1.66'],
     ['bravo', 'away', '2.34'],
     ['kilo', 'away', '2.44'],
     ['delta', 'away', '2.39']],
    9999),
   ['arb', [['away', 'kilo', 4203], ['home', 'delta', 5795]], 257]),
  ('variant scenario 2',
   ([['delta', 'home', '1.88'],
     ['alpha', 'home', '2.19'],
     ['bravo', 'home', '2.04'],
     ['kilo', 'draw', '5.15'],
     ['alpha', 'away', '2.93']],
    10000),
   ['arb', [['away', 'alpha', 3440], ['draw', 'kilo', 1957], ['home', 'alpha', 4602]], 79])],
 [('control two-way arb',
   ([['alpha', 'home', '2.10'], ['bravo', 'away', '2.10'], ['bravo', 'home', '1.90']], 10000),
   ['arb', [['away', 'bravo', 5000], ['home', 'alpha', 5000]], 500]),
  ('boundary exactly fair book',
   ([['alpha', 'home', '2.00'], ['bravo', 'away', '2.00']], 10000),
   ['no arb']),
  ('boundary tie goes to first name',
   ([['kilo', 'home', '2.20'], ['alpha', 'home', '2.20'], ['bravo', 'away', '2.20']], 10000),
   ['arb', [['away', 'bravo', 5000], ['home', 'alpha', 5000]], 1000]),
  ('control no arb', ([['alpha', 'home', '1.90'], ['alpha', 'away', '1.90']], 10000), ['no arb']),
  ('regression: stake proportion',
   ([['kilo', 'home', '2.14'],
     ['bravo', 'home', '2.12'],
     ['alpha', 'home', '1.97'],
     ['delta', 'away', '1.68'],
     ['bravo', 'away', '1.77'],
     ['kilo', 'away', '1.89']],
    25000),
   ['arb', [['away', 'kilo', 13275], ['home', 'kilo', 11724]], 90]),
  ('variant scenario 1',
   ([['alpha', 'home', '2.52'],
     ['bravo', 'home', '2.60'],
     ['delta', 'draw', '2.13'],
     ['kilo', 'away', '4.85'],
     ['alpha', 'away', '4.61']],
    10000),
   ['no arb']),
  ('variant scenario 2',
   ([['bravo', 'home', '2.64'],
     ['kilo', 'home', '2.42'],
     ['delta', 'home', '2.49'],
     ['bravo', 'away', '1.55']],
    25000),
   ['no arb'])]]
for label, args, expected in cases[N - 1]:
    check(label, run(args), expected)
print(json.dumps({"observations": observations, "passed": all(x["passed"] for x in observations)}, ensure_ascii=False))
raise SystemExit(0 if all(x["passed"] for x in observations) else 1)
Boundary fixtureActualExpectedOutcome
control two-way arb['arb', [['away', 'bravo', 5000], ['home', 'alpha', 5000]], 500]['arb', [['away', 'bravo', 5000], ['home', 'alpha', 5000]], 500]Passed
boundary exactly fair book['no arb']['no arb']Passed
boundary tie goes to first name['arb', [['away', 'bravo', 5000], ['home', 'alpha', 5000]], 1000]['arb', [['away', 'bravo', 5000], ['home', 'alpha', 5000]], 1000]Passed
control no arb['no arb']['no arb']Passed
regression: stake proportion['arb', [['away', 'alpha', 4338], ['home', 'kilo', 5661]], 20]['arb', [['away', 'alpha', 4338], ['home', 'kilo', 5661]], 20]Passed
variant scenario 1['arb', [['away', 'alpha', 3176], ['draw', 'kilo', 3810], ['home', 'bravo', 3013]], 513]['arb', [['away', 'alpha', 3176], ['draw', 'kilo', 3810], ['home', 'bravo', 3013]], 513]Passed
variant scenario 2['arb', [['away', 'delta', 2702], ['draw', 'delta', 3572], ['home', 'kilo', 3725]], 430]['arb', [['away', 'delta', 2702], ['draw', 'delta', 3572], ['home', 'kilo', 3725]], 430]Passed

SHA-256 / c3996610ad7cf6a87a0ae82c65b7ad40a5e737af544c0288912c54e88ceb1b6a

Verification & scope

Stipulated, bounded toy contract stated in the contract field; not a claim of conformance with any operator, exchange or regulator rule set. This reproducer isolates one failure mechanism. Results cover the supplied fixtures. Variants within a family share a test contract and should remain grouped when constructing evaluation splits. Related mechanisms with a shared evaluation_group must also remain together; these controlled models are not independent production incidents.

Observations recorded using Python 3.12.14 at 2026-09-29T14:50:32.463511+00:00.

Case digest / 704199cee0981df791aa1c1636081809f1c3cd8cc571ac7a2341f6151f187b4f