Why your ML trading model predicts 50%
You did it properly this time. Time-based split, embargo gap, no scaling leak, a label you can defend. And the model comes back at 50.3% — nine approaches, twelve months of data, every one of them a coin.
That result gets posted to r/algotrading every few weeks, usually with the words "what am I missing". The uncomfortable answer is that you may not be missing anything. The leakage guide covers the failure that inflates a result; this is its mirror image — the failure that tells the truth. A model that scores 50% out of sample has, for once, not been lied to. The question is whether it was asked something answerable.
This guide ranks the five reasons a properly built model lands on a coin flip, gives a check for each, lays out the order to run them in (the model is last), and describes what a realistic result on market data looks like — because the honest number is a lot smaller than the tutorials led you to expect, and still tradeable.
First, make sure it really is 50%
Before diagnosing, confirm the number means what you think. A model that predicts "up" every time on a label that is up 52% of the time scores 52% accuracy and has learned nothing; a model at 50% on a label that is up 60% of the time is actively bad. Accuracy without the base rate is a number without a unit.
Look at the confusion matrix instead. Then compute Matthews' correlation coefficient — the MCC, from Matthews (1975) — which runs from −1 to +1, sits at zero for any constant or random predictor regardless of the base rate, and is the metric Chicco and Jurman (2020) argue for over accuracy and F1 for exactly this situation. An MCC near zero is the honest statement of "no skill". An accuracy near 50% might be.
The five causes, in the order they usually turn out to be
1. The label is unpredictable at that horizon
Next-bar direction on a liquid instrument is close to noise. Not exactly — there is small, real autocorrelation at some horizons — but the signal is tiny compared to the variance, and a classifier trained to call the next bar's sign is being asked to hear a whisper in a stadium. Gu, Kelly and Xiu (2020), in "Empirical Asset Pricing via Machine Learning", found that even the best models on a very large cross-section of stocks explain a small fraction of a percent of monthly return variance out of sample — economically meaningful, statistically real, and nothing like the accuracies a tutorial shows. If your label is "up or down next bar", 50% may be the right answer.
The check: change the label, not the model. Use a horizon of several bars and a target in volatility units — the triple-barrier method exists because fixed-horizon sign labels are the least predictable label there is. If the score moves off 50% with the same features, the horizon was the problem.
2. The features carry no information the price didn't
Raw prices, raw volume and a dozen indicators that are all smoothed versions of the same close. The model has one input restated twelve ways, and that input is the level, which drifts. The feature engineering guide is the long version; the short version is that a feature must describe behaviour that can recur — how far, how fast, how unusual — in a form whose distribution is the same in every year.
The check: permutation importance on the out-of-sample window. Shuffle each feature and measure the drop in score. If shuffling every feature in turn changes nothing, the model wasn't using any of them, because there was nothing in them to use.
3. The label is badly defined
A label that is unbalanced (85% "no trade"), that overlaps itself (ten-bar horizons on every bar, so consecutive labels share nine bars of outcome), or that is measured from the wrong bar (from the signal bar's close instead of the next open) gives the model a target it cannot learn or one it learns for the wrong reason. Overlapping labels are especially nasty: they make the training set look ten times larger than it is, and the purge gap exists partly because of them.
The check: print the label's base rate, the average overlap between consecutive labels, and the bar the outcome is measured from. Fix all three before touching a feature.
4. The test is finally honest, and there was no edge
This is the one nobody wants. The idea — the pattern, the indicator, the setup — never had predictive content, and every earlier test that said otherwise had a leak. Now the leak is gone and the truth is 50%. It is worth remembering that a systematic 50% is not a personal failure; it is the base state of a competitive market, and most ideas are supposed to land there. The edge guide is about what it takes for an idea not to.
The check: run the idea as a plain rule without the model. If the rule's expectancy after costs is zero, the model was being asked to find structure in a signal that has none, and no model will.
5. The metric is hiding a usable signal
Here is the case that turns the page around. A model at 52% accuracy overall can be at 60% on the fifth of its predictions where it was most confident — and that fifth is the only part you intended to trade. Averaged over everything, it looks like a coin. Filtered to the confident subset, it is a strategy. This is the entire argument for meta-labeling (a second model that decides whether to act on the first) and for ensemble voting (act only when several models agree): both trade fewer times at higher precision, and both look unremarkable on an accuracy line.
The check: sort out-of-sample predictions by the model's confidence, split into fifths, and compute precision per fifth. Flat across the fifths: no signal. Rising: you have one, and it lives in the top bucket.
| What you see | Likely cause | The check |
|---|---|---|
| 50% on next-bar direction, every model family | Label unpredictable at that horizon | Longer horizon, volatility-unit target; rerun with the same features |
| Shuffling any feature changes nothing | Features carry no information | Out-of-sample permutation importance; rebuild features as returns, ratios, ranks |
| Great in sample, 50% out; base rate far from 50% | Label unbalanced or overlapping | Print base rate, overlap, measurement bar; add a purge gap |
| Plain rule has zero expectancy after costs | No edge in the idea | Test the rule without the model; if it is flat, stop |
| 50% overall, but top-confidence fifth clearly higher | Signal exists in a subset | Precision by confidence bucket; trade only the top bucket |
| Accuracy 55%, MCC near zero | Model predicts the majority class | Confusion matrix; MCC; balanced label |
The diagnostic order: model last
The instinct when a model scores 50% is to try a different model. It is the least likely fix. Grinsztajn, Oyallon and Varoquaux (2022) found tree models generally beat deep learning on tabular data, and the model comparison finds the six families land within a few points of each other when the label and features are sound — which means that when they all land on 50%, the model was never the variable. Run the checks in this order:
- The label. Base rate, overlap, measurement bar, horizon, units. Fix before anything else.
- The horizon. If it is one bar, change it and see what moves.
- The features. Stationary? Shift-tested? Any that survive permutation importance out of sample?
- The metric. MCC, and precision by confidence bucket, not accuracy.
- The idea. Does the rule have expectancy without the model?
- The model. Only now. And try a simpler one before a bigger one.
What a realistic result looks like
Recalibrate what "working" means. On a balanced, volatility-unit label at a multi-bar horizon, for a single liquid instrument, an honest out-of-sample model in our experience sits in the low-to-mid fifties on accuracy, with an MCC that is small but consistently positive across walk-forward windows, and precision on the most confident fifth of predictions that is materially higher than the overall number. That is not a tutorial result. It is a real one, and it is enough — because the strategy does not need to call every bar. It needs to be right more often than it is wrong on the bars it chooses, after costs, over a trade count that can prove it.
- Accuracy a few points above the base rate, not twenty.
- MCC positive in most walk-forward windows, not large in any.
- Precision that rises with confidence — the shape matters more than the level.
- A stable feature importance ranking from window to window.
- Expectancy after realistic costs that survives a cost multiplier of 1.5×.
How this looks in Wise Apple
Wise Apple's report leads with the out-of-sample numbers — MCC as Skill, plus precision and recall — computed on the Walk-Forward Window test periods only, so the metric that says "no skill" is the one shown, not an in-sample accuracy. Triple-Barrier Labels replace the fixed next-bar sign with a volatility-unit target and horizon, Meta-Labeling adds the second model that decides whether to act, and Ensemble Voting trades only when several of the 19 models on the bench agree — which is how a weak-but-real signal is turned into a small number of higher-precision trades rather than a coin flip on every bar. It runs in the browser on your own machine, tests one instrument at a time, and is early software from one builder.
Questions traders ask when a model scores 50%
What is a good accuracy for a stock prediction model?
Lower than the tutorials suggest. On a balanced label at a multi-bar horizon, an honest out-of-sample model typically lands only a few points above the base rate, with a small but consistently positive Matthews correlation coefficient. What matters more than the overall accuracy is whether precision rises with the model's confidence, because a strategy only trades the confident subset. Accuracies in the seventies or higher on market data almost always indicate leakage.
Why does my machine learning model get exactly 50% on trading data?
Usually one of five things: the label (often next-bar direction) is close to unpredictable at that horizon; the features are raw prices and indicators that carry no stationary information; the label is unbalanced, overlapping or measured from the wrong bar; the idea never had an edge and an honest test finally showed it; or the signal exists only in the model's most confident predictions and accuracy averages it away. Check the label and horizon first, the features second, and the model last.
Is an AUC of 0.5 on a trading model always a failure?
It means the model's ranking of outcomes is no better than random across all predictions. That is a failure for the model as built, but not necessarily for the idea. Change the label to a volatility-unit target over several bars, rebuild features as returns, ratios and ranks, and look at precision by confidence bucket rather than the aggregate. If every version stays at 0.5 and the plain rule has no expectancy after costs, the idea has no edge and should be dropped.
Has anyone actually made machine learning work for trading?
Yes, but the successes look modest on paper. Published work such as Gu, Kelly and Xiu (2020) finds that machine-learning models beat linear ones on stock returns with predictive power that is small in absolute terms yet economically meaningful. In practice that means a model that is right slightly more often than wrong on the trades it selects, with precision concentrated in its confident predictions, validated across walk-forward windows and after realistic costs. Anyone showing much larger numbers is usually showing a leak.