consensus-fair-line draft
Combining multiple books' devigged lines into a single consensus fair probability
- Tags
- odds consensus aggregation fair-line multi-book
- Vocabulary
- consensus_fair_line
- A single implied probability per outcome, aggregated across multiple books' devigged lines. The 'market's collective belief' about the outcome.
- weighting
- How much each book's contribution counts in the average — equal, volume-, recency-, or quality-weighted.
- prob_space_average
- Averaging in implied-probability space (then converting back to American), rather than averaging American-odds integers directly. The probability-space average is the canonical one.
- sharp_book
- A book whose prices are considered to reflect the true market — typically Pinnacle, Circa, Bookmaker. Contrast with 'soft book.'
- soft_book
- A book whose prices may lag or be biased relative to sharp books — typically mass-market US retail books. They take recreational action and price for that audience.
A consensus fair line is a single estimate of an outcome's probability, built by combining devigged lines from multiple books. The reasoning is straightforward: no single book is perfectly accurate, books disagree on the margin, and averaging multiple independent estimates reduces noise. The output is an implied probability per outcome (or its American-odds equivalent), treated as the market's best collective belief.
The mechanics are simple in principle: devig each book individually (see devigging), then aggregate. Subtleties show up in how you weight the books, which books you include, and how you average — averaging in implied-probability space and converting back is not the same as averaging American-odds integers directly, and the latter is wrong.
Kairos's kairos/core/spread_mba.py implements one concrete instance of this idea via the helper _avg_american_via_prob: convert each book's American odds to implied probability, take the arithmetic mean of those probabilities, then convert the average back to American. That is the canonical "average in probability space" pattern. The function operates over a configured list of sharp books (ODDSENGINE_MBA_AVG_BOOK_KEYS), giving each included book equal weight in the average. This is a simple, equal-weighted, sharp-book-only consensus — not the only design, but a reasonable one.
The plain consensus-fair-line covered here differs from MBA (vf-and-mba-targets): MBA is the cross-book average of customer-facing prices used to derive evaluation targets, including a spread-market construction that converts each book's odds to a common target line before averaging (the line-shopping problem where Book X has the spread at −3.5 and Book Y has it at −4). Consensus-fair-line is the simpler related concept where every included book is already quoting the same outcome and you want the market's collective devigged belief.
Weighting strategies
- Equal weighting. Every included book counts the same. Simple, robust, and what Kairos's
_avg_american_via_probdoes. Defensible when you've already filtered to a curated sharp-book list. - Volume-weighted. More liquid books carry more weight. Closer to a true market consensus when liquidity is heterogeneous, but requires reliable volume data and is sensitive to volume spikes (e.g. one news event briefly inflating one book's volume).
- Recency-weighted. Newer prices count more. Important in fast-moving markets (in-play, news-driven). Requires per-quote timestamps and a chosen decay function.
- Quality-weighted. Sharp books (Pinnacle, Circa, Bookmaker, etc.) get more weight than soft books (mass-market US books). Effectively what Kairos does by filtering to sharp books rather than weighting; an alternative is to include all books with a quality coefficient.
Worked example
Three sharp books quote a market for outcome A. We've devigged each (probit, per devigging). Their fair probabilities for A:
- Book 1: 0.520
- Book 2: 0.540
- Book 3: 0.530
Equal-weighted consensus: (0.520 + 0.540 + 0.530) / 3 = 0.5300
This is the Kairos _avg_american_via_prob pattern: arithmetic mean of probabilities, then the equivalent American odds (here ≈ −113) follows from american_from_prob(0.5300).
Volume-weighted consensus (hypothetical volumes 100, 50, 200):
- Total volume = 350
- Weighted sum = 0.520 × (100/350) + 0.540 × (50/350) + 0.530 × (200/350)
- = 0.520 × 0.2857 + 0.540 × 0.1429 + 0.530 × 0.5714
- ≈ 0.1486 + 0.0771 + 0.3029
- = 0.5286
Volume-weighting pulls the answer toward Book 3 (most liquid). The shift is small here because the books already agreed closely; for divergent prices the weighting matters more.
Why average in probability space, not American-odds space: even when all books quote on the same side of the ±100 line, arithmetic-averaging American integers gives a different answer than averaging probabilities and converting back, because American odds aren't linear in probability. If the three books above quoted −108 / −117 / −113, averaging the integers gives −112.7, while the probability-space average yields −113. The discrepancy grows with the spread between books. The probability-space average is the canonical one. Worse: when the books straddle ±100 (one at +110, another at −110), arithmetic-averaging American odds is meaningless outright — see the Gotchas below.
Gotchas
- Garbage in, garbage out. Including a soft book with a known bias — say one that consistently shades favorites — pollutes the consensus. The consensus reflects the books you choose; if any of them are systematically wrong, so is the output. Kairos's choice to filter to a curated sharp-book list is itself a quality decision.
- Average in probability space, not in American-odds space.
_avg_american_via_probexists because the naive alternative is wrong. Averaging+150and−150directly gives0, which is meaningless; averaging the implied probabilities (0.40 and 0.60) gives 0.50, which is the correct neutral midpoint. - Selection bias. "Which books?" is itself a prior. A consensus across only Pinnacle clones tells you what sharps think; a consensus across only US retail books tells you something quite different. State the universe.
- Time mismatch. Combining a 30-second-old Pinnacle line with a 10-minute-old Circa line during a live game produces a meaningless number — the older quote no longer reflects current information. Either freshness-filter or recency-weight.
- Devig method consistency. Apply the same devig method (probit, per
devigging) to every book before aggregating. Mixing methods across books bakes methodological noise into the consensus. - Equal-weight isn't neutral when sample sizes differ. If you have 10 sharp books and only 3 of them are currently posting a number, the equal-weight average over those 3 is doing more work than it looks. Consider whether a missing-book is missing because it's stale or because the market is genuinely unavailable there.
Open questions
- Kairos's
_avg_american_via_probaverages vigged American odds (it's called frommba_at_target_line, which works on per-book lines that may or may not be devigged depending on how the caller prepared them). The plan describes consensus as combining devigged lines. Confirm whether the canonical Mimir definition of consensus-fair-line should mandate prior devigging, or allow consensus-of-vigged-lines as a valid (if cruder) variant. - Kairos uses an arithmetic mean of probabilities. Geometric means and median-based aggregation are also defensible; the user should confirm which Mimir treats as canonical.
- The relationship between consensus-fair-line and MBA (
mba-consensus) is real but the boundary deserves a clean statement — MBA is line-aware (it converts to a target line first), consensus-fair-line is line-naive (assumes every book is quoting the same outcome). Confirm this is the right framing. - Kairos hard-codes a sharp-book list (
ODDSENGINE_MBA_AVG_BOOK_KEYS); volume-weighted and recency-weighted variants are not implemented. Consumers building real-time pricing may need them — open question whether Mimir documents only what Kairos does, or also surfaces these as known-but-not-implemented options.