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.
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 fixture | Actual | Expected | Outcome |
|---|---|---|---|
| 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 fixture | Actual | Expected | Outcome |
|---|---|---|---|
| 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 fixture | Actual | Expected | Outcome |
|---|---|---|---|
| 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