Bullish divergence is the classic reversal reading: price sets a lower low while a momentum oscillator sets a higher one, and the claim is that selling is running out of force even as the chart makes a new low.
Until recently our backtester could not test that claim, because divergence is a statement about two swing lows, and the tool had no rule that could read one. Now it does, so we ran it: RSI(14) divergence on 5-bar swing lows, across 22 US stocks and sector ETFs, buying the signal and holding ten sessions. It printed 129 times; the engine holds one position per name at a time, so two arrived during open holds, and of the 127 trades taken, 77 finished green: a 60.6% win rate.
That is the best raw number any signal in this series has produced. It is still not proof, and the two reasons why are more instructive than the number.
What is bullish divergence
The two dashed lines are the whole signal: they point in opposite directions. Price is still setting new lows, but each one is being made with less momentum than the last.
- Price forms a lower swing low
- The oscillator, RSI here, forms a higher low at those same two swings
The reading is that the second decline, for all that it went further in price, carried less force than the first, and the sellers driving it are tiring.
The trap every divergence backtest has to avoid
A swing low is not a swing low until the bars that define it have printed. With 5-bar swings, the low of March 10th is only confirmed on March 17th, five trading days later, once nothing lower has appeared on either side. Before that it is just a down day that might keep falling.
Most divergence backtests date the signal to the low itself, which credits the strategy with buying on a day when the divergence was not yet visible to anyone. Those results cannot be traded, only admired. Our rule fires on the bar that confirms the second swing, the first day a chart-reader could actually have seen the pattern, and every figure below is dated that way.
What 127 of them did
| Ten-day holds starting from | Windows | Finished green |
|---|---|---|
| any bar | 24,948 | 55.4% |
| a bullish RSI divergence | 127 | 60.6% |
The window was mostly a bull market, so the bar is 55.4%, not 50%: most ten-day holds finished green whatever day you picked. The divergence cleared that bar by 5.2 points, which is the right direction and a real gap on the page.
Two honest qualifications, and they are the finding as much as the win rate is.
First, 127 trades cannot carry 5 points. At this sample size the 95% interval on that gap runs from about 3 points the wrong way to 14 the right way (p is about 0.24), and even that flatters it: the interval treats the trades as independent, and the next paragraph is about why they are not. A five-point edge is exactly the size this test cannot distinguish from luck. What the test rules out is a large edge in either direction; what it suggests, without proving, is a modest one in the pattern's favour.
Second, the signals arrive together. The 127 trades land on only 79 distinct days, and on 2022-10-20, the week the 2022 bear market bottomed, 13 of the 22 names fired at once. That is not a flaw in the rule, it is what divergence is: when a whole market makes its final low, momentum improves everywhere simultaneously. But it means these are not 127 independent bets, and a good chunk of the win rate is one correlated call on one market bottom that happened to be right.
Why the total return is small anyway
The rule kept you in the market 5.2% of the time and returned a median +2.0% per name with commission and slippage on, against +57.3% for buying and holding the same names. The median worst drawdown was 12.8%, against 33.8% for holding, which is a real saving in absolute terms and a lot of pain for 5% exposure: divergences form in exactly the turbulent stretches where ten-day holds swing hard.
Comparing +2.0% at 5% exposure to +57.3% at full exposure compares two different things, and the honest reading is narrower: as an occasional timing signal the divergence won more often than a random entry, and as a strategy on its own it left you in cash for the entire bull market that paid for everything.
What we did not test
The test takes every confirmed divergence the rule finds, deliberately, because that is the pattern without a human choosing the good ones. Chart traders would add filters, and each is testable in the tool rather than trusted:
- At a level that has held before. A higher momentum low into known support is the textbook version of this trade.
- With the second low on lower volume. A new price low that fewer shares participated in strengthens the exhaustion reading.
- With the market not in freefall. Check the market meter first; the 13-signals-in-one-day cluster is a reminder that single-name divergences at a market low are all the same trade.
The bearish mirror of this pattern is tested identically on the same names and dates, and came in under its baseline, which is what its believers would want, though its sample cannot settle it either.
Test it yourself
The backtester now carries this as a rule. In the free backtester, open Chart setup, add Divergence, and set it to Bullish. You can point it at RSI, the MACD line or OBV, change the swing width and the lookback, and run it on any ticker beside buy-and-hold.
We also ran the MACD variant, and it is worth knowing before you assume oscillators agree: MACD-line bullish divergence fired 119 times on the same names and won 50.4%, five points below the base rate. Same concept, different oscillator, opposite side of the bar. That disagreement is one run on one window, but it is a good reason to test the specific indicator you plan to read rather than "divergence" in the abstract.
Scanning for them live
Testing what a pattern did and being told when one forms are different jobs. TC2000 can scan for RSI divergence across its watchlists and alert on it. Finviz does not scan divergence directly, but its screener finds the oversold, downtrending stocks the pattern forms on, which is the shortlist worth inspecting by eye.
Neither will tell you what this page just measured, which is how often the list was worth acting on.
Frequently asked questions
Is bullish divergence a reliable buy signal? Leaning yes, unproven. Across 22 US stocks, buying each confirmed RSI divergence as it printed and holding ten days won 60.6% of the time against a 55.4% base rate. The gap is in the pattern's favour but, on 127 trades, not statistically distinguishable from chance.
Which indicator is best for spotting bullish divergence? On our test, RSI. The identical rule read on the MACD line won 50.4%, below even a random entry, on the same names and window. That is one run, not a law, but it argues against treating all oscillator divergence as one signal.
How long after the low does a bullish divergence appear? Later than most charts imply. A swing low needs bars on both sides to be confirmed, five in our test, so the earliest tradeable moment is about a week after the actual low. Backtests that buy the low itself are using information nobody had.
Why do divergence signals cluster? Because market-wide bottoms produce them everywhere at once. 13 of our 22 names signalled on 2022-10-20 alone. Treating those as independent confirmations of the pattern overstates the evidence; it was one market call, made 13 times.
What is the difference between bullish divergence and hidden bullish divergence? Regular divergence, tested here, is a lower price low with a higher oscillator low, read as a reversal. Hidden divergence is a higher price low with a lower oscillator low, read as continuation. We tested the regular kind.
Before you trade this pattern
The figures here come from one run over 22 large-cap US stocks and sector ETFs, in a window that was mostly a bull market, with the rule invested about 5% of the time. Signals are RSI(14) divergences on confirmed 5-bar swings, bought at the close of the confirming bar and held ten sessions; win rates are measured before costs, and the total-return figures include commission and slippage. The engine holds one position per name at a time, so 2 of the 129 printed signals were skipped, and a hold still open at the end of the window is closed early. The 127 trades fall on 79 distinct days, so the effective sample is smaller than the count suggests, and the script reports both clustering figures with each run. The script that produced them is in the repository (backend/scripts/research/candle_study.py) so the run can be repeated rather than trusted. The tool will show you today's numbers on any ticker you choose, and they will not match these exactly. Past prices are not a forecast, and nothing here is investment advice.