How much can machine learning improve losing trading strategies?
Take a library of rules that loses money, put a model on top and let it decide which trades to take, then measure what that recovers across 420 rules, two markets and 43 months.
A common pitch for machine learning in systematic trading leaves the strategies alone and puts a model on top of them. The rules keep generating signals, while a model trained on their past trades decides which signals to take, how large to make them or which to rank first. It asks less of the model than forecasting the market outright, since the model only has to judge whether a known rule's next trade will pay.
Testing the pitch fairly takes three controls. A model that trades less will beat a losing baseline without choosing better trades, so the comparison needs a null that trades just as little at random. A library picked because its rules already made money carries that selection into the result, and a gain in forecast accuracy says nothing about whether the P&L survives spreads, fees and funding.
This study puts one model layer on top of a fixed library of 420 technical rules that lose money after costs in both markets tested, at two bar speeds, then walks it forward across 43 months to measure how much of that loss the model can recover. Each model policy is compared with taking every signal and with a simple hand-built filter, under comparisons registered before any out-of-sample number existed.
The exact recipe behind every number sits on its own page: the rule grid, features, model search, walk-forward loop, cost model, inference and checks.
What we tested
Rules. 420 mechanical strategies, 30 parameterisations in each of 14 families: trend following, mean reversion, breakouts, momentum, volatility expansion and contraction, moving-average crossovers, channel and Donchian breakouts, RSI and Bollinger reversals, volume-confirmed momentum, opening-range breakouts and fixed time-of-day entries. None was chosen because it made money, so losing rules stay in the library, and a rule leaves a training window only for a mechanical reason such as trading too rarely to learn from.
Markets. Ten large US stocks and ten liquid Binance USDT-margined perpetuals, each at 15-minute and one-hour bars, which gives four market-timeframe cells traded out of sample from January 2023 to July 2026. Every trade enters at the next bar's open after the signal and exits after a fixed number of bars with no stops or targets.
Each rule-instrument pair holds at most one position at a time, and every pair gets the same capital.
What the model sees. Market features built from price and volume at the signal bar, the rule's family and parameters, the signal's direction and strength, plus the rule's own recent record in that instrument and across instruments. Costs, spreads, funding and the next bar's opening price are never inputs, because none of them is known when the decision is made.
Models. A regularised linear model, a gradient-boosted tree ensemble and a small neural network, each trained twice: once to predict the trade's net return and once to predict whether it ends in profit. Each month, each model tries 30 fixed configurations, picks one on a held-out slice of the preceding 24 months, refits on all 24 months and predicts the following month once, which comes to 1,032 selected models from 30,960 attempted configurations.
What the model is allowed to do. Three uses, each tested separately. As a filter, it takes a trade only when the prediction is positive; for sizing, every trade goes ahead, scaled between 0.25 and 1.75 times its normal size by where the prediction ranks.
For ranking, it keeps the top fifth of the new signals at each timestamp and gives them the full entry budget of the batch.
Comparators. Every model policy is scored against two alternatives. One is taking every signal, the baseline, while the other is a simple filter that trades only when at least two of three conditions hold (high volatility, a strong trend and high volume), each measured against the instrument's own in-sample median.
Costs. Crypto pays the 5 bp Binance taker fee and 2 bp of slippage per fill plus half the measured spread on entry and exit, along with the actual funding charged while the position is open. Equities pay half the measured spread per fill plus 0.5 bp in fees.
What counts as an improvement. A contrast is credited only when all seven registered bars hold: net return beats the comparator in total and per unit of capital deployed, with a Benjamini-Hochberg-adjusted q below 0.05 across all 144 contrasts, while winning more than half the months with gains larger than losses. The gain must also survive deleting the best month and beat 95% of a null that picks the same number of trades at the same exposure by chance.
A general claim that machine learning improves these strategies needs credited results in both markets, both timeframes and at least two of the three model families.
Results
The models learned something, and crypto's lead is mostly volatility
Pooled over 43 months, the classification models separate winning trades from losing ones with a ROC AUC between 0.512 and 0.523 in equities and between 0.566 and 0.618 in crypto. Rank IC between predicted and realised net return runs from -0.0006 to 0.0135 in equities against 0.0165 to 0.0376 in crypto.
| Cell | ROC AUC, three model families | Volatility × √hold, no model | Rank IC, three model families |
|---|---|---|---|
| Equity 1h | 0.512 to 0.513 | 0.509 | -0.0006 to 0.0085 |
| Equity 15m | 0.521 to 0.523 | 0.515 | 0.0095 to 0.0135 |
| Crypto 1h | 0.566 to 0.574 | 0.554 | 0.0165 to 0.0255 |
| Crypto 15m | 0.606 to 0.618 | 0.603 | 0.0242 to 0.0376 |
Forecast quality over all 43 out-of-sample months. The no-model column scores each trade by 24-bar volatility times the square root of its holding period.
Most of the crypto margin needs no model at all. Scoring each trade by the instrument's recent volatility times the square root of its holding period, a number with no view on direction, already reaches an AUC of 0.554 on one-hour bars and 0.603 on 15-minute bars, because a trade expected to move further is more likely to clear a fixed 14.8 bp round trip whichever way it goes.
Against that score the models add 0.003 to 0.020 of AUC in crypto and 0.004 to 0.009 in equities, so the gap between the markets is far smaller than the raw figures suggest.
The library loses money before any model touches it
Taking every signal loses in all four cells. Returns here are summed daily returns on the book's capital rather than compounded ones, since the crypto books lose more than their capital and compounding would pin every crypto policy near -100%.
| Cell | Trades | Gross per trade | Costs per trade | Net per trade | Summed net return |
|---|---|---|---|---|---|
| Equity 1h | 1,560,113 | +0.62 bp | 3.30 bp | -2.67 bp | -10.65% |
| Equity 15m | 5,272,831 | +0.34 bp | 3.30 bp | -2.96 bp | -39.35% |
| Crypto 1h | 6,888,035 | -0.56 bp | 14.79 bp | -15.36 bp | -268.19% |
| Crypto 15m | 26,187,705 | -0.24 bp | 14.79 bp | -15.02 bp | -993.24% |
Every signal taken. Per-trade figures are averages over every executed trade; costs are spread, fees and slippage, with funding folded into net.
Equity rules make a little gross money and lose it to a 3.3 bp round trip. Crypto rules make nothing gross and then pay 10 bp in taker fees and 4 bp in slippage on every round trip, so any crypto model starts about 15 bp behind.
19 of 144 contrasts pass, and the general claim fails
Nineteen contrasts clear every bar: ten in equity one-hour, seven in equity 15-minute, two in crypto 15-minute and none in crypto one-hour. No crypto contrast is credited against the simple filter, and since the registered general claim needs both markets, it fails: the model improves some of these strategies in some places, not these strategies in general.
All three model families appear among the seventeen equity credits, and all but one of those credits are filters. Sizing is credited nowhere in 48 attempts, while ranking is credited three times against the baseline and never against the simple filter.
| Model use | Credited vs baseline | Credited vs simple filter |
|---|---|---|
| Filter | 7 of 24 | 9 of 24 |
| Sizing | 0 of 24 | 0 of 24 |
| Ranking | 3 of 24 | 0 of 24 |
Two of those ranking credits are in crypto 15-minute bars, where the ranked books lose 910.91% and 927.76% of capital in summed returns against the baseline's 993.24%. Compounded, all three books end at -99.99%, and the registered bar on total net return reads that as a win by 0.00006.
The simple filter is also a weak benchmark. Against the same random-selection null, its picks do worse than chance in every cell, with an empirical p between 0.896 and 0.998, which flatters every contrast measured against it.
Twelve more contrasts pass every other bar and still fail, because they beat their comparator in all 43 months: six equity 15-minute filters and six crypto one-hour filters, five of the latter against the simple filter. With no losing month the reward-to-risk ratio has no denominator, and the frozen scorer counts an undefined value as a fail.
Counting those twelve would make 31 credits and put crypto one-hour among the cells credited against the simple filter. The general claim would still fail on crypto 15-minute bars, where every filter holds so little capital that its loss per unit deployed is larger than the simple filter's.
How the equity filters win
Most of each filter's lead over the baseline comes from trading less. In equity 15-minute bars the filters take between 4.8% and 13.0% of the signals the library produces, against 57.7% for the simple filter, and a book that trades 5% of a losing library loses less for that reason alone.
Skill shows up in the rotation null, which hands a random selector the same number of trades at the same exposure. Every credited filter beats 95% of those random selections, with an empirical p of 0.001, meaning the trades the models keep are better than the trades a coin would keep.
| Policy | Signals taken | Gross per trade | Net per trade | Summed net return | Average exposure | Daily Sharpe |
|---|---|---|---|---|---|---|
| Take every signal | 100% | +0.34 bp | -2.96 bp | -39.35% | 19.6% | -8.92 |
| Simple filter | 57.7% | +0.40 bp | -3.04 bp | -23.31% | 11.8% | -6.05 |
| Linear, net-return filter | 4.8% | +3.92 bp | +0.86 bp | +0.55% | 1.4% | 0.33 |
| Boosted trees, profit filter | 6.7% | +4.07 bp | +0.84 bp | +0.75% | 2.3% | 0.23 |
| Neural net, profit filter | 9.5% | +2.07 bp | -1.18 bp | -1.50% | 3.2% | -0.45 |
Equity 15-minute bars. Summed net return over 43 months on the book's capital; exposure is average gross exposure.
Gross profit per trade rises about twelvefold under the best filters, from 0.34 bp to roughly 4 bp, which clears the 3.3 bp round trip by less than a basis point.
How much the improvement is worth
Three equity 15-minute filters finish in profit after costs, summed over 43 months: the linear net-return filter at +0.55%, the boosted-tree net-return filter at +0.55% and the boosted-tree profit filter at +0.75%. They hold between 1.4% and 2.3% of capital on average with daily Sharpe ratios between 0.20 and 0.33, and none of the three profits is distinguishable from zero on its own, since a bootstrap of weekly P&L resampled by week gives each book a 95% interval that spans zero.
Only the linear one is credited, because both boosted-tree filters are among the contrasts that won every month, while the other three credited equity 15-minute filters lose between 0.98% and 3.78%.
On one-hour equities every credited filter still loses in absolute terms, between -0.23% and -1.77%, and the one credited ranking, boosted trees on 15-minute bars, ends at -8.53%. The only other positive book in the study is the linear profit ranking on one-hour equities at +0.84%, which is not credited because its q-value is 0.35, and whose own weekly interval also spans zero.
That is the size of the improvement. The model layer turns a heavily losing library into a nearly flat one that holds almost no capital most of the time, lifting equity 15-minute bars from -39.35% to between -3.78% and +0.75% depending on the filter.
Why crypto does not follow
In crypto the tree and neural-net filters lift gross profit per trade from about zero to between +3.6 bp and +8.5 bp on 15-minute bars and between +4.5 bp and +5.8 bp on one-hour bars, while the linear net-return filter reaches +10.0 bp on one-hour bars. That is stronger selection than anything in equities, yet with a 14.8 bp round trip the best net figure per trade is still -4.7 bp.
One-hour crypto comes closest. Five of its filters clear every bar against the simple filter except the undefined reward-to-risk one, and all six beat random picks of the same size, yet every one of them still loses money, from -0.20% to -11.58%.
The crypto one-hour linear net-return filter loses only 0.20% in summed returns, and it gets there by taking 16,755 of 6,888,035 signals and holding 0.09% of capital on average. Across the crypto filters, the gross edge the models find covers between a quarter and two-thirds of the cost of acting on it.
Filtering a weak rule library with a model picks trades that beat random picks of the same size, and on equities the best filters lift gross profit per trade twelvefold. The kept trades are too few and too thin to matter, and on crypto the edge they carry is smaller than the fee.
Limitations
- Twenty instruments, four cells and 43 months. The result describes this library on these markets, not machine learning in general or either asset class as a whole.
- Trades exit on a timer with no stops or targets, and a library with different exits gives the model a different target to learn.
- Costs assume the Binance base fee tier with no maker fills, so a desk that rests orders or pays lower fees faces a smaller crypto hurdle, which this study does not measure.
- Twelve contrasts that win every month, six in equity 15-minute bars and six in crypto one-hour bars, are reported as failures because the registered reward-to-risk bar is undefined when nothing loses. The rule was fixed before the run and is kept as written.
- Each cell pools all 420 rules and ten instruments into one model per month, so per-family or per-instrument models would be a different test.
- The purge between inner training and validation is 16 bars of clock time, which an equity trade held overnight can outlast. It changes which configuration wins inside a window but never the out-of-sample scoring, touching under 0.1% of equity training rows in the windows checked.
- Ranking hands the selected fifth the whole batch's entry budget, so the profit-model rankings carry more capital on average than the baseline, 30% to 38% against 18% to 22%.
Every chart on this page is drawn in your browser from the study's result tables and trade ledgers, the same numbers reported in the text and on the reproducibility page, with no image files behind them.
The rule grid, feature list, model search, walk-forward loop, cost model and every check, with hashes and code snippets.

