The betting market knows more than most models give it credit for. We trained on 233K races to find out exactly where the edge lives — and where it doesn't.
Our AFL model is right 71% of the time and loses money. Our NRL try scorer model is right 26% of the time and prints profit.
NRL prop markets show wider cross-bookmaker price gaps in the second half of the season. Origin disruption, injury replacements, and slow model adjustments create real value for punters who know where to look.
Most racing models either mirror the market or don't work. We spent the last few weeks building one that does both — and the most interesting findings were about where the market is efficient, not where it isn't.
At Krok Odds, we train machine learning models on Australian racing data to power our racing comparison tool. This isn't a tipster operation or a paid predictions scheme. It's data engineering — building features, testing configurations, and finding the narrow bands where a model actually has an edge over the market.
Here's what we built, what we found, and why the results surprised us.
The model trains on historical Australian racing results from January 2024 to August 2026 — thoroughbred, harness, and greyhound. That's 233,000+ races and 1.78 million individual runners, each with form data, connection statistics, barrier draws, track conditions, and market prices.
The data pipeline is the part nobody sees. We scrape and backfill speed figures and ratings across 80+ Australian race courses, pull exchange prices with near-total coverage, and build per-venue barrier bias statistics from rolling historical results. Sectional data, connection strike rates, and weather conditions round out the feature set.
All of this data is publicly available. No paid APIs. No proprietary feeds. The competitive advantage isn't the data — it's the feature engineering and model selection.
We ran 66 different model configurations — LightGBM, CatBoost, XGBoost, logistic regression, and various ensemble approaches — and evaluated 4,462 combinations of features, thresholds, and weighting schemes. The goal wasn't to find one model that works. It was to find the configuration where the model consistently beats the market at a meaningful coverage level.
The final system uses a base scoring layer (applied to every race) plus an ML override that kicks in when confidence is high enough. Three sub-models must agree before the system escalates a pick — and the escalation thresholds are calibrated against backtested strike rates, not arbitrary confidence scores.
The model operates across three confidence tiers, each with a different trade-off between coverage (how many races get a pick) and accuracy (how often that pick wins):
| Tier | Strike Rate | Coverage | What it means |
|---|---|---|---|
| Overall (no filter) | 42.0% | 100% of races | Every pick, baseline |
| 🟢 Value | 66.0% | ~20% of races | Model has a reasonable edge |
| 🟡 Standard | 73.2% | ~10% of races | Model is fairly sure |
| 🔴 Premium | 78.8% | ~5% of races | All sub-models agree |
The key insight: the model matches the market at full coverage (42% = always backing the favourite), but separates meaningfully at selective coverage. At 20%, we're at 66% versus the market's ~54% at equivalent confidence. At 5%, we hit 78.8% — matching the market's sharpest tier.
The edge exists. But it's narrow, and it requires discipline to skip most races.
The favourite wins roughly 42% of Australian races across all codes. That's your baseline. Any model that doesn't beat this at meaningful coverage is adding noise, not signal.
Our model at full coverage produces a 42% strike rate — it matches the market. This is actually a good sign: it means the model isn't adding noise at scale. The separation happens when you filter for confidence:
The market gets smarter as you filter for confidence — and so does our model. The gap narrows at the sharp end because the market already prices in most of the information our features capture.
The numbers are satisfying, but the findings about the market itself were more useful for future development. Three things stood out:
We built a sub-model using only connection data — jockey and trainer win rates, shrunk toward base rate to avoid small-sample noise. At very selective thresholds, this model found +23% ROI. Not at high coverage — at the narrow end where you're backing a specific jockey/trainer combination at a specific track.
The market prices the horse. It prices the form. It prices the barrier draw. But it doesn't fully price the combination of who trains and who rides. Stable form — a jockey and trainer hitting a rich vein of form together — shows up in the data before the market adjusts.
One feature outperformed everything else: how a horse's recent form compares to the field's median class. Not speed figures. Not sectionals. Not barrier draws. A simple comparison of the level a horse has been racing at versus the level of the current race.
This makes intuitive sense — a horse stepping up from a maiden to a benchmark 64 is a different proposition than one dropping from a Listed race to a benchmark 78. The market prices the horse, but class fit captures the context of the race in a way the market often misses.
When we weighted the model heavily toward market probabilities (70%+), it just mirrored the favourite. The exchange already knows most of what our 63 features know. Genuinely efficient markets don't leave much on the table.
But at 45% market weight — where the model balances market input against independent features — edges emerged. The market has a blind spot, and it's narrow. Finding it requires being willing to disagree with the market when the data says you should, and being willing to agree when it doesn't.
Greyhounds are the most predictable code (favourite wins ~44% of the time), while thoroughbreds are the least (~35%). The model performs differently across thoroughbred, harness, and greyhound racing — and the optimal coverage thresholds shift accordingly. A one-size-fits-all approach doesn't work across codes.
The model is integrated into our racing comparison tool at krokodds.com.au/racing. It replaces our previous tipping system — which was essentially a market mirror with a ~20% hit rate — with a tiered confidence system that only generates picks when it has genuine backing from multiple sub-models.
No more tipping every race. The model now picks selectively across three tiers, and it's transparent about confidence levels. Premium picks carry the strongest signal but cover the fewest races. Value picks cover more ground but at lower strike rates. Punters decide which tier suits their approach.
We're not selling tips. We're not taking your money for predictions. The model is a data point in a comparison tool — one input alongside odds comparison, form data, and market analysis. The goal is to give punters better information, not to run a tipping operation.
The margin structure of Australian bookmakers makes it hard enough to profit without adding a subscription fee on top.
This is a backtest on historical data. Past performance doesn't guarantee future results — and in racing, it definitely doesn't. The model was trained and evaluated on the same dataset, which means out-of-sample performance could differ. We're collecting live data now to validate.
The coverage numbers are aspirational at this stage. A 78.8% strike rate at 5% coverage sounds impressive, but it means the model only fires on 1 in 20 races — and even then, it's wrong 21% of the time. The edge is real, but it's small, and bankroll management matters more than model accuracy.
The betting market is more efficient than most people give it credit for. At70% market weighting, our 63-feature model adds nothing over just backing the favourite. The edge lives in the narrow bands where independent features — class fit, connection data, barrier bias — add information the market hasn't fully priced.
If you're building a racing model, the lesson is: don't fight the market. Find the specific places where it's slow, and bet selectively. The edge is real — but it requires the discipline to skip most races and wait for the ones where the data says the market is wrong.
For punters who want to explore the data themselves, the model picks are available on our racing comparison page — free, transparent, and with no strings attached.
Disclaimer: Past performance doesn't guarantee future results. This article describes a backtest on historical data. Always gamble responsibly. If gambling is a problem for you, call 1800 858 858.

James covers the AU bookmaker market — pricing mechanics, line movement, promotional structures, and how the corporate books actually operate. Previously worked in financial markets before moving to sports analytics.
Caulfield Cup form correlates to Melbourne Cup. Cox Plate form does not. Most AU punters get that backwards.