Methodology: How the Fair Line Is Built

Teacher’s Bet builds a fair line by taking one price from each qualifying venue, removing that venue’s margin, pooling the results in log-odds, and grading every venue against a benchmark that excludes it. Every fair line is published with the number of venues behind it, so a thin market is visible as a thin market rather than dressed up as a consensus.

This page is the specification. It names every estimator, gives the formula, and shows the arithmetic on real numbers, so a disputed figure can be reproduced by hand or against the published library. The site’s claim is not that these choices are the only defensible ones. It is that they are stated, and that the number you see came from them.

The pipeline, in order

  1. Extract one price per venue. Microprice on an order book, posted two-way moneyline on a book.
  2. Remove the margin. De-vig each venue independently — proportional, power or Shin.
  3. Correct for favorite–longshot bias. The power exponent shades longshots down.
  4. Pool in log-odds. A logarithmic opinion pool, not an average of probabilities.
  5. Weight each venue. A cold-start tier plus two measured quality terms today; fitted calibration weights as the record accumulates.
  6. Discount correlated venues. Arbitrage-linked venues are not independent opinions.
  7. Grade leave-one-out. A venue is never measured against a benchmark it helped set.
  8. Gate on quality, and publish the count. Too few venues, or too much disagreement, and that is shown rather than smoothed away.

Steps 1–4 are ordinary published statistics and are documented in full below. Step 5’s fitted per-venue multipliers and step 6’s measured correlation structure are the one thing this site will keep private once they are fitted — see what is not published. The cold-start weighting that runs in their place today is published in full, formula and constants, in step 5.

Step 1 — The price taken from each venue

An exchange quotes a two-sided book, not one number. The naive summary is the mid, halfway between best bid and best ask, and it throws away the most informative thing on the screen: how much size is resting on each side. The microprice keeps it.

microprice=bid×Qask+ask×QbidQbid+Qask\text{microprice} = \dfrac{\text{bid} \times Q_{\text{ask}} + \text{ask} \times Q_{\text{bid}}}{Q_{\text{bid}} + Q_{\text{ask}}}

where:

Note the crossing of the subscripts: the bid is weighted by the size on the ask side. That is what makes the estimator lean toward the thinner half of the book — the half that clears first, and so the direction the price is about to move.[5]

Worked example: microprice vs. mid

400 contracts bid at 0.62;1,200 offered at 0.63\text{400 contracts bid at } 0.62; \quad 1{,}200 \text{ offered at } 0.63
mid=12(0.62+0.63)=0.625\text{mid} = \tfrac{1}{2}(0.62 + 0.63) = 0.625
microprice=0.62×1200+0.63×400400+1200=744+2521600=0.6225\text{microprice} = \frac{0.62 \times 1200 + 0.63 \times 400}{400 + 1200} = \frac{744 + 252}{1600} = 0.6225
A quarter of a cent apart, and the sign is the point: the bid side is thin, so the microprice sits below the mid. Over a season of grading, a summary that ignores depth is biased, not merely noisy.

On a binary exchange the two half-books have to be reconciled before any of this applies. Buying NO at qq is selling YES at 1q1-q, so the YES ask is one minus the best NO bid. If either half-book is empty, or the derived ask sits at or below the bid, the venue is not quoted at all — a crossed book is a data error, and a data error is not a price.

A sportsbook has no order book. Its posted two-way moneyline is the price, and step 2 does the work instead.

Step 2 — Removing the margin

A posted two-way line implies two probabilities that sum to more than 1. The excess is the venue’s margin, the vig. De-vigging is the arithmetic that removes it.

qA+qB=1+overround,q={100100+mm>0m100mm<0q_A + q_B = 1 + \text{overround}, \qquad q = \begin{cases} \dfrac{100}{100 + m} & m > 0 \\ \dfrac{-m}{100 - m} & m < 0 \end{cases}

where mm is the American moneyline and qq the vig-inclusive implied probability. Three methods split the overround differently, and they are not interchangeable.

Proportional

pi=qiqA+qBp_i = \dfrac{q_i}{q_A + q_B}

Divides the excess in proportion to each side’s implied probability. It is the baseline: one line of arithmetic, no parameters, and it is what most calculators mean by “no-vig.” It also assumes the margin is spread evenly across the price scale, which is empirically false.

Power

pi=qik,k solving   qAk+qBk=1p_i = q_i^{\,k}, \qquad k \text{ solving } \; q_A^{\,k} + q_B^{\,k} = 1

Raises both implied probabilities to a common exponent k1k \ge 1 found by bisection. Because raising a number below 1 to a power greater than 1 shrinks the small one proportionally harder, the power method takes more away from the longshot than from the favorite. That matches the direction of the observed favorite–longshot bias.[3][4] This is the method behind the pooled fair line on the board.

Shin

pi=z2+4(1z)qi2/sz2(1z),s=qA+qBp_i = \dfrac{\sqrt{z^2 + 4(1-z)\,q_i^2 / s} - z}{2(1-z)}, \qquad s = q_A + q_B

Shin’s model treats the margin as the venue’s defence against a fraction zz of informed money, and solves for the zz that makes the fair probabilities sum to 1.[1][2] It is the right tool when the question is specifically how much of this price is insider protection — a thin market, an injury rumour, an early number.

Worked example: the same line, three methods

Posted: 150/+130    qA=0.6000,  qB=0.4348\text{Posted: } -150 \,/\, +130 \;\Rightarrow\; q_A = 0.6000,\; q_B = 0.4348
overround=0.6000+0.43481=3.478%\text{overround} = 0.6000 + 0.4348 - 1 = 3.478\%
proportional: pA=57.98%    (fair 138.0)\text{proportional: } p_A = 57.98\% \;\;(\text{fair } -138.0)
power (k=1.0530)pA=58.40%    (fair 140.4)\text{power } (k = 1.0530)\text{: } p_A = 58.40\% \;\;(\text{fair } -140.4)
Shin (z=0.0348)pA=58.26%    (fair 139.6)\text{Shin } (z = 0.0348)\text{: } p_A = 58.26\% \;\;(\text{fair } -139.6)
Four-tenths of a probability point between the extremes on a 3.5% hold. That gap is not rounding — it is the whole disagreement about who pays the margin, and it grows with the overround and with the length of the price.

The spread between the three methods is retained per venue as a data-quality signal. A line the three methods agree about is a clean two-way price. A line they disagree about is usually mis-paired, mis-timed or mistyped, and it earns less weight in the pool. Run any of the three yourself on the no-vig calculator; the long walkthrough is how to de-vig odds.

Step 3 — Favorite–longshot calibration

Longshots are systematically overpriced and favorites underpriced, across parimutuel pools, sportsbooks and event-contract exchanges alike.[3][4] A price of 5¢ on a binary contract wins less often than 5% of the time, and after fees the gap widens further, because the fee is a larger share of the money at risk at the tails (see fair value is not break-even).

Two consequences for this pipeline. First, the power exponent in step 2 is the mechanism that applies the correction, and it is why the power method rather than the proportional one is what feeds the pool. Second, no venue is treated as an unbiased oracle. An exchange price is money at risk, which makes it informative; it does not make it calibrated.

The exponent used on the board today is the one that makes each venue’s two sides sum to 1 — a per-line solve, not a fitted seasonal constant. Fitting kk against settled markets requires a settled-market archive; that archive is being written now and does not yet move the published line. See what runs today. Saying so is cheaper than being caught claiming otherwise.

Step 4 — Pooling in log-odds

Several venues, one number. Averaging their probabilities is the wrong arithmetic: probability is a bounded scale and a linear average of forecasts is provably underconfident, drifting toward the middle.[6] The pool runs in log-odds.

zi=ln ⁣pi1pi,zˉ=iwiziiwi,pA=11+ezˉz_i = \ln\!\dfrac{p_i}{1 - p_i}, \qquad \bar{z} = \dfrac{\sum_i w_i z_i}{\sum_i w_i}, \qquad p_A = \dfrac{1}{1 + e^{-\bar{z}}}

where pip_i is venue ii’s de-vigged probability for side A, wiw_i its weight, and pAp_A the published fair probability. Side B is 1pA1 - p_A by construction, so the published line carries exactly zero vig — a property the arithmetic guarantees rather than something rounded into place.

Exponentiate and the sum becomes a product: the pooled odds ratio is a weighted geometric mean of the venues’ odds ratios. That is also why duplicate feeds are so damaging — a copied line is the same factor repeated, one opinion wearing several exponents.

Worked example: log-odds pool vs. plain average

Three venues, de-vigged: 82%,  88%,  91%\text{Three venues, de-vigged: } 82\%,\; 88\%,\; 91\%
z=1.5163,  1.9924,  2.3136    zˉ=1.9408z = 1.5163,\; 1.9924,\; 2.3136 \;\Rightarrow\; \bar{z} = 1.9408
pA=11+e1.9408=87.44%    (fair 696)p_A = \dfrac{1}{1 + e^{-1.9408}} = 87.44\% \;\;(\text{fair } -696)
plain probability average=87.00%    (fair 669)\text{plain probability average} = 87.00\% \;\;(\text{fair } -669)
Equal weights, for illustration only. Same three inputs, 27 points of American price apart. On short prices the odds scale and the probability scale stop agreeing, and the pool has to run on the one where the arithmetic is additive.

Step 5 — Weights

The intended end state is that sharpness is treated as a property of a market at a moment rather than of a brand. That is not yet what runs. Today a venue starts from a hardcoded cold-start tier, and since that tier is the single largest factor in the shipped weight, it is printed here in full rather than described in the abstract. What is true unconditionally is that no venue can buy weight: there are no commercial relationships with any venue, no paid placement and no affiliate links anywhere on this site.

The weight that runs today is:

wi  =  ti×(Orefvi+Ofloor) ⁣γ×eκdiw_i \;=\; t_i \times \left(\dfrac{O_{\text{ref}}}{v_i + O_{\text{floor}}}\right)^{\!\gamma} \times e^{-\kappa\,d_i}

where:

Those constants are worth reading as numbers. The margin term spans about 0.78 to 1.19 across the range of holds a real book posts (a 5% hold scores 0.7765, a 2% hold 0.9457, a 0.5% hold 1.1892), against a tier term that spans 1.0 to 2.0 — so margin is compressed relative to the tier, but it is a genuine factor rather than a tie-breaker. The disagreement term is near 1 for a clean line (0.967 on the −150 / +130 example above) and falls to 0.67 once the three methods differ by 5 probability points, which is the intended behaviour: an ambiguous line is discounted rather than trusted at face value. A tier at or above 1.5 also marks a venue as the pool’s anchor, which is what the outlier clip in step 8 is centred on and what the confidence cap in the refusal rules keys off. No single venue, or cluster of duplicated feeds, is allowed more than half the total weight.

The tier is a cold-start prior, not a permanent judgement, and it is precisely the thing the fitted weights are being built to replace. That is the thing that actually matters: measured calibration. Every venue’s closing price is logged and every settled market is harvested, so that each venue can be scored on how well its early price anticipated the close and how well its prices track realised outcomes. Those fitted multipliers are not yet computed and do not yet move the published line — the archive they need is still being written. See what runs today.

The target weight, once the streamed order-book lane drives the board, adds the two observable quantities the shipped formula has no access to — resting size, and time since the venue last moved the price:

wi  =  1spreadi2×ln ⁣(1+depthi)×eΔti/τw_i \;=\; \dfrac{1}{\text{spread}_i^{\,2}} \times \ln\!\left(1 + \text{depth}_i\right) \times e^{-\Delta t_i / \tau}

where spreadi\text{spread}_i is the venue’s quoted spread in probability, depthi\text{depth}_i the size resting at the touch in contracts, Δti\Delta t_i the seconds since the venue last moved this price, and τ\tau the staleness time constant. Neither depth nor a time-decay term is an input to the published weights today. Staleness is currently a binary cut rather than a decay: a venue more than 30 minutes behind the freshest comparable venue is dropped from the signals outright, as described in step 8.

One deliberate limit on the margin term: a thin margin is not evidence of sharpness. Soft books post their tightest holds on exactly the high-volume public games they shade hardest, so a pool weighted mainly by low vig hands the loudest voice to the most shaded prices. That is why γ\gamma is 0.25 rather than 1 — margin is compressed on purpose, not because it is uninformative.

Step 6 — Correlated venues

Two prediction markets on the same event are arbitrage-linked. When one moves, the other follows, because someone is paid to make it follow. Pooling them as independent draws counts one opinion twice and manufactures confidence that is not there.

Two mechanisms are specified; one of them runs today. The one that runs: near-identical lines are collapsed into a single vote before any weighting is computed, so a monoculture of copied feeds cannot inflate the pool, and the effective venue count that drives the confidence read is deflated accordingly rather than counting logos. The one that does not: the residual correlation between venues that are genuinely distinct but arbitrage-linked is to be measured over time and used to discount their combined weight. That measurement needs the same archive as step 5’s fitted weights, and until it is deep enough to trust, only the duplicate collapse is applied. See what runs today.

Step 7 — Leave-one-out grading

This one is a correctness rule, not a refinement. When a venue’s price is graded against a benchmark, the benchmark must be recomputed without that venue.

benchmarki=pool({pj:ji})\text{benchmark}_{-i} = \text{pool}\big(\{\,p_j : j \neq i\,\}\big)

Skip it and every venue is partly measured against itself. Its own price is inside the number it is being compared to, the two are dragged toward each other, and every edge and every closing-line-value grade comes out systematically compressed toward zero. The bias is largest exactly where it matters most: on a thin slate, where one venue is a large share of the pool.

Worked example: what self-inclusion hides

Four venues, de-vigged: 60%,  61%,  62%,  68%\text{Four venues, de-vigged: } 60\%,\; 61\%,\; 62\%,\; 68\%
pool of all four=62.81%    the 68% venue sits 5.19 points off\text{pool of all four} = 62.81\% \;\Rightarrow\; \text{the } 68\% \text{ venue sits } 5.19 \text{ points off}
pool excluding it=61.00%    it sits 7.00 points off\text{pool excluding it} = 61.00\% \;\Rightarrow\; \text{it sits } 7.00 \text{ points off}
Equal weights, for illustration. Including the venue in its own benchmark understates its distance from the market by 1.81 probability points — a third of the measured gap, invented by an arithmetic mistake. Every grade and every edge on this site is computed leave-one-out.

The same rule governs the closing line value grades and the venue-calibration scoring in step 5: a venue’s opening price is scored against a close it did not help set. Where fewer than two venues remain after the exclusion, there is no leave-one-out benchmark to compute and the full-pool number is used instead, rather than a one-venue benchmark being invented. That fallback is not currently flagged in the payload beside the grade, which it should be; the venue count on the row is the signal that it may have applied.

Step 8 — Quality gates, and what happens when the data is thin

The first gate is a roster, not a measurement, and it is stated here for the same reason the tier table is. The signals — the pooled fair line, the +EV flags and the arbitrage check — are built only from a fixed list of venues: DraftKings, FanDuel, BetMGM, Kalshi, LowVig.ag and BetOnline.ag. Every other book on the row is displayed with its price and timestamps but marked reference-only: it cannot vote in the benchmark and is never flagged as an edge. If fewer than two of the roster venues quote a market at all, the fallback is to use every book on the row rather than publish nothing.

Beyond the roster, an exchange quote is excluded when its quoted spread exceeds 6 cents or either half-book is crossed or empty — a crossed book is a data error, and a data error is not a price. The depth floor described in step 1 is specified but not applied: no resting-size test gates a quote today. A venue whose price has frozen while its peers moved — more than 30 minutes behind the freshest comparable soft book — is demoted to reference-only, though that cut no-ops rather than leaving fewer than two voters. A frozen line is not an opportunity, it is a broken feed, and it is how a stale row turns into a phantom arbitrage.

Outliers are handled by a redescending robust weight centred on the pool’s anchor rather than on the crowd’s median. Centre the clip on the crowd and the sharpest price gets “corrected” as the outlier, which is exactly backwards. A venue far enough from the anchor is down-weighted continuously toward zero rather than averaged in — a price that far out of line is almost always a mis-paired, mis-timed or mistyped quote rather than information. Two limits worth stating: the clip engages only once four or more distinct venues are in the pool, and where the pool contains no anchor venue at all the clip falls back to the weighted median — the crowd — which is exactly the case the confidence cap below exists for.

Then the refusal rules. Three of the four run today; the one that matters most does not, and it is written that way here rather than promised:

The refusal rules

  • Fewer than two qualifying venues → not yet a refusal on the published board. One venue is not a consensus, and dressing a single quote up as one is the failure mode this whole page exists to avoid — but as of the review date above, a market quoted by a single venue still publishes a fair line, with its venue count shown as 1. The venue-calibration ledger already declines to score an event that closes with fewer than two venues quoting it; moving that same gate onto the published board is the next change to the consensus path. Until it lands, the venue count printed beside every fair line is the number to read.
  • Dispersion above the wide threshold → the disagreement is published with the number. Every fair line ships with its venue count and an agreement label — tight, moderate or wide. A wide market is a real state of the world, and hiding it behind a confident-looking number is a lie of presentation.
  • No anchor-tier venue in the pool → the confidence figure is capped at 0.45. A crowd of soft books that all copy each other is not a benchmark, however many of them there are. Note what this cap keys off today: the hardcoded tier of step 5, not a measured price-discovery record. Replacing the one with the other is the whole point of the calibration ledger.
  • No usable quote → the row is blank. Not interpolated, not carried forward from the last poll.

This is the same instinct as the honest zero: where the failure state is implemented, it is visible rather than papered over. Where it is not yet implemented — the single-venue case, and the two silent fallbacks named above (roster and leave-one-out) — that is written on this page in the same words, because a methodology page that only lists the gates that work is not a methodology page.

Fair value is not the break-even price

These are two different numbers, and conflating them overstates every edge computed from them. Fair value is the pooled probability, with no margin in it. Break-even is the probability a position needs to clear the price plus the fee. They are reported separately.

On Kalshi the fee is closed-form and charged per trade:

taker fee=0.07×C×P×(1P)cent,maker14taker\text{taker fee} = \left\lceil 0.07 \times C \times P \times (1 - P) \right\rceil_{\text{cent}}, \qquad \text{maker} \approx \tfrac{1}{4}\,\text{taker}

where CC is contracts and PP the price in dollars. Dropping the cent rounding gives the break-even in closed form:

ptrue    P+0.07P(1P)p_{\text{true}} \;\ge\; P + 0.07\,P\,(1 - P)

Worked example: a 50¢ contract

fee per contract=0.07×0.50×0.50=$0.0175\text{fee per contract} = 0.07 \times 0.50 \times 0.50 = \$0.0175
break-even=0.50+0.0175=51.75%\text{break-even} = 0.50 + 0.0175 = 51.75\%
100 contracts: $50.00 cost+$1.75 fee=$51.75 outlay100 \text{ contracts: } \$50.00 \text{ cost} + \$1.75 \text{ fee} = \$51.75 \text{ outlay}
round trip=2×$1.75=$3.50;settlement=$0.00\text{round trip} = 2 \times \$1.75 = \$3.50; \qquad \text{settlement} = \$0.00
The fee peaks at a coin flip and shrinks toward the tails in cents — the exact inverse of sportsbook vig, which lands heaviest on longshots. As a share of the money at risk it does the opposite: 0.07 × (1 − P) is 6.65% of outlay at a 5¢ price and 0.7% at 90¢. Settlement is free, so holding to resolution is the cheap exit and a pre-settlement round trip is taxed twice.

Wherever an exchange price is treated as tradeable — an arbitrage leg, a best price, an expected-value flag, a stake size — the number used is the executable taker cost, the ask plus the fee, not the fair mid. The fair mid feeds the pool; the executable cost is what gets graded. Some major events instead carry a flat 0.25% maker fee, which on a sub-5¢ contract is a large fraction of the contract price; that case is handled explicitly rather than folded into the standard formula. The Kalshi fee calculator prints both numbers side by side.

The suspect band

Expected value per dollar staked, against the leave-one-out benchmark:

EV=pb(1p)\text{EV} = p\,b - (1 - p)

where pp is the benchmark fair probability and bb the net decimal profit per $1 at the posted price. A ceiling applies:

EV_SUSPECT_PER_DOLLAR=0.15\texttt{EV\_SUSPECT\_PER\_DOLLAR} = 0.15

Any quote computing to 15¢ or more of edge per dollar is dropped from the flags rather than surfaced. In a liquid two-way market a fifteen-cent edge is not an edge; it is a stale price, a mis-paired line, a postponed game, or a typo. Filtering the top of the distribution costs a genuine outlier occasionally. Publishing it costs the reader real money, which is worse.

Worked example: flagged, and filtered

Benchmark fair: p=60%\text{Benchmark fair: } p = 60\%
Posted 130b=0.7692:    EV=0.60(0.7692)0.40=+$0.0615 per $1\text{Posted } -130 \Rightarrow b = 0.7692: \;\; \text{EV} = 0.60(0.7692) - 0.40 = +\$0.0615 \text{ per } \$1
0.0615<0.15    flagged0.0615 < 0.15 \;\Rightarrow\; \text{flagged}
Posted 105b=0.9524:    EV=0.60(0.9524)0.40=+$0.1714 per $1\text{Posted } -105 \Rightarrow b = 0.9524: \;\; \text{EV} = 0.60(0.9524) - 0.40 = +\$0.1714 \text{ per } \$1
0.17140.15    filtered, not shown as an edge0.1714 \ge 0.15 \;\Rightarrow\; \text{filtered, not shown as an edge}
The second line implies a venue is 8.8 probability points off a benchmark built from its own peers. That is a broken feed far more often than it is an opportunity, so it goes unflagged and the quote stays on the board with its timestamp showing.

An arbitrage flag carries the same kind of floor. A cross worth less than $1 per $1,000 staked is not published as an arbitrage, because after two stakes and the time it takes to place them it is not one.

The honest zero

When the inputs contain no edge, the printed answer is $0. Not “marginal.” Not a small stake rounded up so the screen has something on it.

Worked example: a no-edge input

Benchmark fair 55%, posted 125b=0.80\text{Benchmark fair } 55\%, \text{ posted } -125 \Rightarrow b = 0.80
EV=0.55(0.80)0.45=0.440.45=$0.01 per $1\text{EV} = 0.55(0.80) - 0.45 = 0.44 - 0.45 = -\$0.01 \text{ per } \$1
f=0.80(0.55)0.450.80=0.0125    stake $0f^{*} = \dfrac{0.80 (0.55) - 0.45}{0.80} = -0.0125 \;\Rightarrow\; \text{stake } \$0
A negative Kelly fraction is not an instruction to take the other side at this price — the other side carries the margin too. The output is $0, and the derivation showing why is on the page beside it.

Timestamps, staleness and where the data comes from

Every quote carries two timestamps: when it was pulled, and when the venue last moved it. Both are displayed. A live streamed price and a snapshot polled three hours ago are rendered differently, because they are different kinds of fact, and a tool that shows them identically is misrepresenting the more useful one.

Sources are first-party licensed APIs only: the Kalshi exchange API for prediction-market prices, and a commercial odds API for sportsbook lines. Nothing on this site is scraped, and no resold or scraped feed is purchased. That constraint is a product decision with teeth — it rules out resting the benchmark on a resold feed from a single sharp book, which is why the fair line here is a pool in the first place.

Every observed price is written to an append-only archive keyed on event, venue, market and timestamp, and settled outcomes are harvested from the exchange. Nothing is overwritten in place. That archive is what makes step 5’s measured weights and the closing-line-value grades possible at all.

What is not published

One thing, stated precisely so the boundary is not mistaken for evasion: the fitted per-venue calibration weights and the measured correlation structure between venues, once they exist. Neither is computed yet. The cold-start tier table and the exact weight formula that run in their place today are published above, in step 5, constants and all — there is nothing withheld about the estimator that is actually running.

What is published, on every fair line: the resulting probability and price, how many venues qualified, how much they agreed, the confidence read, the de-vig method used, and every timestamp. What is published on this page: the estimator for every step, with its formula. The technique is not the asset. The record of which venues have actually predicted closes and outcomes, accumulated one settled market at a time, is.

Nothing else is withheld. The odds conversions, all three de-vig methods, Kelly sizing and the arbitrage split are MIT-licensed and installable from PyPI, precisely so a number here can be checked without asking permission.

What runs today

Stated plainly, because a methodology page that describes an aspiration as a fact is worse than no methodology page.

This section changes when the code does, and the date in the byline is the same string as the dateModified in this page’s structured data, so the two cannot drift apart.

Check any of it

Reproduce a number

pip install teachersbettextbook
from teachersbettextbook.devig import devig_power, overround
devig_power(-150, 130)   # -> (0.5840, 0.4160)
overround(-150, 130)     # -> 0.03478

Same inputs, same outputs as the worked example above. If a number on this site disagrees with the library, that disagreement is the bug and it is the highest-priority mail the contact page receives. The formula sheet lists every formula with each symbol named; the editorial policy covers how corrections are handled.

See the pipeline running →Free. Every fair line on the board ships with its venue count, its agreement label and its timestamps.

Where the methods come from

None of the statistics here is original. Removing a margin under an insider-trading model is Shin’s.[1][2] The favorite–longshot bias the power method corrects for is documented across decades of market data.[3][4] The size-weighted order-book estimator is the micro-price.[5] Merging forecasts in log-odds is a logarithmic opinion pool.[6] Scoring a venue’s calibration uses the Brier score.[7]

  1. Shin, H. S. (1992). “Prices of State Contingent Claims with Insider Traders, and the Favourite-Longshot Bias.” The Economic Journal 102(411), 426–435.
  2. Shin, H. S. (1993). “Measuring the Incidence of Insider Trading in a Market for State-Contingent Claims.” The Economic Journal 103(420), 1141–1153. — the Shin de-vig implemented in step 2.
  3. Thaler, R. H. & Ziemba, W. T. (1988). “Anomalies: Parimutuel Betting Markets: Racetracks and Lotteries.” Journal of Economic Perspectives 2(2), 161–174. — the favorite–longshot bias.
  4. Snowberg, E. & Wolfers, J. (2010). “Explaining the Favorite–Longshot Bias: Is It Risk-Love or Misperceptions?” Journal of Political Economy 118(4), 723–746.
  5. Stoikov, S. (2018). “The Micro-Price: A High-Frequency Estimator of Future Prices.” Quantitative Finance 18(12), 1959–1966. — the size-weighted book estimator of step 1.
  6. Genest, C. & Zidek, J. V. (1986). “Combining Probability Distributions: A Critique and an Annotated Bibliography.” Statistical Science 1(1), 114–135. — the logarithmic opinion pool of step 4.
  7. Brier, G. W. (1950). “Verification of Forecasts Expressed in Terms of Probability.” Monthly Weather Review 78(1), 1–3. — the calibration score behind step 5’s measured weights.

Frequently asked questions

How does Teacher's Bet calculate a fair line?

One price is taken from each qualifying venue, the venue’s margin is removed by de-vigging, the resulting probabilities are pooled in log-odds space, and the pooled value is converted back to a probability and an American price. Every venue is then graded against a benchmark computed with that venue excluded.

Which de-vig method does Teacher's Bet use?

The pooled fair line uses the power method, which shades longshots to account for favorite–longshot bias. Proportional and Shin are both available in the calculators, and the spread between the three methods on the same line is kept as a data-quality signal: a line the three methods disagree about earns less weight.

Why use the microprice instead of the mid on an order book?

The mid ignores how much size rests on each side. The microprice weights each quote by the size resting on the opposite side, so it leans toward the thinner half of the book — the side about to be taken. On a book with 400 contracts bid at 62¢ and 1,200 offered at 63¢, the mid is 62.5¢ and the microprice is 62.25¢.

When does Teacher's Bet refuse to publish a fair line?

Today the gate is partial, and this page says so rather than promising otherwise. A market with no usable quote is left blank, never interpolated or carried forward from the last poll. Where venues disagree beyond the wide-dispersion threshold, the disagreement is published alongside the number rather than smoothed away, and the confidence figure is capped at 0.45 when no anchor-tier venue is in the pool. A market quoted by a single venue is still published, with its venue count shown as 1; moving the two-venue refusal onto the board is the next change to the consensus path.

What is the suspect band?

Any quote computing to 15¢ or more of expected value per dollar staked is treated as a stale or erroneous line rather than an edge, and is left unflagged. The constant is EV_SUSPECT_PER_DOLLAR = 0.15. Real edges in a liquid two-way market are worth a few cents per dollar, not fifteen.

Is the fair value the same as the break-even price?

No, and they are reported as separate numbers. Fair value is the pooled probability with no margin in it. The break-even is the probability a position needs in order to cover the price plus the fee. For a Kalshi taker buying at price P, the break-even is P + 0.07 × P × (1 − P), so a 50¢ contract breaks even at 51.75%.