There are thousands of tutorials showing an **LSTM Bitcoin prediction** model with a beautiful chart of predicted versus actual price. Almost none of them show a trade. Fewer still show a trade net of fees, on data the model never touched, with a criterion decided in advance.
We built the LSTM version properly, across several architectures and hybrids, and measured it against a gradient-boosted alternative under identical conditions. The neural network lost — not narrowly, and not for the reason most people assume. This is the write-up, because “this doesn’t work, here is the measurement” is more useful than another tutorial.
## The setup: a fair fight, not a straw man
The comparison was run inside one pipeline so that nothing but the model class changed. Same candles, same triple-barrier labels, same purged block splits, same cost model, same Optuna search budget, same selection rule — always by validation, never by test.
Three configurations were compared:
– **LSTM as the model**: sequence input, directional probability output, threshold on the probability.
– **LSTM as a feature generator**: the network’s long/short probabilities fed into a gradient-boosted tree alongside raw features — the hybrid architecture that looks so attractive on paper.
– **Gradient boosting alone**: XGBoost on the engineered feature set, no sequence model anywhere. On the index campaign that set converged to eight inputs — `atr_ratio`, `dist_session_open`, `dist_swing_high_12`, `dist_swing_high_24`, `rs_plus`, `rsj`, `rv_ratio` and `upper_wick_norm` — each admitted one at a time against a frozen baseline.
Every branch was scored the same way, on the same hidden block, with the same commissions.
## The measurement that ended it: the same model, different answers
The decisive finding had nothing to do with Bitcoin. It was this: **the identical configuration, retrained, produced results ranging from 0.86 to 4.11 on the objective.**
Not different configurations. Not different data. The same configuration, the same data, rerun. Training non-determinism at the framework and GPU level — the kind that seeding does not remove once you are on accelerated kernels — was dominating the result. The “champion” configuration with an objective of 4.11 was not a champion. It was a lucky draw from a distribution whose lower tail sat below 1.
That single chart reorganised the whole project. If a configuration’s score moves five-fold on rerun, then every ranking built from single runs is a ranking of luck, and every “improvement” measured against a single baseline run is unmeasured. Thousands of search trials had been implicitly assuming a stability that did not exist.
What we did about it before giving up on the network
We did not archive the neural track on one chart. Three things were tried first:
Ensemble averaging. Running multiple independent members and averaging their outputs collapses most of the dispersion — with enough members the signal floor becomes stable. It works. It also multiplies training cost by the number of members and, critically, it stabilised the score around a level the tree model already beat on its own.
Feature discipline. Cyclical hour encodings were the single largest overfitting vector we have ever measured: they absorbed roughly two-thirds of the model’s importance and collapsed out of sample. Removing them lifted validation SQN from 0.88 to 1.66 in one change. The network was, to a large extent, learning the clock.
Architecture reduction. Shrinking the recurrent layer measurably reduced the train/test gap and raised the proportion of well-generalising trials from 42% to 71% — a real improvement, and still not enough to change the ranking.
After ensemble stabilisation, the honest comparison was: best hybrid objective 1.79 against 3.30 for gradient boosting alone. The sequence model was not adding information. It was adding variance, cost and a training pipeline that could not be reproduced.
Why LSTMs underperform on price data
The reasons generalise well beyond Bitcoin, and they are not “neural networks are bad”.
The signal-to-noise ratio is the wrong regime for deep learning. LSTMs earn their keep where the sequence contains a great deal of learnable structure — language, speech, sensor streams. Daily and hourly returns are close to noise with faint conditional structure. A high-capacity sequence model given near-noise will find structure anyway; that structure is the training set.
Tabular beats sequential when the sequence is already summarised. Most of what a recurrent layer can extract from a price window — momentum, volatility regime, distance to structure, range compression — can be written as a feature directly, computed exactly, and audited. Once you have engineered those features honestly, the network is being asked to rediscover them from scratch with fewer samples.
Non-reproducibility is disqualifying, not inconvenient. In research where you compare thousands of variants and advance the survivors, a model class whose score is a random variable makes the comparison meaningless. Gradient boosting on fixed features is deterministic: same inputs, same model, to the third decimal. That property alone is worth a great deal of ceiling.
Sample size. Eight years of daily candles is a few thousand rows. That is a small dataset by any deep-learning standard and a reasonable one for a regularised tree ensemble.
Where the network is still alive
The conclusion is a scoped one, not a slogan. On short-horizon crypto data, where the sample count is orders of magnitude larger and the model can learn online from a continuous stream, sequence models remain an open line in our research — currently running with drift detection, weight-shadow smoothing, a reduced feature set and, of course, pre-registered kill criteria. If it clears them, it gets written up. If it doesn’t, that gets written up too.
The lesson is not “LSTMs never work”. It is: on daily and hourly price data, with realistic costs and honest out-of-sample discipline, the sequence model has to beat a very strong, very cheap, perfectly reproducible baseline — and in our measurements it did not.
FAQ
Can’t you fix LSTM non-determinism with seeds?
Only partially. Deterministic modes exist but are framework- and hardware-dependent, frequently silently disabled by non-deterministic kernels, and costly in speed. Ensembling is the reliable remedy — it addresses the symptom rather than pretending the variance isn’t there.
Is the hybrid LSTM-plus-XGBoost approach worth trying?
It is worth measuring, which is different from worth deploying. In our tests the probability features from the network did not survive against the same tree model without them. Run the ablation before you commit to the complexity.
What replaced the LSTM?
A gradient-boosted tree on a compact engineered feature set. The reasoning is in XGBoost for trading, and the validation pipeline both models had to pass is in walk-forward analysis for Bitcoin.
This article describes methodology and aggregate results. Full configurations, trained models and exact execution parameters are not published. Nothing here is investment advice, and simulated results are not a guarantee of future performance.