What is Fibonacci retracement? A quant's 3-year backtest on 48 live levels
Textbook Fibonacci is 23.6 / 38.2 / 50 / 61.8 / 78.6%. We backtested 48 user-curated levels across 12 themes — basket PF 1.76, Sharpe 1.42, +23.7% over 3 years. Here's what works, what doesn't, and on which name classes.
The standard Fibonacci-retracement story goes like this. The Fibonacci sequence (1, 1, 2, 3, 5, 8, 13, 21, 34, 55, …) has ratios between adjacent terms that converge on the golden ratio φ ≈ 1.618. Invert that and you get 0.618. Take its complement and you get 0.382. Throw in 0.236 (φ³), 0.5 (a Gann convention, not a Fibonacci ratio at all), and 0.786 (the square root of 0.618), and you have the standard retracement grid: 23.6 / 38.2 / 50 / 61.8 / 78.6%. Draw a line from a swing low to a swing high, mark those percentages, and the theory says price tends to reverse off those levels.
The theory is half-right. It works — on the right kind of stock, with the right kind of entry rule, on the right time frame. On the wrong kind of stock, it doesn't just under-perform: it bleeds. We've spent the last three years measuring exactly where Fibonacci retracement does and doesn't work, on a basket of 48 user-curated key levels spread across 12 thematic groups. The basket as a system delivers a profit factor of 1.76, Sharpe 1.42, and +23.7% over three years on a flat-money sizing rule — but only after two structural filters that the textbook doesn't mention. This piece walks through what Fibonacci retracement is, why it works when it works, the 12-theme verdict, and how the numbers actually land at the trade level.
The TL;DR. Fibonacci retracement is a mean-reversion overlay on a prior impulse move. Empirically (3y, 178 trades, daily timeframe), it works on volatile thematic names that mean-revert and fails on secular-trend monsters (NVDA, TSLA, AMZN, ASML) that blow through every level on the way up. The 9 validated themes are photonics, space, drones, nuclear, CPU bottleneck, AI inference, agentic AI, AI utility, AI power. The 3 excluded themes are AI hardware, physical AI, AI applications. We publish both lists — including the failures — so the methodology stays honest.
What Fibonacci retracement actually is
A Fibonacci retracement is a horizontal grid of price levels drawn between two reference points — typically a recent swing low and a recent swing high (or vice versa). The grid marks the percentage of the prior move that has been given back by the current pullback.
If a stock runs from $100 to $200 (a $100 impulse) and then sells off, the retracement levels are:
- 23.6% retrace → price at $176.40 (shallow pullback, trend healthy)
- 38.2% retrace → price at $161.80 (typical trend continuation level)
- 50% retrace → price at $150.00 (the "halfback" — Gann's contribution, not Fibonacci's)
- 61.8% retrace → price at $138.20 (the "golden retrace" — last-chance level for the trend)
- 78.6% retrace → price at $121.40 (if it breaks here, the prior trend is probably done)
The two levels that matter most empirically are 38.2% (shallow → strong trend, mean-revert long off it) and 61.8% (deep → trend in trouble, mean-revert long off it only if other structure supports). 50% gets watched because it's psychologically obvious (half the move), not because of any number-theory reason — Gann grids would give you 50% even without Fibonacci.
Why traders use it at all
Two reasons, one self-fulfilling, one structural.
Self-fulfilling. A large enough population of traders watches the same 38.2% / 61.8% lines that limit orders cluster there. When price arrives, the cluster gets hit, and the level produces a measurable bounce. The math underneath the level is irrelevant to whether the level works — what matters is that enough screens have the level drawn on them.
Structural. A retracement is also a measurement of how much profit-taking the move has absorbed. A 23.6% pullback says "almost nobody is taking profits, this trend is fresh." A 61.8% pullback says "most of the move has been faded, the trend is on its last leg." The grid is a coarse but real signal about where in the profit-distribution cycle the move is.
Both reasons are weaker than the textbook implies. The self-fulfilling effect requires enough volume and a clear prior impulse — on thinly-traded names or sideways tape, the cluster doesn't form. The structural effect requires that the prior move was actually trend, not noise. Neither holds reliably; both hold in specific regimes.
The backtest — 48 levels, 3 years, daily timeframe
QuantAbundancia maintains a list of one user-curated key Fibonacci level per ticker, across 48 tickers spread over 12 thematic groups (4 tickers per theme). The levels are picked from the daily chart by hand — typically the most-touched horizontal in the recent 6-12 month range, anchored against a meaningful prior swing.
The backtest rules:
- Entry (long): daily close within ±2.5% of the level, after having been outside the band on the previous bar. This forces a fresh touch from outside, not a flatline at the level.
- Stop: -10% from entry.
- Take profit: +12% from entry.
- Time exit: 20 trading days, regardless of P&L.
- Sizing: flat-money per trade, basket-diversified, max concurrent positions capped.
- Data: 3 years of daily OHLC via yfinance.
The full basket result (validated 2026-05-19, with the two structural filters described below):
| Metric | Value | | --- | --- | | Profit factor | 1.76 | | Sharpe ratio | 1.42 | | Total return (3y) | +23.7% | | Max drawdown | -4.8% | | Win rate | 59.5% | | Trade count | 178 | | Walk-forward windows profitable | 4 of 5 |
The honest framing. 1.76 PF on 178 trades over 3 years is a real edge, not a curve-fit fluke — but it's not a "Fibonacci is magic" result. It's a "Fibonacci, applied to the right name class with the right structural filters, on a basket" result. Both filters were necessary; both were derived from in-sample bleed and confirmed out-of-sample.
Filter 1 — theme exclusion (3 of 12 themes drop out)
Run the entry rule above on all 48 tickers and the unfiltered basket delivers a meaningful but mushy result. Disaggregate by theme and the pattern is clean: three themes lose, nine themes win.
The three that lose:
- AI Hardware — $NVDA, $TSM, $ASML, $MU
- Physical AI — $TSLA, $AMZN, $GOOGL, $ISRG
- AI Applications — $PLTR, $SNOW, $CRWD, $ZETA
The common thread: these are secular-trend monsters. The 3-year tape on each of them is a near-uninterrupted uptrend with shallow pullbacks. When price arrives at a Fibonacci retracement, it doesn't reverse — it pauses for a few bars and then continues higher (or, on the rare drawdown, blows clean through the level on the way down). The mean-reversion premise — that price returns to a prior reference after over-extending — doesn't hold because the trend is the dominant factor, not mean reversion.
The nine themes that win:
- Photonics — $AAOI, $LITE, $COHR, $AEHR
- Space — $RKLB, $ASTS, $PL, $BKSY
- Drones — $ONDS, $UMAC, $AVAV, $KTOS
- Nuclear — $OKLO, $UUUU, $GEV, $LEU
- CPU Bottleneck — $AMD, $INTC, $ARM, $AMKR
- AI Inference — $AVGO, $ALAB, $CRDO, $MRVL
- Agentic AI — $NET, $DOCN, $FSLY, $PATH
- AI Utility — $IREN, $NBIS, $CIFR, $CRWV
- AI Power — $VST, $BE, $NVTS, $VRT
The common thread on the winning side: more volatile, more cyclical, less dominated by a single multi-year trend. These names do mean-revert. A Fibonacci touch on $RKLB after a 30% selloff has a meaningfully better forward-return profile than a Fibonacci touch on $NVDA during a 3% pullback in a 200% trend.
The lesson is the lesson the textbook doesn't teach: Fibonacci retracement is a mean-reversion tool, and it works on names that mean-revert. Apply it to a secular winner and you'll be early-bullish for an entire year while the stock prints higher highs through every level you drew.
Filter 2 — the 5-name SMA50 trend filter
The second filter is more specific. Within the nine winning themes, five tickers — $CRDO, $OKLO, $ALAB, $BKSY, $IREN — are the highest-volatility names in the basket. They are also the cleanest mean-reverters when entries are taken with the broader macro tape supporting. When taken against an individual downtrend (price below the 50-day SMA on the ticker itself), the same entries become falling-knife trades.
The fix is narrow: for those five names only, skip the entry if the close is below the 50-day SMA. Don't apply this filter to the rest of the basket — universal trend filters were tested and rejected because they over-filter the basket (the best Fibonacci setups happen during macro pullbacks, when most names are below their long-term averages).
The numerical effect: this five-name cohort flipped from -$2,421 aggregate P&L over 3 years to +$923, on the same Fibonacci entry signal. That alone took the basket from PF 1.53 → 1.76 and Sharpe 1.08 → 1.42.
The broader lesson is portable to anyone applying Fibonacci on volatile small-caps: a Fibonacci touch is a mean-reversion signal; combining it with an individual-name trend gate keeps you from buying the dip in a stock that's already in its own private bear market.
Common pitfalls — the things textbooks gloss over
These are the trader-experience failure modes that show up in any backtest of Fibonacci-based entries:
The 50% level isn't Fibonacci. Halfback is a Gann concept. It's a perfectly valid level — psychologically obvious, frequently respected — but pretending it's a Fibonacci ratio is a category error. If you only watched 38.2 / 61.8 / 78.6 you would lose a real level; if you only watched 50 you'd lose two real ones.
Drawing the swing matters. Most retail Fibonacci grids are drawn from the wrong swing. A grid measured from a noisy intraday wick to a different noisy intraday wick is a different grid from one measured between two clean closes. Define the rule before drawing — we use significant swing-high to significant swing-low on the daily chart, and we don't redraw mid-trade.
Without a prior impulse, levels are noise. A Fibonacci grid needs a clear prior trend leg. If price has been sideways for 6 months, the grid you draw on the small range inside that sideways tape carries no information. The setup demands an impulse first — a 20%+ move over a few weeks at minimum.
Confluence beats single-level. A Fibonacci level that coincides with a prior horizontal support, a round number, a moving average, or a high-volume node is a real level. A lone 61.8% with nothing else underneath it is a weak level. Most of the basket's winning entries land at confluence points; most of the losing entries land at lone-Fibonacci touches that nothing else confirmed.
Time exits matter as much as price exits. Without the 20-bar time exit, the basket bleeds — broken Fibonacci setups don't snap back, they slow-bleed sideways, and capital sits in dead trades while better entries come and go. The time exit is doing as much work as the stop in this strategy.
How to actually apply this
If you want to use Fibonacci retracement as part of a real workflow, the empirically-supported version of it is:
- Pick a name from the 9 validated themes — see the live key level on each ticker's /stocks/<ticker> page. Each page surfaces the curated level, the current distance to it, and the bubble it belongs to.
- Wait for a fresh touch from outside the band. Not a flatline at the level — a genuine arrival from above or below.
- Size as part of a basket, not a single bet. The 1.76 PF is a basket-level number. A single Fibonacci trade is much higher-variance.
- Use a real time exit. 20 bars (4 trading weeks) on the daily timeframe. Don't sit in broken setups.
- Skip the 5-name HIGH_VOL cohort when they're below their own SMA50. Or apply the same logic to any other thin-float thematic name you trade.
To trade this from a US-retail account, the cleanest broker for fractional shares across the basket is Interactive Brokers — see /stack/ibkr for the access mechanics. For the full broker + tooling list QA uses, /stack has the lineup. Rule-based alerts on Fibonacci touches and bubble shifts are part of /pro.
For deeper methodology on how QA picks the levels and validates them, see Why correlation > narrative in thematic investing — the same bias-toward-publishing-failures applies to the Fibonacci basket as to the correlation taxonomy.
What to watch
- Re-validation cadence. The basket gets re-walked-forward roughly quarterly. A persistent breakdown in any of the 9 validated themes — say, the photonics names blowing through their levels for two quarters running — would re-open the theme-exclusion list.
- Regime sensitivity. The strategy is mean-reversion; it would underperform during a strong trending macro regime. The 4-of-5 walk-forward windows reflect 3 years that included both regimes — but a multi-year low-vol trending tape would be the bear case.
- New themes. As QA adds themes (currently 12), the basket expands. New themes need their own walk-forward validation before they're added to the live basket.
- The bubble-correlation read. If a validated theme's bubble breaks correlation — meaning the 4 tickers stop trading as a cluster — the basket-level diversification math weakens for that slice.
- Individual ticker re-rating. If a name like $OKLO or $RKLB graduates from "thin-float thematic mean-reverter" to "secular trender" (the way $NVDA did 2023-2024), it would migrate to the excluded list.
Live levels on the validated basket: /stocks/rklb, /stocks/oklo, /stocks/crdo — each ticker page shows the current curated Fibonacci level, distance to it, and recent touches.
Bubble context: /bubbles/photonics and the other 8 validated themes — the clusters these names belong to and how they're moving relative to each other.
Adjacent reading: Why correlation > narrative in thematic investing for the publish-the-failures methodology QA applies across both the bubble taxonomy and the Fibonacci basket.
QuantAbundancia is educational research. Nothing here is investment advice. See /disclosures.
Related bubbles
Get the daily digest.
One email a day · alerts + bubble shifts + new research. Free during beta.
No spam. One email per day max. Telegram alerts coming with the paid tier.