Polson–Sokolov Lab · Betting markets

Benter Betting Lab

Bill Benter turned Hong Kong win payouts into probabilities, corrected the crowd's biases with a conditional logit model, and sized bets with the Kelly criterion. Part I reruns each step on 73,722 horses in 5,885 races from 1997–2005: check how well the odds forecast, fit the correction yourself, size bets, and test the strategy on races the model has not seen. Part II follows Nick Polson's refit of Benter's full two-stage model on forty seasons, 1979–2018: how much the starting gate matters, which of 23 handicapping variables a model needs, and why the edge that was there in the 1990s has gone.

← All labs

Based on the case study “Benter’s Betting Strategy” (V. Sokolov), which reproduces Benter’s computer handicapping paper as annotated by Acta Machina; see Polson and Sokolov, Bayes, Artificial Intelligence, and Deep Learning, Chapter 4 (Kelly criterion). Data: Hong Kong Jockey Club races 1997–2005 (Kaggle gdaley/hkracing). Part II is based on N. Polson, “The Benter model on Hong Kong racing: post position, variable selection and the vanishing edge” (notes, October 2026), with Hong Kong Jockey Club results 1979–2018 from eprochasson/horserace_data; see Benter (1994) and Bolton and Chapman (1986).

1 · The market as a forecaster

Payouts are forecasts. Are they calibrated?

Each horse's final win payout O is the number of dollars paid back per $1 bet, stake included. Racetracks call O the odds, but it is not the odds \(p/(1-p)\). The implied probability is \(p = 1/O\), normalised so the field sums to 1. Then horses are grouped by that probability, and each group's actual win rate is compared with the forecast. Points on the 45° line mean the crowd is calibrated.

Calibration: 20 equal-sized groups of horses

Actual win rate (±1.96 SE) 45° line: forecast = outcome

Favourite-longshot bias by venue (the favourite in every race)
VenueRacesAvg fieldFav winsImpliedBias
Calibration by betting rank (1 = favourite)
RankHorsesActualImpliedError
2 · Correcting the crowd

One parameter, fitted by maximum likelihood

Benter's public-only model raises every horse's crowd chance to a power and renormalises within the race: \(c_i \propto p_i^{\alpha} = \exp(\alpha \log p_i)\). With \(\alpha = 1\) nothing changes. With \(\alpha > 1\) the gaps widen and probability moves from longshots to favourites. Drag \(\alpha\) and watch the negative log-likelihood of the observed winners.

Negative log-likelihood of the winners, relative to the best \(\alpha\)

−log L(α) − min MLE α̂ Your α 1.92: edge of the 95% likelihood interval

Example race

Public p Adjusted c at your α

Calibration before and after

Before (public) After (your α)
3 · Adding fundamentals

The full combined model: a softmax over the field

Now add four fundamental factors next to the log crowd chance \(\log p\): the jockey's and trainer's past win rates (from earlier races only), the starting gate (standardised within the race, positive = outside) and the horse's rating relative to the field, per 10 points. The model is a conditional logit, fitted here by Newton–Raphson on every race with a single winner.

\[ \begin{aligned} c_i &= \frac{\exp(\eta_i)}{\sum_{k \text{ in race}} \exp(\eta_k)},\\ \eta &= \alpha\cdot\log p + \beta_J\cdot\text{jockey} + \beta_T\cdot\text{trainer} + \beta_D\cdot\text{draw} + \beta_R\cdot\text{rating}/10 \end{aligned} \]
ParameterEstimateSEzPublic-only fit

Calibration of the full model

Full model, 20 bins45° line
Model comparison
ModelBrierGainLog-loss
4 · Betting with Kelly

How much to bet when you have an edge

For a bet that pays \(b\) to 1 and wins with probability \(p\), the Kelly fraction \(f^* = (bp - q)/b\) maximises the long-run growth rate of the bankroll, \(g(f) = p\cdot\log(1 + bf) + q\cdot\log(1 - f)\). Bet more than \(f^*\) and growth falls; near \(2f^*\) it drops to about zero (exactly zero when the edge is small). The simulator plays the same coin flips for four bettors who stake ¼, ½, 1 and 2 times Kelly.

Bankroll paths, log scale (median solid, 5th percentile dashed)

Growth per bet \(g(f)\)

Stakefg per betShare of Kelly growthMedian end5th pct endEnd below start
5 · One race, many horses

Kelly across a whole field

Only one horse can win, so win bets in the same race are mutually exclusive. Kelly (1956), and Smoczynski and Tomkins for pari-mutuel pools, give the exact solution. Rank horses by expected return \(c\cdot O\). Add them one at a time while \(c\cdot O\) is above the threshold \(R = (1 - \sum c)/(1 - \sum 1/O)\) over the horses already chosen, then stake \(f_i = c_i - R/O_i\). The cash you hold back acts as the bet on "none of these".

Race

Public p Model c (full model, all races) Kelly stake, % of bankroll 1/O at the payout
HorsePayout OPublic pModel cEdge c·O − 1Kelly stakeResult
6 · Backtest on held-out races

Would the model have made money?

Benter's real model was a model of the residual from the market. It starts from the crowd's log chance, \(\log q_i\), and adds many handicapping variables that capture what the crowd missed. Think of a trader measured against a VWAP benchmark: the only question is whether you beat the market price. Benter used about 80 variables, chosen with a lasso-type penalty. Here the model uses all 23 handicapping variables of the full model in Part II (draw, weight carried, rating, recent form, jockey and trainer records and so on). A small L2 penalty does the shrinking that a lasso would. Within each race, \(c_i \propto \exp(a\log q_i + \sum_k b_k x_{ik})\), fitted by conditional logit. The penalty is picked on a validation block. The model bets 1 unit on every horse whose edge \(c_i O_i - 1\) is above the threshold, where \(O_i\) is the payout. Fractional Kelly stakes a quarter of the Kelly amount and compounds. The baseline bets 1 unit on the public favourite in every race. The data are the Part II results. Pick a period below.

Flat stakes: cumulative profit (units)

Model, 1 unit per betPublic favourite, 1 unit per race

Quarter Kelly: bankroll (start = 1)

Model, quarter Kelly
StrategyBetsHit rateFlat ROI ± s.e.Kelly final wealthKelly max drawdown

The standard error of the ROI is the standard deviation of the profit per bet divided by the square root of the number of bets. A return is only informative if it is large next to its standard error. Edge is c·O − 1. The first three rows use the validation-chosen penalty. The weak-penalty row repeats the 0% threshold with a fixed small penalty, so the variables are not shrunk away. Green is a positive return, red a negative one.

Variables in this model

The model starts from the log of the crowd's chance, log q, and adds 23 handicapping variables. The study's lasso kept the 18 marked L. The other 5 are marked –. A struck-through name is not used in the selected period because it was not recorded in the training seasons.

    Part II · Forty seasons of Hong Kong racing, 1979–2018

    Benter's full two-stage model, and what happened to his edge

    Sections 1 to 6 use eight seasons and four factors. Nick Polson refitted Benter's model on a much larger public record of Hong Kong Jockey Club results: about 265,000 runs in 23,000 races from 1979 to 2018, with the handicapping variables Benter described. Every variable uses only what was known before the race. The races are split by season: the model is fitted on 1999–2010 (5,997 races), tuned on 2011–12 (1,522) and tested on 2013–17 (3,860), which it never sees while being built.

    Benter's model has two stages. Stage one is a conditional logit on the fundamentals alone, which gives each runner a score \(f_i = x_i^\top \hat b\). Stage two combines that score with the public's implied probability \(q_i\), which is \(1/O_i\) rescaled to sum to one in the race. It enters through \(\log q_i\), not its logit:

    \[ c_i = \frac{\exp(\alpha f_i + \beta \log q_i)}{\sum_j \exp(\alpha f_j + \beta \log q_j)} \]

    The model has an edge only if \(\alpha > 0\): the fundamentals must carry information that the crowd has not already priced. Fit is reported as McFadden's pseudo \(R^2 = 1 - \ell(\hat b)/\ell_0\), where \(\ell_0 = -\sum_r \log n_r\) is the log-likelihood of picking every winner at random. This is the measure Benter used.

    7 · Post position

    Does the starting gate matter?

    Each horse starts from a numbered gate, the draw. Gate 1 is on the rail, the inside of the track, and the widest gate is on the outside. A horse drawn wide has to run farther around the turns unless it gets across to the rail. The chart groups races with twelve or more runners by gate and divides each gate's win rate by the fair rate \(1/n\). A value of 1 means the gate wins its fair share.

    Win rate by gate, relative to the fair rate 1/n

    Races of 1,200 m or lessLonger racesModel's draw effectFair shareBars: ±1.96 SE
    8 · Variable selection

    Twelve variables do the work of twenty-three

    The full model has 23 candidate variables: the draw, weight carried, rating, recent form, lengths beaten, layoff, body-weight and distance changes, jockey and trainer records, and the payout in the horse's previous race. Each is centred on its race average, because anything that is the same for every runner cancels out of the softmax. Two ways to choose a smaller model are compared here. Forward stepwise selection adds the variable that most lowers \(\text{BIC} = -2\ell + k\log R\), where \(R\) is the number of races. The lasso penalises \(\lambda\sum_j |b_j|\) and lets the penalty push coefficients to exactly zero.

    Full model: coefficient per SD, ±1.96 SE

    Kept by stepwise BICKept only by the lasso at this λDropped by both

    Lasso path: coefficients as the penalty shrinks

    Active at the chosen λZero at the chosen λChosen λ
    StepVariable addedBICValidation log L
    ModelVariablesTrain R²Valid R²Test R²
    9 · The edge over time

    Benter's edge, era by era

    This section reruns Benter's procedure separately in six blocks of six seasons. Within each block, the twelve-variable fundamental model is fitted on the first three seasons. The stage-two weights \(\alpha\) and \(\beta\) are then fitted on the last three seasons, and every \(R^2\) in that row is measured on them too. If the fundamentals add information beyond the payouts, \(\alpha\) is positive.

    Fitted weight on the fundamentals, α ± 1.96 SE

    Significant at 5%Not significantNo edge (α = 0)

    Pseudo R² on the later half of each era

    FundamentalsPublic payoutCombined
    10 · The honest backtest, 2013–2017

    Can the two-stage model still beat the take?

    This backtest uses the 3,860 test races, with each runner's stage-one score from the twelve-variable model fitted on 1999–2010. You choose \(\alpha\) and \(\beta\), and the page recomputes the combined probabilities \(c_i\) in the browser. It then bets 1 unit on every runner whose edge \(c_i O_i - 1\), with \(O_i\) the payout, is above the threshold. The track keeps about 19% of every pool here, so an edge has to clear that first. The take slider rescales the payouts as if the track kept less.

    Flat-stake return against the track take

    Model at your α, βEvery runnerBreak-evenTakes with fewer than 20 bets are not plotted

    Cumulative profit at the chosen take (units)

    Model bets, 1 unit each
    WeightsαβTest R²BetsHit rateProfitROI

    Market prices are a strong, biased prior

    The payouts already pool the views of thousands of bettors. A model that starts from \(\log p\) and adds a few factors needs to explain only what the crowd missed, which is why \(\alpha\) carries almost all the weight.

    The bias is systematic and small: a few points for favourites, a fraction of a point for each longshot. Check the units first.

    Conditional logit = softmax over the field

    \[ P(i \text{ wins}) = \frac{e^{\eta_i}}{\sum_k e^{\eta_k}} \]

    Only differences within a race matter, so there is no intercept, and factors are expressed relative to the field. It is multinomial logistic regression where the classes are the runners, the same softmax that ends a neural network classifier.

    Calibration matters for Kelly

    Kelly stakes are linear in the edge \(c\cdot O - 1\). With an 18% take, an edge only appears when the model is more confident than the market. If the model is overconfident by a few points, Kelly converts that error straight into oversized bets, and the bettor goes past \(2f^*\) where growth is negative.

    Brier and log-loss can rank models differently; the betting decision needs the probabilities themselves to be right.

    Thorp's rules for using Kelly

    • Bet about half Kelly: “about three-quarters of the return with half the volatility.” For a new strategy with an uncertain edge, Thorp simulated at 1/10 Kelly.
    • Shrink positions in a drawdown: after a 5% loss, cut size; after a few more percent, cut again. The system shuts itself down and has to earn its way out.
    • Assume the worst imaginable outcome will occur and ask whether you can tolerate it.

    Why one edge is not enough

    The edge must beat the take on each bet, survive price impact and be stable over time. The likelihood ratio test says the four factors carry real information; the backtest shows that real information and profit are different things.

    The draw is real, small and course-specific

    At Happy Valley, moving from the rail to the widest gate multiplies a horse's odds of winning by about 0.41; at Sha Tin by about 0.81. Here “odds of winning” means \(p/(1-p)\), not the payout. Yet the draw alone explains a pseudo \(R^2\) of only 0.005. A variable can be highly significant and still be a small part of the forecast.

    BIC counts races, not runners

    A race is one observation of who won, however many horses run, so the sample size in the BIC penalty \(k \log R\) is the number of races. Stepwise BIC and the lasso agree on most of the model, and the twelve BIC variables match the full model out of sample: test \(R^2\) 0.121 against 0.122.

    Why the edge vanished

    The fundamental model got better over forty seasons (\(R^2\) from 0.06 to 0.12), but the payouts got better faster (0.14 to 0.20). The final payouts now include the syndicates' own bets, so the crowd partly is the computer models. Given the market, all 23 variables are jointly significant in sample (likelihood ratio 63.0 on 23 degrees of freedom) and add nothing out of sample: test \(R^2\) falls from 0.1973 to 0.1964.

    A word on gambling

    Pari-mutuel betting has negative expected value for almost everyone: the track keeps about 18% of the pool before anyone is paid. Benter is famous because he is the exception. This lab is about forecasting, calibration and decisions under uncertainty, the same tools used to price insurance, size trading positions and read prediction markets.

    Try this in class

    1. Before showing section 1, ask: a horse quoted at 3.5 in Hong Kong, what is its implied probability? Then check that the field's Σ 1/O matches a track that keeps 17.5% of the pool.
    2. In section 2, move \(\alpha\) from 1.00 to the MLE and read off the gain in log-likelihood. How large is it per race? Use the 1.92 line to read a 95% interval for \(\alpha\), and compare it with \(\hat\alpha \pm 1.96\,\text{SE}\) from the panel.
    3. In section 3, which coefficients have \(|z| > 2\)? Explain the negative jockey sign to a classmate in one sentence, then switch to "Later races" and check whether the full model still beats the public-only model out of sample.
    4. In section 4, load the two case-study bets. The 12/1 bet has the larger edge (30% vs 25%), yet Kelly stakes 2.5 times less on it. Why? Then set the stake to 2× Kelly and predict the median growth before running the paths.
    5. In section 6, switch between the two periods. In which period does the residual model beat the market on pseudo R², and does that turn into profit after the take? Compare the size of each ROI with its standard error, and list what else would have to go right for a real bettor.
    6. In section 7, compare the two courses. Ask why a rail draw should matter more on a tight track, and why the model's curve is smoother than the dots.
    7. In section 8, move λ from left to right and name the first five variables to enter. Compare them with the first five steps of stepwise BIC. Why does the lasso keep rating but not weight carried?
    8. In section 9, predict which era has the largest \(\alpha\) before clicking. Then explain why \(\beta > 1\) after 2004 means the payouts are “sharper than they look”.
    9. In section 10, load the 1998–2003 weights and watch the model find bets on 2013–17. Then press “Fit on 2013–17 itself” and explain why even weights fitted to the test seasons do not beat the take.