patternfetch / Methodology / Pattern base-rate study
Study · snapshot 2026-07-18Do chart patterns beat the market's own baseline?
The same bearish engulfing is advertised at 57%, 75.76% and 79% by three widely-cited sources. None of them publishes what the market did anyway. We measured 6 classic patterns across 373,748 non-overlapping occurrences and read every rate against the pattern-free baseline of the same market, timeframe and horizon.
105 categories117 stocks & ETFs10 crypto pairs10-bar horizonas of 2026-07-18Three sources, one pattern, three different truths.
Search for the success rate of a bearish engulfing and you will be told 57%, 75.76%, and 79%. The numbers disagree because they are answers to under-specified questions: measured over which universe, which timeframe, how many bars forward, with what separation between overlapping occurrences, and — the omission that matters most — compared against what?
A directional hit rate cannot be read on its own. Over the ten trading days after any arbitrary moment, with no pattern present at all, US stocks and ETFs in this corpus closed higher 57.8% of the time (n=46,038). A bullish pattern that resolves upward 58% of the time has therefore done nothing. Against a 50% reference it looks like an eight-point edge; against what the market delivered anyway it is +0.2 percentage points.
This page reports what happens when that comparison is made consistently, for every pattern, timeframe and confidence band we publish. It is not an argument that technical analysis is worthless — it is one measurement, with its universe, horizon and limits stated, offered so it can be checked.
50% is the wrong number to beat.
The pattern-free baseline is measured the same way as the pattern itself: same universe, same timeframe, same 10-bar forward window, same non-overlap rule — only without requiring a pattern to be present.
This is why crypto is the useful control. If bullish patterns worked because they detect something real, they should work in both markets. If they only ever reflected drift, the effect should vanish exactly where the drift does — which is what the data shows.
How the numbers were produced.
The same harness produces both tables; only the corpus and the data source differ.
| Parameter | US stocks & ETFs | Crypto |
|---|---|---|
| Universe | 117 liquid US large-caps, core index ETFs and all 11 sector SPDRs | 10 major spot pairs against USDT |
| Source | Yahoo, split- and dividend-adjusted | Binance spot |
| Timeframes | 1h, 4h, 1d, 1w | 1h, 4h, 1d |
| Patterns | bearish engulfing, bullish engulfing, double bottom, double top, hammer, head & shoulders | |
| Confidence bands | 0.00–0.50, 0.50–0.75, 0.75–1.00 (geometric shape score) | |
| Horizon | 10 bars, close to close | |
| Non-overlap | occurrences at least 10 bars apart — one window never contains another | |
| Minimum sample | n ≥ 30 per category | |
| Occurrences | 270,987 | 102,761 |
| Returns | gross-directional — no stop, no fees, no slippage | |
| Snapshot | 2026-07-18 | |
The forward window
A pattern's outcome is measured over the 10 bars after the pattern becomes knowable — the window opens at detection, never at the first bar of the formation. There is no lookahead. Occurrences closer than 10 bars are dropped so that no two measured windows overlap, which keeps a single sustained move from being counted as several independent successes.
That distinction is worth more than it sounds. A chart pattern only becomes knowable two pivot-confirming bars after its low or high prints: nobody can act on the second trough of a double bottom until the bars that confirm it as a trough have closed. Starting the forward window at the pivot itself — the convention in a great many published backtests — leaks those confirming bars into the result and inflates the measured hit rate by roughly 10 percentage points. The rates on this page start the clock at confirmation, which is a large part of why they are lower than the figures in circulation.
The baseline
For each market, timeframe and horizon, the harness measures the unconditional outcome: over all non-overlapping 10-bar forward windows in the same corpus, what fraction closed up, down, or exactly flat. A bullish pattern is scored against the up rate and a bearish one against the down rate, so the comparison is direction-matched. Lift is the hit rate minus that baseline, in percentage points.
The interval
A textbook interval treats every occurrence as independent. It is not: 117 tickers trade simultaneously and a market-wide day moves most of them together, so 117 observations sharing a date carry far less than 117 observations' worth of information. Both the pattern sample and the baseline sample are therefore aggregated into UTC calendar-day clusters, and the variance is taken across cluster totals, which allows observations inside a day to correlate arbitrarily. At the median this widens the interval by 1.4×. Both intervals are published; every verdict on this page is decided on the clustered one.
Day clusters absorb the cross-sectional market factor. They do not absorb serial correlation across days, so even the clustered interval should be read as a floor rather than a ceiling.
Across 105 categories, no lift survives correction.
Each mark below is one pattern × timeframe × confidence band. The dot is the measured lift over that category's own baseline; the whisker is the cluster-robust 95% interval. 3 of the 105 intervals exclude zero — all 3 in crypto, and §06 takes each of them apart.
The headline case: daily, high-confidence, US equities
The largest samples in the study — the clean-shape band on the daily bar, where a textbook pattern would have the best chance of showing itself.
| Pattern | n | Hit rate | Baseline | Lift | 95% CI | Reading |
|---|---|---|---|---|---|---|
| bearish engulfing | 12,842 | 41.3% | 42.0% | −0.7pp | ±2.6pp | No lift |
| bullish engulfing | 11,535 | 58.2% | 57.8% | +0.4pp | ±2.6pp | No lift |
| double bottom | 6,692 | 56.9% | 57.8% | −0.9pp | ±2.8pp | No lift |
| double top | 7,508 | 43.1% | 42.0% | +1.1pp | ±2.7pp | No lift |
| hammer | 5,600 | 57.7% | 57.8% | −0.1pp | ±2.7pp | No lift |
| head & shoulders | 2,795 | 42.0% | 42.0% | +0.0pp | ±3.1pp | No lift |
Confidence band 0.75–1.00 · 10-bar horizon · intervals cluster-robust on the calendar day. The bearish rows sit near the 42.0% bearish baseline and the bullish rows near the 57.8% bullish one — the spread between the two columns of hit rates is the drift, not the patterns.
The control: the same six patterns on crypto
| Pattern | n | Hit rate | Baseline | Lift | 95% CI | Reading |
|---|---|---|---|---|---|---|
| bearish engulfing | 1,214 | 50.2% | 50.6% | −0.4pp | ±4.0pp | No lift |
| bullish engulfing | 1,150 | 50.1% | 49.3% | +0.8pp | ±4.1pp | No lift |
| double bottom | 122 | 47.5% | 49.3% | −1.8pp | ±10.0pp | No lift |
| double top | 139 | 50.4% | 50.6% | −0.2pp | ±8.9pp | No lift |
| hammer | 262 | 44.7% | 49.3% | −4.6pp | ±7.5pp | No lift |
| head & shoulders | 65 | 49.2% | 50.6% | −1.4pp | ±12.6pp | No lift |
Same patterns, same band, same horizon — but the baselines are all near 50%, and so are the hit rates. The bullish/bearish spread visible in the equities table has disappeared along with the drift that produced it.
The hit rate is the baseline, plus noise.
Plotting each category's measured rate against the baseline it should be compared with collapses the whole study into one line.
What survives, and why we do not report it as a finding.
Before clustering, 14 of the 105 categories showed a lift whose interval excluded zero. After clustering on the calendar day, 3 remain. All 3 are crypto categories, and 2 of them rest on fewer than 200 occurrences. They are listed here in full rather than left out.
| Market | Pattern | TF | Band | n | Lift | 95% CI | Bonferroni CI | After correction |
|---|---|---|---|---|---|---|---|---|
| Crypto | bullish engulfing | 1h | 0.75-1.00 | 8,897 | −1.8pp | ±1.4pp | ±2.4pp | Fails |
| Crypto | double bottom | 1d | 0.50-0.75 | 143 | −12.2pp | ±8.9pp | ±15.9pp | Fails |
| Crypto | double top | 1d | 0.50-0.75 | 149 | +9.8pp | ±8.4pp | ±15.0pp | Fails |
Two reasons not to call these discoveries. First, 3 is fewer than chance predicts. Running 105 tests at the 5% level yields about 5.3 exclusions even when every true effect is zero; finding 3 is what a null result looks like, not evidence against one. Second, none survives correction for having run 105 tests. Widening each interval by the Bonferroni factor (z from 1.96 to 3.49) leaves all 3 covering zero.
Note also that the two daily crypto rows point in opposite directions on mirror-image patterns: the double bottom trails its baseline by 12.2pp while the double top beats its own by 9.8pp, on 143 and 149 occurrences. A pair of small samples disagreeing that neatly is the signature of noise.
What this measurement cannot tell you.
Each of these could move the result, and none is fixed by the analysis above.
- Windows overlap across tickers. The 10-bar separation rule removes overlap within a symbol, not across them: on any given day most of the 117 tickers are inside someone's forward window. Day clustering is a response to this, but it absorbs the cross-sectional factor only — serial correlation from one day to the next is untreated, so the true intervals are wider than the ones published here.
- The ticker universe is survivorship-biased. The corpus is liquid US large-caps and ETFs as constituted today. Companies that were delisted, acquired or collapsed are absent. This inflates the baseline — the drift measured here is the drift of the survivors. It biases the baseline upward, which if anything makes a bullish pattern's lift look worse and a bearish one's look better, so it cannot explain away a null result in both directions at once.
- Hourly history is capped. Yahoo serves roughly 730 days of 60-minute bars, so the 1h and 4h equity categories cover a much shorter and more recent span than the daily and weekly ones — a single regime rather than several.
- One horizon, one exit. Everything is measured at exactly 10 bars, close to close. A pattern that resolves in three bars or in forty is invisible here, and so is any effect that a stop, a target or a trailing exit would surface. Nothing in this study rules those out.
- Gross and directional. Returns carry no fees, no slippage, no spread and no borrow cost. Direction is all that is counted: a category can hit its direction more often and still lose money if the wins are small and the losses large. The distribution is measured separately and shipped with the API, but it is not what is tested here.
- Detector-specific. These are our geometric definitions of the six patterns at our confidence bands. A different detector draws different occurrences. The finding is about these definitions on this corpus — it does not generalise to every implementation of a head and shoulders.
- One snapshot. Everything is as of 2026-07-18. The tables are recomputed periodically and the numbers will move.
If patterns carry no lift, why sell a pattern API?
Fair question, and the honest answer is that the null result is the product rather than a problem for it.
A language model asked what a head and shoulders implies does not abstain. It answers from what the open web says, and the open web says 57%, 75.76% or 79% — confident figures with no baseline, no interval and no sample size behind them. An agent that acts on those has been handed a hallucination with a decimal point on it. Returning the measured hit rate together with its baseline, its cluster-robust interval and its n is what makes the model's uncertainty match reality. Knowing a signal is noise is worth paying for, because the alternative is a model that confidently believes otherwise.
The detection itself also remains useful as description rather than prediction: where the shape sits, what it spans, which level it is pressing against. And this result is narrow. It says nothing about trend and regime, support and resistance levels or interpreted indicators — all of which are measurements of the current state rather than directional claims about the next ten bars, and none of which this study touches.
Check any row on this page.
The evidence block behind every figure here is the same one the API returns inline. /v1/demo needs no key and no signup.
# the evidence block for a live detection
curl -X POST https://patternfetch.com/v1/demo \
-H "content-type: application/json" \
-d '{ "ticker": "SPY", "timeframe": "1d" }'
→ response carries baseline, lift, interval and n
{ "patterns": [{
"name": "bearish_engulfing",
"confidence": 1.00,
"evidence": {
"hitRate": 0.413,
"baseline": 0.420,
"lift": -0.007,
"ci95Clustered": 0.026,
"n": 12842,
"informative": false } }] }
A small Python CLI and library that runs against the keyless demo endpoint and prints each detected pattern's hit rate next to its baseline for a whole watchlist. It recomputes the interval from the reported hit rate and sample size rather than trusting the one it is handed, and classifies on the interval instead of the point estimate — so a category only reads as an edge when its whole interval clears the baseline. It is the tool that produced the finding on this page, and it disagrees with our API loudly when the two diverge. Source and notebook: github.com/MarvinRey7879/honest-signals (MIT) — the numbers it reports are the ones tabulated above.
All 105 categories.
Every category in the study, unfiltered. Wald is the textbook interval; clustered is the one every verdict on this page uses.
| Market | Pattern | TF | Band | n | Hit | Baseline | Lift | Wald | Clustered |
|---|---|---|---|---|---|---|---|---|---|
| Crypto | bearish engulfing | 1h | 0.50-0.75 | 3,977 | 49.7% | 49.2% | +0.5pp | ±1.7 | ±1.8 |
| Crypto | bearish engulfing | 1h | 0.75-1.00 | 9,052 | 48.8% | 49.2% | −0.4pp | ±1.2 | ±1.4 |
| Crypto | bearish engulfing | 4h | 0.50-0.75 | 2,222 | 49.4% | 50.1% | −0.7pp | ±2.3 | ±2.8 |
| Crypto | bearish engulfing | 4h | 0.75-1.00 | 5,508 | 49.1% | 50.1% | −1.0pp | ±1.6 | ±2.2 |
| Crypto | bearish engulfing | 1d | 0.50-0.75 | 505 | 50.3% | 50.6% | −0.3pp | ±4.7 | ±5.4 |
| Crypto | bearish engulfing | 1d | 0.75-1.00 | 1,214 | 50.2% | 50.6% | −0.4pp | ±3.4 | ±4.0 |
| Crypto | bullish engulfing | 1h | 0.50-0.75 | 3,939 | 50.5% | 50.5% | +0.0pp | ±1.7 | ±1.8 |
| Crypto | bullish engulfing | 1h | 0.75-1.00 | 8,897 | 48.7% | 50.5% | −1.8pp | ±1.2 | ±1.4 |
| Crypto | bullish engulfing | 4h | 0.50-0.75 | 2,166 | 50.0% | 49.7% | +0.3pp | ±2.3 | ±2.8 |
| Crypto | bullish engulfing | 4h | 0.75-1.00 | 5,276 | 49.2% | 49.7% | −0.5pp | ±1.6 | ±2.2 |
| Crypto | bullish engulfing | 1d | 0.50-0.75 | 474 | 49.8% | 49.3% | +0.5pp | ±4.9 | ±5.5 |
| Crypto | bullish engulfing | 1d | 0.75-1.00 | 1,150 | 50.1% | 49.3% | +0.8pp | ±3.4 | ±4.1 |
| Crypto | double bottom | 1h | 0.00-0.50 | 4,101 | 49.9% | 50.5% | −0.6pp | ±1.7 | ±2.0 |
| Crypto | double bottom | 1h | 0.50-0.75 | 3,666 | 49.4% | 50.5% | −1.1pp | ±1.8 | ±1.9 |
| Crypto | double bottom | 1h | 0.75-1.00 | 4,938 | 50.2% | 50.5% | −0.3pp | ±1.6 | ±1.9 |
| Crypto | double bottom | 4h | 0.00-0.50 | 2,176 | 50.0% | 49.7% | +0.3pp | ±2.3 | ±3.0 |
| Crypto | double bottom | 4h | 0.50-0.75 | 1,370 | 46.4% | 49.7% | −3.3pp | ±2.8 | ±3.4 |
| Crypto | double bottom | 4h | 0.75-1.00 | 1,508 | 47.5% | 49.7% | −2.2pp | ±2.7 | ±3.5 |
| Crypto | double bottom | 1d | 0.00-0.50 | 254 | 52.4% | 49.3% | +3.1pp | ±6.4 | ±7.5 |
| Crypto | double bottom | 1d | 0.50-0.75 | 143 | 37.1% | 49.3% | −12.2pp | ±8.1 | ±8.9 |
| Crypto | double bottom | 1d | 0.75-1.00 | 122 | 47.5% | 49.3% | −1.8pp | ±9.1 | ±10.0 |
| Crypto | double top | 1h | 0.00-0.50 | 4,074 | 49.3% | 49.2% | +0.1pp | ±1.7 | ±1.9 |
| Crypto | double top | 1h | 0.50-0.75 | 3,712 | 50.9% | 49.2% | +1.7pp | ±1.8 | ±1.9 |
| Crypto | double top | 1h | 0.75-1.00 | 5,133 | 49.2% | 49.2% | +0.0pp | ±1.5 | ±1.9 |
| Crypto | double top | 4h | 0.00-0.50 | 2,115 | 50.6% | 50.1% | +0.5pp | ±2.3 | ±2.9 |
| Crypto | double top | 4h | 0.50-0.75 | 1,385 | 51.7% | 50.1% | +1.6pp | ±2.8 | ±3.3 |
| Crypto | double top | 4h | 0.75-1.00 | 1,577 | 50.6% | 50.1% | +0.5pp | ±2.6 | ±3.1 |
| Crypto | double top | 1d | 0.00-0.50 | 252 | 53.2% | 50.6% | +2.6pp | ±6.4 | ±7.1 |
| Crypto | double top | 1d | 0.50-0.75 | 149 | 60.4% | 50.6% | +9.8pp | ±8.1 | ±8.4 |
| Crypto | double top | 1d | 0.75-1.00 | 139 | 50.4% | 50.6% | −0.2pp | ±8.5 | ±8.9 |
| Crypto | hammer | 1h | 0.50-0.75 | 5,704 | 50.5% | 50.5% | +0.0pp | ±1.5 | ±1.6 |
| Crypto | hammer | 1h | 0.75-1.00 | 2,569 | 49.4% | 50.5% | −1.1pp | ±2.1 | ±2.6 |
| Crypto | hammer | 4h | 0.50-0.75 | 3,460 | 47.7% | 49.7% | −2.0pp | ±1.9 | ±2.5 |
| Crypto | hammer | 4h | 0.75-1.00 | 1,407 | 46.5% | 49.7% | −3.2pp | ±2.8 | ±3.6 |
| Crypto | hammer | 1d | 0.50-0.75 | 764 | 48.6% | 49.3% | −0.7pp | ±4.0 | ±4.6 |
| Crypto | hammer | 1d | 0.75-1.00 | 262 | 44.7% | 49.3% | −4.6pp | ±6.3 | ±7.5 |
| Crypto | head & shoulders | 1h | 0.00-0.50 | 1,391 | 49.2% | 49.2% | +0.0pp | ±2.7 | ±3.2 |
| Crypto | head & shoulders | 1h | 0.50-0.75 | 1,347 | 50.4% | 49.2% | +1.2pp | ±2.8 | ±2.8 |
| Crypto | head & shoulders | 1h | 0.75-1.00 | 2,332 | 48.5% | 49.2% | −0.7pp | ±2.1 | ±2.5 |
| Crypto | head & shoulders | 4h | 0.00-0.50 | 786 | 50.0% | 50.1% | −0.1pp | ±3.6 | ±4.1 |
| Crypto | head & shoulders | 4h | 0.50-0.75 | 583 | 49.9% | 50.1% | −0.2pp | ±4.2 | ±4.7 |
| Crypto | head & shoulders | 4h | 0.75-1.00 | 744 | 50.0% | 50.1% | −0.1pp | ±3.7 | ±4.2 |
| Crypto | head & shoulders | 1d | 0.00-0.50 | 112 | 47.3% | 50.6% | −3.3pp | ±9.4 | ±10.0 |
| Crypto | head & shoulders | 1d | 0.50-0.75 | 41 | 51.2% | 50.6% | +0.6pp | ±15.4 | ±16.3 |
| Crypto | head & shoulders | 1d | 0.75-1.00 | 65 | 49.2% | 50.6% | −1.4pp | ±12.3 | ±12.6 |
| Stocks | bearish engulfing | 1h | 0.50-0.75 | 4,855 | 46.5% | 47.2% | −0.7pp | ±1.5 | ±2.1 |
| Stocks | bearish engulfing | 1h | 0.75-1.00 | 14,374 | 47.1% | 47.2% | −0.1pp | ±0.9 | ±1.8 |
| Stocks | bearish engulfing | 4h | 0.50-0.75 | 749 | 42.9% | 46.0% | −3.1pp | ±3.7 | ±5.3 |
| Stocks | bearish engulfing | 4h | 0.75-1.00 | 3,550 | 44.1% | 46.0% | −1.9pp | ±1.9 | ±3.8 |
| Stocks | bearish engulfing | 1d | 0.50-0.75 | 1,719 | 41.4% | 42.0% | −0.6pp | ±2.4 | ±3.5 |
| Stocks | bearish engulfing | 1d | 0.75-1.00 | 12,842 | 41.3% | 42.0% | −0.7pp | ±1.0 | ±2.6 |
| Stocks | bearish engulfing | 1w | 0.50-0.75 | 1,180 | 40.1% | 38.8% | +1.3pp | ±2.9 | ±4.2 |
| Stocks | bearish engulfing | 1w | 0.75-1.00 | 5,595 | 37.9% | 38.8% | −0.9pp | ±1.5 | ±3.4 |
| Stocks | bullish engulfing | 1h | 0.50-0.75 | 5,028 | 52.3% | 52.7% | −0.4pp | ±1.5 | ±2.0 |
| Stocks | bullish engulfing | 1h | 0.75-1.00 | 14,204 | 52.3% | 52.7% | −0.4pp | ±1.0 | ±1.7 |
| Stocks | bullish engulfing | 4h | 0.50-0.75 | 854 | 53.9% | 54.0% | −0.1pp | ±3.5 | ±4.8 |
| Stocks | bullish engulfing | 4h | 0.75-1.00 | 3,393 | 52.6% | 54.0% | −1.4pp | ±1.9 | ±3.9 |
| Stocks | bullish engulfing | 1d | 0.50-0.75 | 1,541 | 56.5% | 57.8% | −1.3pp | ±2.5 | ±3.6 |
| Stocks | bullish engulfing | 1d | 0.75-1.00 | 11,535 | 58.2% | 57.8% | +0.4pp | ±1.0 | ±2.6 |
| Stocks | bullish engulfing | 1w | 0.50-0.75 | 1,062 | 59.0% | 61.2% | −2.2pp | ±3.0 | ±4.5 |
| Stocks | bullish engulfing | 1w | 0.75-1.00 | 5,373 | 59.6% | 61.2% | −1.6pp | ±1.5 | ±3.7 |
| Stocks | double bottom | 1h | 0.00-0.50 | 8,544 | 53.8% | 52.7% | +1.1pp | ±1.2 | ±1.8 |
| Stocks | double bottom | 1h | 0.50-0.75 | 7,762 | 52.6% | 52.7% | −0.1pp | ±1.2 | ±2.0 |
| Stocks | double bottom | 1h | 0.75-1.00 | 10,075 | 51.5% | 52.7% | −1.2pp | ±1.1 | ±1.9 |
| Stocks | double bottom | 4h | 0.00-0.50 | 2,142 | 52.6% | 54.0% | −1.4pp | ±2.3 | ±4.4 |
| Stocks | double bottom | 4h | 0.50-0.75 | 1,575 | 52.7% | 54.0% | −1.3pp | ±2.6 | ±4.4 |
| Stocks | double bottom | 4h | 0.75-1.00 | 1,773 | 54.1% | 54.0% | +0.1pp | ±2.5 | ±4.3 |
| Stocks | double bottom | 1d | 0.00-0.50 | 8,573 | 57.2% | 57.8% | −0.6pp | ±1.1 | ±2.7 |
| Stocks | double bottom | 1d | 0.50-0.75 | 5,818 | 57.3% | 57.8% | −0.5pp | ±1.3 | ±2.8 |
| Stocks | double bottom | 1d | 0.75-1.00 | 6,692 | 56.9% | 57.8% | −0.9pp | ±1.3 | ±2.8 |
| Stocks | double bottom | 1w | 0.00-0.50 | 1,591 | 61.7% | 61.2% | +0.5pp | ±2.5 | ±4.0 |
| Stocks | double bottom | 1w | 0.50-0.75 | 982 | 63.4% | 61.2% | +2.2pp | ±3.1 | ±4.2 |
| Stocks | double bottom | 1w | 0.75-1.00 | 945 | 61.2% | 61.2% | +0.0pp | ±3.2 | ±4.6 |
| Stocks | double top | 1h | 0.00-0.50 | 8,388 | 47.4% | 47.2% | +0.2pp | ±1.2 | ±2.0 |
| Stocks | double top | 1h | 0.50-0.75 | 7,948 | 47.2% | 47.2% | −0.0pp | ±1.2 | ±2.0 |
| Stocks | double top | 1h | 0.75-1.00 | 10,502 | 47.2% | 47.2% | −0.0pp | ±1.1 | ±2.0 |
| Stocks | double top | 4h | 0.00-0.50 | 2,265 | 46.7% | 46.0% | +0.7pp | ±2.2 | ±4.0 |
| Stocks | double top | 4h | 0.50-0.75 | 1,615 | 47.9% | 46.0% | +1.9pp | ±2.6 | ±4.3 |
| Stocks | double top | 4h | 0.75-1.00 | 1,966 | 45.9% | 46.0% | −0.1pp | ±2.4 | ±4.1 |
| Stocks | double top | 1d | 0.00-0.50 | 9,032 | 42.5% | 42.0% | +0.5pp | ±1.1 | ±2.6 |
| Stocks | double top | 1d | 0.50-0.75 | 6,314 | 41.1% | 42.0% | −0.9pp | ±1.3 | ±2.7 |
| Stocks | double top | 1d | 0.75-1.00 | 7,508 | 43.1% | 42.0% | +1.1pp | ±1.2 | ±2.7 |
| Stocks | double top | 1w | 0.00-0.50 | 1,846 | 35.8% | 38.8% | −3.0pp | ±2.3 | ±3.6 |
| Stocks | double top | 1w | 0.50-0.75 | 1,080 | 36.3% | 38.8% | −2.5pp | ±3.0 | ±4.5 |
| Stocks | double top | 1w | 0.75-1.00 | 1,098 | 36.1% | 38.8% | −2.7pp | ±2.9 | ±4.2 |
| Stocks | hammer | 1h | 0.50-0.75 | 10,601 | 52.0% | 52.7% | −0.7pp | ±1.1 | ±1.8 |
| Stocks | hammer | 1h | 0.75-1.00 | 4,790 | 53.8% | 52.7% | +1.1pp | ±1.5 | ±2.3 |
| Stocks | hammer | 4h | 0.50-0.75 | 3,082 | 53.0% | 54.0% | −1.0pp | ±2.0 | ±3.7 |
| Stocks | hammer | 4h | 0.75-1.00 | 1,367 | 51.6% | 54.0% | −2.4pp | ±2.8 | ±4.6 |
| Stocks | hammer | 1d | 0.50-0.75 | 12,605 | 56.3% | 57.8% | −1.5pp | ±1.0 | ±2.4 |
| Stocks | hammer | 1d | 0.75-1.00 | 5,600 | 57.7% | 57.8% | −0.1pp | ±1.4 | ±2.7 |
| Stocks | hammer | 1w | 0.50-0.75 | 4,452 | 62.7% | 61.2% | +1.5pp | ±1.6 | ±3.3 |
| Stocks | hammer | 1w | 0.75-1.00 | 1,993 | 60.8% | 61.2% | −0.4pp | ±2.3 | ±4.1 |
| Stocks | head & shoulders | 1h | 0.00-0.50 | 2,893 | 47.8% | 47.2% | +0.6pp | ±1.9 | ±2.6 |
| Stocks | head & shoulders | 1h | 0.50-0.75 | 3,085 | 45.3% | 47.2% | −1.9pp | ±1.8 | ±2.5 |
| Stocks | head & shoulders | 1h | 0.75-1.00 | 5,189 | 47.9% | 47.2% | +0.7pp | ±1.4 | ±2.3 |
| Stocks | head & shoulders | 4h | 0.00-0.50 | 766 | 45.0% | 46.0% | −1.0pp | ±3.6 | ±5.0 |
| Stocks | head & shoulders | 4h | 0.50-0.75 | 572 | 46.3% | 46.0% | +0.3pp | ±4.2 | ±5.3 |
| Stocks | head & shoulders | 4h | 0.75-1.00 | 713 | 48.9% | 46.0% | +2.9pp | ±3.8 | ±5.4 |
| Stocks | head & shoulders | 1d | 0.00-0.50 | 3,033 | 43.9% | 42.0% | +1.9pp | ±1.8 | ±3.1 |
| Stocks | head & shoulders | 1d | 0.50-0.75 | 2,152 | 44.0% | 42.0% | +2.0pp | ±2.1 | ±3.4 |
| Stocks | head & shoulders | 1d | 0.75-1.00 | 2,795 | 42.0% | 42.0% | +0.0pp | ±1.9 | ±3.1 |
| Stocks | head & shoulders | 1w | 0.00-0.50 | 643 | 37.8% | 38.8% | −1.0pp | ±3.8 | ±5.2 |
| Stocks | head & shoulders | 1w | 0.50-0.75 | 366 | 32.8% | 38.8% | −6.0pp | ±4.9 | ±6.0 |
| Stocks | head & shoulders | 1w | 0.75-1.00 | 402 | 35.3% | 38.8% | −3.5pp | ±4.7 | ±5.6 |
105 categories · 373,748 non-overlapping occurrences · horizon 10 bars · snapshot 2026-07-18 · gross-directional, no fees or slippage.
What people ask about this result.
Do classic chart patterns work?
Why compare against a baseline instead of 50%?
What does "cluster-robust" mean and why does it matter?
Are those remaining findings real?
Why does crypto behave differently from stocks?
If patterns carry no lift, why does patternfetch detect them?
How can I reproduce this?
Is this investment advice?
Every brief ships the number that says whether to believe it.
Hit rate, baseline, lift, cluster-robust interval and sample size — inline, on every detected pattern, for stocks, ETFs and crypto.