Five settled bets is enough to spot a sharp

Closing line value separates adverse accounts almost perfectly after five bets. Realized profit and loss never gets close, even after a hundred. Detection is not the hard problem. Choosing where to draw the line is.

0.98How cleanly closing line value separates a sharp, after five settled bets.
0.61The best realized profit and loss ever manages, and it needs a hundred.

Draw that line in the wrong place and it costs more than the problem. Restricting the top fifth of accounts loses the book £202k. Every sharp in the building, all 86 of them, takes £51k between them.

Simulated bettors, real prices. Twelve figures follow. The first four are real market data and establish that the mechanism exists at all. The rest simulate accounts on top of it, because no public bettor level data exists.

01The market that makes this possible

Before simulating a single bettor, the prices have to admit there is an edge to find.

Closing line value only means something if the closing price is worth beating. So the first question is not about bettors at all. It is whether the close is a better forecast than the open, and if so, where that extra accuracy comes from.

Figure 01Both prices are well calibrated. The close is slightly better.
Price
0%0%20%20%40%40%60%60%80%80%Perfectly calibratedClosing priceProbability the price impliedHow often it actually happened
Show these numbers as a table
BandOutcomesImpliedObserved
0% to 10%9197.38%6.20%
10% to 20%4,55515.96%15.98%
20% to 30%16,27726.12%25.50%
30% to 40%8,53334.11%33.77%
40% to 50%5,13444.55%46.05%
50% to 60%2,93454.60%55.28%
60% to 70%1,47864.55%66.91%
70% to 80%77274.45%74.87%
80% to 90%29984.02%85.62%
Across 13,638 matches the closing price scores 0.59671 on Brier against the opening price's 0.59912. That gap is small but it is not noise: a paired test gives t = 6.29, and a bootstrap puts the 95% interval at 0.0017 to 0.0032, which does not contain zero.Average 1X2 prices, 13,638 matches with complete opening and closing quotes, 2019-08-02 00:00:00 to 2025-05-25 00:00:00.
Figure 02The close is only better where the price moved.
Close betterOpen better0.0 to 1.03,410 matches1.0 to 1.93,409 matches1.9 to 3.23,409 matches3.2 to 26.83,410 matchesNo differenceHow far the price moved between open and close, percentage points
Split the same matches by how far the price travelled between open and close and the advantage is not spread evenly. In the two quietest quartiles the close is no better than the open, and the interval crosses zero. In the noisiest quartile it gains 0.0083, which is 3.5 times the overall average. The information a sharp captures is the movement itself, and closing line value is the measure of how much of it they caught.Same 13,638 matches, split into quartiles by the largest single leg move. Bars show the mean gain, whiskers the 95% interval.

The median match moves 1.85pp between open and close, the top tenth moves more than 4.77pp, and in 4.9% of matches the favourite changes outright. That is the room. The next two figures ask whether any of it survives as mispricing at the close, and the answer is no.

Margin is not the same thing as mispricing

The obvious story about sharps is that they hunt badly priced leagues. The data supports a different one. What varies across divisions is what the book charges, not how well it forecasts.

Figure 03Margin varies far more across leagues than accuracy does.
LeagueTierMatchesOverroundBrier, with 95% interval
Eredivisiemid1,7623.33%0.5437 ± 0.0174
Premier Leaguesharp2,2802.68%0.5655 ± 0.0144
La Ligasharp2,1202.66%0.5768 ± 0.0133
Scottish League Onethin9695.71%0.5961 ± 0.0187
MLSrelatable5,7852.97%0.6055 ± 0.0072
Championshipmid3,3103.07%0.6230 ± 0.0085
League Twothin3,1973.71%0.6337 ± 0.0076
Scottish League One charges 5.71% overround against the Premier League's 2.68%, more than double, while the Brier scores sit inside overlapping intervals. Thin leagues are not more mispriced. They are more expensive, so a sharp needs a bigger edge there simply to break even.Pinnacle closing prices. Query: sql/01_league_efficiency.sql, run unchanged.
Figure 04No league is distinguishable from perfectly calibrated.
LeagueOutcomesObserved errorError from noise aloneRatio
La Liga6,3601.76pp1.40pp1.26
Scottish League One2,9072.44pp2.09pp1.17
Championship9,9300.99pp1.15pp0.86
Eredivisie5,2861.19pp1.47pp0.81
Premier League6,8401.07pp1.32pp0.81
MLS17,3550.69pp0.86pp0.80
League Two9,5910.81pp1.18pp0.68
Raw calibration error is confounded by sample size, because the error expected under perfect calibration shrinks with the square root of n. Dividing observed error by that expected error removes the confound. Every ratio lands between 0.68 and 1.26, so nothing here is mispriced beyond what sampling alone would produce.Pinnacle closing prices, decile buckets per league. Query: sql/03_calibration_vs_noise.sql, run unchanged.

Taken together those four figures set the rules. Nobody beats the close, so a sharp's edge has to come from beating the price before it converges. That is the only mechanism available, it is measurable the moment a bet is placed, and it is what the rest of this page simulates.

Run the simulation

Accounts are drawn from the five archetypes and bet into the real market layer above.

04How fast a sharp becomes visible

Source
Figure 08Closing line value is near perfect after five bets. Profit never arrives.
After 5 settled betsClosing line value0.981Realized profit and loss0.521
0.50.60.70.80.91.00.5 is a coin flip510152030405075100Settled bets used as evidenceClosing line valueProfit and loss
Show these numbers as a table
BetsAccounts scoredSharps presentAUC, closing line valueAUC, profit and loss
54,000860.9810.521
104,000860.9960.557
154,000860.9990.591
204,000861.0000.579
303,799861.0000.580
403,583851.0000.580
503,383801.0000.581
752,839541.0000.579
1002,226301.0000.615
Both lines rank every account by one signal after k settled bets and ask how often a sharp outranks a non sharp. Closing line value scores the decision. Profit and loss scores the outcome, which at this sample size is mostly variance.Published run: 4,000 accounts, numpy, seed 20260908. Beyond 100 bets no sharp has enough bets left to score, so the curve stops there.
Figure 10The gap survives independent runs.

This resimulates 24,000 accounts, so it takes a few seconds.

One simulation is an anecdote. This repeats the whole thing on independent seeds and draws the full range each signal covers, so the gap can be judged against how much either measure wanders.Not yet run. Each run resimulates every account from scratch.

06Method and limits

How the simulation works

A bettor decides using the opening price and a private estimate of the true probability. They never see the close. How good a bettor is comes down to one number: how far that private estimate sits from the truth.

A sharp reads a game about as well as the closing price does, and bets early, into prices that have not absorbed everyone else's information yet. There is no secret edge in this model, because Figure 04 says there is nowhere to hide one.

Closing prices do two things, both after the fact. They stand in for truth when a private estimate is generated, and they score the bet once it is already placed.

13,638 matches carry complete average opening and closing prices, 2019-08-02 00:00:00 to 2025-05-25 00:00:00.
Championship3,312
League Two3,195
Premier League2,280
La Liga2,120
Eredivisie1,762
Scottish League One969

What it gets wrong

I labelled the wrong people adverse. The first version of the detection code counted semi sharps as adverse, because they are skilled. The cost model then returned a negative cost for failing to restrict them, which was the model saying the label was wrong. The book holds 4.7% on semi sharps. Adverse is an economic label, not a skill label, and Figure 12 is what that distinction looks like.

The bettors are invented. No public bettor level data exists, so the accounts are simulated. This does not discover that sharps exist. It measures how fast an estimator converges on a truth already known by construction, which is the one question simulation is genuinely the right tool for. Figures 01 to 04 are real data and carry the part of the argument that simulation cannot.

Truth is a proxy, and proxies drift. Private estimates are generated around the devigged closing price. Figures 01 and 04 justify that, but it still means the simulation inherits whatever the closing price gets wrong. A real desk would find that out slowly and expensively.

Your run will not match the published one. The published figures come from numpy. A browser cannot reproduce that random stream, so a live run lands near those numbers rather than on them. Figure 10 exists so that claim can be checked rather than taken on trust.