Do classic candlestick patterns have a real intraday edge?

candlebench turns every signal from 66 textbook patterns into a mechanical trade. It charges each trade the spread quoted at that time of day, and compares it with random entries that take the same risk. A pattern counts only if it beats those entries, makes money after costs, and holds up on later dates it was not chosen on.

The answer

The run covers two years of 1-minute bars for 117 liquid US stocks and ETFs: 1,021,358 pattern trades at a quoted 2.39 bps per leg. No pattern has an edge. None with enough trades to measure has positive expectancy after costs, and none beats its own matched random entries even before costs once multiple comparisons are corrected for.

A second run at 5-minute, 15-minute and 1-hour bars over the same two years (227,879 pattern trades at 2.21 bps per leg) finds the same: no pattern beats its matched random entries at any of the three timeframes.

Explore the results

Two years of real market data → The interactive dashboard: sort the leaderboard, switch timeframes, and drill into any pattern's equity curve, breakdowns and individual trades. Statistics only, no market prices. 5m, 15m and 1h bars → The same dashboard for the coarser timeframes: 5,000 sampled symbol-days each, with a tab per timeframe and a pooled view. Statistics only, no market prices. Synthetic demo → The same dashboard on a generated random walk, rebuilt from the latest code on every push, including bar-by-bar session charts. Nothing here can be predicted, so any edge would be a false positive.

Each also comes as a single shareable HTML report: two-year 1m report, 5m, 15m and 1h report and demo report.

How the method was checked

A method that finds edges in noise is not measuring anything. On a synthetic random walk, comparing patterns with random entry in net R flagged 38 of 800 rows as winners. Wider stops pay fewer R for the same spread. A control placed before its pattern also trades through bars the pattern was selected on, and loses up to 0.56R on pure noise. With both fixed, 1 row in 800 passes: what a 5% familywise error rate predicts.

The other half is power. When a known edge is planted, an advantage over random entry of 0.14R is caught every time and 0.10R half the time, bracketing the detection limit each leaderboard row reports, so "no edge" comes with a size: on real 1-minute data the frequent patterns cannot be hiding an advantage over random entry larger than 0.02R to 0.03R. Read the power study. Read the calibration.

Run it yourself

No API key or download is needed:

pip install git+https://github.com/dpologdvinity/candlebench
candlebench demo          # synthetic market, full run, interactive dashboard

The dashboard drills from any leaderboard row to the individual trades, and from a trade to its session's chart. candlebench serve --read-only publishes saved runs without letting visitors start new ones.