Entropy Collapse as a Volatility Timing Signal
Shannon entropy of price returns drops before big moves. We built a strategy around it. It worked on one pair, one timeframe, and nothing else. This is its obituary.
The Verdict
ECVT is dead. Iâm writing the headstone.
+198 bps on EURUSD hourly over two years. Gorgeous, right? Then -64 on EURGBP, -108 on GBPUSD, -88 on SPY, -17 on tick data. We even tried combining it with Hurst exponents â that made it worse. A signal that only works on one pair at one timeframe isnât an edge. Itâs a coincidence that survived long enough to get a backtest.
What follows is the full post-mortem. The information theory behind it is genuinely beautiful â Shannon entropy applied to return distributions to detect the coiling before a breakout. The math deserved better than what the market gave it. But the market doesnât grade on elegance.
The Idea
Every volatility indicator youâve ever used is a rearview mirror. ATR spikes after the breakout. Bollinger Bands expand after the range breaks. By the time you measure high volatility, youâve already missed the entry.
We wanted to catch the coil before the spring.
Shannon entropy measures disorder. The intuition is almost too clean: before a breakout, price compresses. Returns cluster into a narrow range. The distribution tightens. Entropy drops. Then everything snaps.
The inspiration came from Singha (2025), âHidden Order in Trades Predicts the Size of Price Movesâ â tick-level Markov transition entropy predicting move magnitude with a 2.89Ă multiplier. We adapted it to hourly OHLC on forex. In retrospect, âadaptedâ is generous. We took a microscope-grade signal and squinted at it through binoculars. The granularity that made the original work was exactly what we threw away.
The Math
Shannon entropy for a discrete probability distribution:
H(X) = -ÎŁ p(xᔹ) logâ p(xᔹ) for i = 1 to n
Discretize a rolling window of returns into histogram bins. When returns concentrate (pre-breakout compression), fewer bins carry mass, entropy drops. When returns scatter (normal regime), entropy stays high.
Z-score normalization catches relative collapse â not absolute low entropy, but entropy significantly below its own recent mean. Different regimes have different baselines, so you need this.
Signal fires when the z-score drops below threshold: the distribution has compressed abnormally. Something is coiling.
This is sound information theory. The math never lied. The lie was assuming that every coil releases in a tradeable direction â turns out only EURUSD hourly ones do, apparently, and even thatâs probably luck.
Implementation
The code works fine. The signal it produces doesnât generalize. Here it is anyway, because the implementation isnât what failed.
import numpy as np
import pandas as pd
def compute_shannon_entropy(returns: pd.Series, bins: int = 10) -> float:
counts, _ = np.histogram(returns.dropna(), bins=bins)
probs = counts / counts.sum()
probs = probs[probs > 0]
return -np.sum(probs * np.log2(probs))
def entropy_collapse_signal(df, lookback=50, bins=10, threshold=1.8):
df = df.copy()
df['returns'] = df['close'].pct_change()
df['entropy'] = df['returns'].rolling(lookback).apply(
lambda x: compute_shannon_entropy(x, bins=bins), raw=False
)
df['entropy_z'] = (
(df['entropy'] - df['entropy'].rolling(200).mean())
/ df['entropy'].rolling(200).std()
)
df['signal'] = (df['entropy_z'] < -threshold).astype(int)
return df
Direction from 20-period EMA slope. Entry at next bar open. 15-pip stop, 50-pip target, 24-bar timeout.
Results: EURUSD Hourly
44 trades over 2 years (Jan 2024 â Feb 2026).
| Metric | Value |
|---|---|
| Trades | 44 |
| Win Rate | 41% |
| Profit Factor | 1.44 |
| Total | +198 bps |
| Avg Win / Avg Loss | 2.08Ă |
Walk-forward: 10 out of 20 windows profitable. Aggregate OOS: +220 bps.
Per-window OOS returns. 10/20 profitable â literally a coin flip.
In isolation, this looked like a marginal edge. PF 1.44 on 44 trades has roughly a 30% chance of showing up by pure chance. The 50% walk-forward hit rate is exactly what a random signal produces. But we wanted to believe the information theory â the math was so clean â so we kept testing. Thatâs the trap. Beautiful theory makes you generous with ambiguous data.
The Kills
EURGBP Hourly
If entropy collapse is structural to forex, it should transfer to correlated pairs. We tested on EURGBP â 28.8M ticks from Darwinex, aggregated to 12,801 hourly bars. Same parameters.
| Metric | EURUSD | EURGBP |
|---|---|---|
| Trades | 44 | 23 |
| Win Rate | 41% | 30% |
| Profit Factor | 1.44 | 0.76 |
| Total | +198 bps | -64 bps |
| Stop-outs | â | 61% |
Dead on arrival. Only 16 OOS trades across 9 walk-forward windows. Thatâs not a small sample â itâs a rounding error.
GBPUSD Hourly
-108 bps. The entropy signal walked into a different microstructure and bled out.
Equities (SPY, QQQ, IWM, GLD, TLT)
SPY: 9 trades, -88 bps, 89% stop-outs. The others fired 0â5 times over two years. Not enough to evaluate, and that is the evaluation. Session-based markets donât have continuous entropy dynamics â they close at 4pm and gap at 9:30am. The signal doesnât underperform on equities. It barely exists there.
Tick Data
We went back to the source. If OHLC was too coarse, maybe tick-level data would recover the Singha result. -17 bps. The hourly aggregation wasnât hiding a tick-level edge â it was manufacturing one through information loss. The artifact lived in the compression, not in the market. That one hurt. Weâd been trading a lossy-encoding glitch.
ECVT + Hurst Exponent
Hurst measures persistence. Below 0.5 = mean-reverting, above 0.5 = trending. Combining with ECVT seemed logical: entropy collapse says something is about to happen, Hurst says what kind of regime youâre in.
-86 bps OOS. Worse than either signal alone. Two marginal signals donât compound into an edge. They compound into more noise wearing a fancier hat.
Summary of Death
| Test | Result |
|---|---|
| EURUSD 1H | +198 bps |
| EURGBP 1H | -64 bps |
| GBPUSD 1H | -108 bps |
| SPY daily | -88 bps (9 trades) |
| EURUSD ticks | -17 bps |
| ECVT + Hurst OOS | -86 bps |
| Everything except EURUSD 1H | Dead |
One green row. Five red ones. The green one has 44 trades and a coin-flip walk-forward. The prosecution rests.
Why the Math Was Right and the Strategy Was Wrong
The entropy collapse pattern is real. Iâve seen it with my own eyes in every consolidation-before-breakout sequence. Returns compress, entropy drops, range breaks. Observable, repeatable, grounded in solid information theory.
Three things killed it:
Compression doesnât pick a direction. Entropy collapse says magnitude is coming. It says nothing about which way. We bolted on an EMA-slope heuristic for direction, and it worked on EURUSD and failed everywhere else. Singhaâs paper explicitly predicted magnitude, not direction. We grafted on directionality and the graft rejected.
OHLC is a lobotomy. Singha used tick-level Markov transition matrices. We used histogram bins on hourly returns. The information content gap between those two representations is enormous. Our adaptation was a summary of a summary. Like trying to diagnose a patient from a photograph of their medical chart.
44 trades is not a sample. You need 200+ to separate PF 1.44 from luck with any real confidence. We had 44 on the one pair that worked and fewer everywhere else. A single outlier trade swings the PF by 0.3 in a sample that small. We werenât measuring an edge. We were measuring weather.
What âDeadâ Means
A strategy that works on one asset at one timeframe is not a strategy. Itâs a coincidence that happened to land inside a backtest window.
ECVT is asset-specific (EURUSD only) AND timeframe-specific (hourly OHLC only). It dies on other pairs, dies on equities, dies on tick data, and gets worse when you add complementary signals. Every generalization axis came back red. We canât explain why EURUSD hourly entropy collapses would be tradeable but EURGBP ones wouldnât â because they probably arenât. The EURUSD result is noise that looks like a pattern.
The formal kill criteria: if you canât identify why it works on one instrument and not others, and you canât reproduce the edge on related instruments, youâre curve-fitting to noise. We couldnât. So we stopped.
Status: Dead. The underlying observation â that entropy of returns drops before large moves â remains a legitimate insight about market microstructure. But âlegitimate insightâ and âtradeable edgeâ are separated by an ocean, and we sank halfway across.
The entropy collapse pattern deserves better methodology than ours. Tick-level Markov transitions on a broader universe, maybe. But this implementation, with these parameters, on OHLC data? Buried.
Headstone reads: âLooked promising on one pair. Died on contact with everything else. 2024-2026.â
Code: quant-research. See 31 Strategies Tested for where this fits in the larger picture.