patternfetch / Methodology / Pattern base-rate study

Study · snapshot 2026-07-18

Do 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-18
105pattern × timeframe × confidence-band categories tested
0 / 60stock categories whose lift clears its cluster-robust interval
14 → 3apparent findings, before and after clustering by date
0survive a Bonferroni correction for 105 tests — chance alone predicts ≈5.3
01 · The question

Three 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.

02 · The reference

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.

The reference line, moving. One category, bullish_engulfing · 1d · 0.75–1.00, scored twice against two different references. Its measured hit rate is 58.20% and never changes. Against the conventional 50% reference that reads as +8.20 percentage points of edge. Against the pattern-free baseline of the same market, timeframe and horizon — 57.84%, n=46,038 non-overlapping windows — the same 58.20% leaves +0.36pp, indistinguishable from baseline. Nothing about the pattern changed between the two readings; only the number it was compared against. The clip runs 61 seconds and carries no audio — everything it concludes is stated here and in Figure 1 below.
US stocks & ETFs117 symbols · drift rises with timeframe45%48%51%54%57%60%63%coin flip 50%52.7%1h54.0%4h57.8%1d61.2%1wP(close higher over the next 10 bars) with no pattern present Crypto pairs10 pairs · no comparable drift45%48%51%54%57%60%63%coin flip 50%50.5%1h49.7%4h49.3%1dP(close higher over the next 10 bars) with no pattern present
Figure 1 — the pattern-free baseline, by timeframe. The share of arbitrary 10-bar forward windows that closed higher, with no pattern involved. On US equities this runs from 52.7% on the hourly to 61.2% on the weekly: the longer the bar, the more upward drift the window accumulates. The crypto pairs sit between 49.3% and 50.5%. Both panels share the same axis. Any directional hit rate on the left is competing against a moving target; on the right it is competing against a coin flip.

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.

03 · Method

How the numbers were produced.

The same harness produces both tables; only the corpus and the data source differ.

ParameterUS stocks & ETFsCrypto
Universe117 liquid US large-caps, core index ETFs and all 11 sector SPDRs10 major spot pairs against USDT
SourceYahoo, split- and dividend-adjustedBinance spot
Timeframes1h, 4h, 1d, 1w1h, 4h, 1d
Patternsbearish engulfing, bullish engulfing, double bottom, double top, hammer, head & shoulders
Confidence bands0.00–0.50, 0.50–0.75, 0.75–1.00 (geometric shape score)
Horizon10 bars, close to close
Non-overlapoccurrences at least 10 bars apart — one window never contains another
Minimum samplen ≥ 30 per category
Occurrences270,987102,761
Returnsgross-directional — no stop, no fees, no slippage
Snapshot2026-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.

04 · Results

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.

interval covers zero — no measurable lift interval excludes zero
US stocks & ETFs60 categories · 0 exclude zero-25-20-15-10-50+5+10+15+20no lift← trails baselinebeats baseline → Crypto pairs45 categories · 3 exclude zero-25-20-15-10-50+5+10+15+20no lift← trails baselinebeats baseline →
Figure 2 — lift over baseline, all 105 categories. Both panels share one vertical scale, so the widths are directly comparable: the stock intervals are tight because their samples are large, the crypto intervals wide because several categories rest on a few hundred occurrences. On the 60 stock categories, every single interval covers zero. Across the whole set, 3 intervals exclude it — fewer than the ≈5.3 that 105 independent tests at the 5% level would produce by chance if nothing were there at all.

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.

PatternnHit rateBaselineLift95% CIReading
bearish engulfing12,84241.3%42.0%−0.7pp±2.6ppNo lift
bullish engulfing11,53558.2%57.8%+0.4pp±2.6ppNo lift
double bottom6,69256.9%57.8%−0.9pp±2.8ppNo lift
double top7,50843.1%42.0%+1.1pp±2.7ppNo lift
hammer5,60057.7%57.8%−0.1pp±2.7ppNo lift
head & shoulders2,79542.0%42.0%+0.0pp±3.1ppNo 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

PatternnHit rateBaselineLift95% CIReading
bearish engulfing1,21450.2%50.6%−0.4pp±4.0ppNo lift
bullish engulfing1,15050.1%49.3%+0.8pp±4.1ppNo lift
double bottom12247.5%49.3%−1.8pp±10.0ppNo lift
double top13950.4%50.6%−0.2pp±8.9ppNo lift
hammer26244.7%49.3%−4.6pp±7.5ppNo lift
head & shoulders6549.2%50.6%−1.4pp±12.6ppNo 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.

05 · One picture

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.

US stocks & ETFs (60) Crypto (45)
Every measured rate, against its own baselineAll 105 categories · on the diagonal = the pattern added nothing30%30%40%40%50%50%60%60%70%70%hit rate = baselinemeasured hit rate →pattern-free baseline →
Figure 3 — measured hit rate against its own baseline. If a pattern carried no information, its hit rate would equal its baseline and the point would land on the dashed diagonal. The points do. The stock categories spread along the line from roughly 33% to 63% — that whole range is the baseline moving with timeframe and direction, not the patterns performing differently. The crypto categories bunch at the middle of the line, where their baseline sits. Distance from the diagonal, not height on the chart, is the only thing a pattern can claim credit for.
06 · The 3 exceptions

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.

MarketPatternTFBandnLift95% CIBonferroni CIAfter correction
Cryptobullish engulfing1h0.75-1.008,897−1.8pp±1.4pp±2.4ppFails
Cryptodouble bottom1d0.50-0.75143−12.2pp±8.9pp±15.9ppFails
Cryptodouble top1d0.50-0.75149+9.8pp±8.4pp±15.0ppFails

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.

07 · Limits

What this measurement cannot tell you.

Each of these could move the result, and none is fixed by the analysis above.

08 · The obvious objection

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.

09 · Reproduce it

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.

Request — no key
# 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

Response — abridged
{ "patterns": [{
    "name": "bearish_engulfing",
    "confidence": 1.00,
    "evidence": {
      "hitRate": 0.413,
      "baseline": 0.420,
      "lift": -0.007,
      "ci95Clustered": 0.026,
      "n": 12842,
      "informative": false } }] }
honest-signals — open-source companion

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.

Appendix

All 105 categories.

Every category in the study, unfiltered. Wald is the textbook interval; clustered is the one every verdict on this page uses.

MarketPatternTFBandnHitBaselineLiftWaldClustered
Cryptobearish engulfing1h0.50-0.753,97749.7%49.2%+0.5pp±1.7±1.8
Cryptobearish engulfing1h0.75-1.009,05248.8%49.2%−0.4pp±1.2±1.4
Cryptobearish engulfing4h0.50-0.752,22249.4%50.1%−0.7pp±2.3±2.8
Cryptobearish engulfing4h0.75-1.005,50849.1%50.1%−1.0pp±1.6±2.2
Cryptobearish engulfing1d0.50-0.7550550.3%50.6%−0.3pp±4.7±5.4
Cryptobearish engulfing1d0.75-1.001,21450.2%50.6%−0.4pp±3.4±4.0
Cryptobullish engulfing1h0.50-0.753,93950.5%50.5%+0.0pp±1.7±1.8
Cryptobullish engulfing1h0.75-1.008,89748.7%50.5%−1.8pp±1.2±1.4
Cryptobullish engulfing4h0.50-0.752,16650.0%49.7%+0.3pp±2.3±2.8
Cryptobullish engulfing4h0.75-1.005,27649.2%49.7%−0.5pp±1.6±2.2
Cryptobullish engulfing1d0.50-0.7547449.8%49.3%+0.5pp±4.9±5.5
Cryptobullish engulfing1d0.75-1.001,15050.1%49.3%+0.8pp±3.4±4.1
Cryptodouble bottom1h0.00-0.504,10149.9%50.5%−0.6pp±1.7±2.0
Cryptodouble bottom1h0.50-0.753,66649.4%50.5%−1.1pp±1.8±1.9
Cryptodouble bottom1h0.75-1.004,93850.2%50.5%−0.3pp±1.6±1.9
Cryptodouble bottom4h0.00-0.502,17650.0%49.7%+0.3pp±2.3±3.0
Cryptodouble bottom4h0.50-0.751,37046.4%49.7%−3.3pp±2.8±3.4
Cryptodouble bottom4h0.75-1.001,50847.5%49.7%−2.2pp±2.7±3.5
Cryptodouble bottom1d0.00-0.5025452.4%49.3%+3.1pp±6.4±7.5
Cryptodouble bottom1d0.50-0.7514337.1%49.3%−12.2pp±8.1±8.9
Cryptodouble bottom1d0.75-1.0012247.5%49.3%−1.8pp±9.1±10.0
Cryptodouble top1h0.00-0.504,07449.3%49.2%+0.1pp±1.7±1.9
Cryptodouble top1h0.50-0.753,71250.9%49.2%+1.7pp±1.8±1.9
Cryptodouble top1h0.75-1.005,13349.2%49.2%+0.0pp±1.5±1.9
Cryptodouble top4h0.00-0.502,11550.6%50.1%+0.5pp±2.3±2.9
Cryptodouble top4h0.50-0.751,38551.7%50.1%+1.6pp±2.8±3.3
Cryptodouble top4h0.75-1.001,57750.6%50.1%+0.5pp±2.6±3.1
Cryptodouble top1d0.00-0.5025253.2%50.6%+2.6pp±6.4±7.1
Cryptodouble top1d0.50-0.7514960.4%50.6%+9.8pp±8.1±8.4
Cryptodouble top1d0.75-1.0013950.4%50.6%−0.2pp±8.5±8.9
Cryptohammer1h0.50-0.755,70450.5%50.5%+0.0pp±1.5±1.6
Cryptohammer1h0.75-1.002,56949.4%50.5%−1.1pp±2.1±2.6
Cryptohammer4h0.50-0.753,46047.7%49.7%−2.0pp±1.9±2.5
Cryptohammer4h0.75-1.001,40746.5%49.7%−3.2pp±2.8±3.6
Cryptohammer1d0.50-0.7576448.6%49.3%−0.7pp±4.0±4.6
Cryptohammer1d0.75-1.0026244.7%49.3%−4.6pp±6.3±7.5
Cryptohead & shoulders1h0.00-0.501,39149.2%49.2%+0.0pp±2.7±3.2
Cryptohead & shoulders1h0.50-0.751,34750.4%49.2%+1.2pp±2.8±2.8
Cryptohead & shoulders1h0.75-1.002,33248.5%49.2%−0.7pp±2.1±2.5
Cryptohead & shoulders4h0.00-0.5078650.0%50.1%−0.1pp±3.6±4.1
Cryptohead & shoulders4h0.50-0.7558349.9%50.1%−0.2pp±4.2±4.7
Cryptohead & shoulders4h0.75-1.0074450.0%50.1%−0.1pp±3.7±4.2
Cryptohead & shoulders1d0.00-0.5011247.3%50.6%−3.3pp±9.4±10.0
Cryptohead & shoulders1d0.50-0.754151.2%50.6%+0.6pp±15.4±16.3
Cryptohead & shoulders1d0.75-1.006549.2%50.6%−1.4pp±12.3±12.6
Stocksbearish engulfing1h0.50-0.754,85546.5%47.2%−0.7pp±1.5±2.1
Stocksbearish engulfing1h0.75-1.0014,37447.1%47.2%−0.1pp±0.9±1.8
Stocksbearish engulfing4h0.50-0.7574942.9%46.0%−3.1pp±3.7±5.3
Stocksbearish engulfing4h0.75-1.003,55044.1%46.0%−1.9pp±1.9±3.8
Stocksbearish engulfing1d0.50-0.751,71941.4%42.0%−0.6pp±2.4±3.5
Stocksbearish engulfing1d0.75-1.0012,84241.3%42.0%−0.7pp±1.0±2.6
Stocksbearish engulfing1w0.50-0.751,18040.1%38.8%+1.3pp±2.9±4.2
Stocksbearish engulfing1w0.75-1.005,59537.9%38.8%−0.9pp±1.5±3.4
Stocksbullish engulfing1h0.50-0.755,02852.3%52.7%−0.4pp±1.5±2.0
Stocksbullish engulfing1h0.75-1.0014,20452.3%52.7%−0.4pp±1.0±1.7
Stocksbullish engulfing4h0.50-0.7585453.9%54.0%−0.1pp±3.5±4.8
Stocksbullish engulfing4h0.75-1.003,39352.6%54.0%−1.4pp±1.9±3.9
Stocksbullish engulfing1d0.50-0.751,54156.5%57.8%−1.3pp±2.5±3.6
Stocksbullish engulfing1d0.75-1.0011,53558.2%57.8%+0.4pp±1.0±2.6
Stocksbullish engulfing1w0.50-0.751,06259.0%61.2%−2.2pp±3.0±4.5
Stocksbullish engulfing1w0.75-1.005,37359.6%61.2%−1.6pp±1.5±3.7
Stocksdouble bottom1h0.00-0.508,54453.8%52.7%+1.1pp±1.2±1.8
Stocksdouble bottom1h0.50-0.757,76252.6%52.7%−0.1pp±1.2±2.0
Stocksdouble bottom1h0.75-1.0010,07551.5%52.7%−1.2pp±1.1±1.9
Stocksdouble bottom4h0.00-0.502,14252.6%54.0%−1.4pp±2.3±4.4
Stocksdouble bottom4h0.50-0.751,57552.7%54.0%−1.3pp±2.6±4.4
Stocksdouble bottom4h0.75-1.001,77354.1%54.0%+0.1pp±2.5±4.3
Stocksdouble bottom1d0.00-0.508,57357.2%57.8%−0.6pp±1.1±2.7
Stocksdouble bottom1d0.50-0.755,81857.3%57.8%−0.5pp±1.3±2.8
Stocksdouble bottom1d0.75-1.006,69256.9%57.8%−0.9pp±1.3±2.8
Stocksdouble bottom1w0.00-0.501,59161.7%61.2%+0.5pp±2.5±4.0
Stocksdouble bottom1w0.50-0.7598263.4%61.2%+2.2pp±3.1±4.2
Stocksdouble bottom1w0.75-1.0094561.2%61.2%+0.0pp±3.2±4.6
Stocksdouble top1h0.00-0.508,38847.4%47.2%+0.2pp±1.2±2.0
Stocksdouble top1h0.50-0.757,94847.2%47.2%−0.0pp±1.2±2.0
Stocksdouble top1h0.75-1.0010,50247.2%47.2%−0.0pp±1.1±2.0
Stocksdouble top4h0.00-0.502,26546.7%46.0%+0.7pp±2.2±4.0
Stocksdouble top4h0.50-0.751,61547.9%46.0%+1.9pp±2.6±4.3
Stocksdouble top4h0.75-1.001,96645.9%46.0%−0.1pp±2.4±4.1
Stocksdouble top1d0.00-0.509,03242.5%42.0%+0.5pp±1.1±2.6
Stocksdouble top1d0.50-0.756,31441.1%42.0%−0.9pp±1.3±2.7
Stocksdouble top1d0.75-1.007,50843.1%42.0%+1.1pp±1.2±2.7
Stocksdouble top1w0.00-0.501,84635.8%38.8%−3.0pp±2.3±3.6
Stocksdouble top1w0.50-0.751,08036.3%38.8%−2.5pp±3.0±4.5
Stocksdouble top1w0.75-1.001,09836.1%38.8%−2.7pp±2.9±4.2
Stockshammer1h0.50-0.7510,60152.0%52.7%−0.7pp±1.1±1.8
Stockshammer1h0.75-1.004,79053.8%52.7%+1.1pp±1.5±2.3
Stockshammer4h0.50-0.753,08253.0%54.0%−1.0pp±2.0±3.7
Stockshammer4h0.75-1.001,36751.6%54.0%−2.4pp±2.8±4.6
Stockshammer1d0.50-0.7512,60556.3%57.8%−1.5pp±1.0±2.4
Stockshammer1d0.75-1.005,60057.7%57.8%−0.1pp±1.4±2.7
Stockshammer1w0.50-0.754,45262.7%61.2%+1.5pp±1.6±3.3
Stockshammer1w0.75-1.001,99360.8%61.2%−0.4pp±2.3±4.1
Stockshead & shoulders1h0.00-0.502,89347.8%47.2%+0.6pp±1.9±2.6
Stockshead & shoulders1h0.50-0.753,08545.3%47.2%−1.9pp±1.8±2.5
Stockshead & shoulders1h0.75-1.005,18947.9%47.2%+0.7pp±1.4±2.3
Stockshead & shoulders4h0.00-0.5076645.0%46.0%−1.0pp±3.6±5.0
Stockshead & shoulders4h0.50-0.7557246.3%46.0%+0.3pp±4.2±5.3
Stockshead & shoulders4h0.75-1.0071348.9%46.0%+2.9pp±3.8±5.4
Stockshead & shoulders1d0.00-0.503,03343.9%42.0%+1.9pp±1.8±3.1
Stockshead & shoulders1d0.50-0.752,15244.0%42.0%+2.0pp±2.1±3.4
Stockshead & shoulders1d0.75-1.002,79542.0%42.0%+0.0pp±1.9±3.1
Stockshead & shoulders1w0.00-0.5064337.8%38.8%−1.0pp±3.8±5.2
Stockshead & shoulders1w0.50-0.7536632.8%38.8%−6.0pp±4.9±6.0
Stockshead & shoulders1w0.75-1.0040235.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.

Questions

What people ask about this result.

Do classic chart patterns work?
On this corpus, at this horizon: no measurable effect. Across all 105 pattern × timeframe × confidence-band categories — 373,748 non-overlapping occurrences across 117 US stocks and ETFs and 10 crypto pairs — not one category's lift over its own pattern-free baseline survives correction for the fact that 105 categories were tested. On the 60 stock categories, 0 clear their cluster-robust interval at all. That is a statement about these patterns, this universe, this 10-bar horizon and these confidence bands. It is not a proof that no chart pattern can ever carry information.
Why compare against a baseline instead of 50%?
Because the market moves without any pattern being present. Over 10 trading days, an arbitrary window on US stocks and ETFs closed higher 57.8% of the time (n=46,038). Scored against 50%, a bullish pattern hitting 58% looks like an eight-point edge; scored against the 57.8% the market delivered anyway, it is +0.2 percentage points. Every published hit rate that omits its baseline is reporting drift as skill.
What does "cluster-robust" mean and why does it matter?
The 117 tickers in the stock universe trade at the same time and move together. A textbook confidence interval treats each occurrence as independent evidence, which overstates how much information 117 correlated observations on the same day actually carry. Clustering the variance on the UTC calendar day lets observations inside a day correlate arbitrarily. It widens the intervals by about 1.4× at the median, and it cuts the count of categories whose interval excludes zero from 14 to 3.
Are those remaining findings real?
Probably not. Testing 105 categories at the 5% level produces about 5.3 interval exclusions by chance alone even if nothing is there — and 3 is fewer than 5.3. All 3 sit in crypto, 2 of them on samples under 200 occurrences, and none survives a Bonferroni correction for 105 tests. Reporting them as discoveries would be the exact error this study is about.
Why does crypto behave differently from stocks?
Crypto is the control case. US equities drift upward, so their pattern-free baselines run from 52.7% to 61.2% up depending on timeframe. The crypto pairs show no comparable drift — their baselines sit between 49.3% and 50.5%. When the drift disappears, so does the apparent directional edge of every bullish and bearish pattern, which is what you would expect if the drift was the whole effect.
If patterns carry no lift, why does patternfetch detect them?
Because a language model asked about a head and shoulders will otherwise answer from what the open web says, where the same pattern is quoted at 57%, 75.76% and 79% with no baseline attached. Shipping the measured number — with its baseline, its interval and its sample size — is what stops the model inventing significance. The detection itself also stays useful as description: where the shape is, what it spans, which level it sits against. And the rest of the payload — regime, support and resistance, interpreted indicators — is unaffected by this result.
How can I reproduce this?
The measurement runs on the same evidence tables the API serves, and every brief returns the baseline, the lift, the cluster-robust interval and n alongside the hit rate. POST /v1/demo needs no key and no signup, so the numbers behind any single row here can be pulled directly. honest-signals, our open-source Python CLI, wraps that endpoint: it recomputes intervals from the reported hit rate and n and prints the hit rate next to its baseline for a whole watchlist. Its notebook ships the full 105-category snapshot, so the charts on this page reproduce offline.
Is this investment advice?
No. patternfetch provides impersonal market data and algorithmic signals for informational purposes only — not investment, financial, legal or tax advice, not personalized, and non-executing. Historical base rates do not guarantee future results.

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.