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 labsBased 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).
The race data file (benter-data.js) did not load, so the charts cannot be drawn. It must sit next to this page.
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.
| Venue | Races | Avg field | Fav wins | Implied | Bias |
|---|
| Rank | Horses | Actual | Implied | Error |
|---|
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.
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.
| Parameter | Estimate | SE | z | Public-only fit |
|---|
| Model | Brier | Gain | Log-loss |
|---|
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.
| Stake | f | g per bet | Share of Kelly growth | Median end | 5th pct end | End below start |
|---|
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".
| Horse | Payout O | Public p | Model c | Edge c·O − 1 | Kelly stake | Result |
|---|
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.
| Strategy | Bets | Hit rate | Flat ROI ± s.e. | Kelly final wealth | Kelly 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.
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.
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:
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.
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.
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.
| Step | Variable added | BIC | Validation log L |
|---|
| Model | Variables | Train R² | Valid R² | Test R² |
|---|
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.
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.
| Weights | α | β | Test R² | Bets | Hit rate | Profit | ROI |
|---|
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.
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.
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.
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.
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.
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.
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.
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.