VALYNOXSTRATEGY RESEARCH TECHNOLOGY
AlphaPrimeAlphaPrime
ACADEMY / Indicators and signals

Zweig Breadth Thrust indicator: the 10-day rule and its rare signals

The Zweig Breadth Thrust fires when the 10-day exponential average of the share of advancing stocks rises from below 0.40 to above 0.615 within ten trading days. Signals are rare, so the record is a few dozen events, too few to measure an edge; test it as a filter on a higher-frequency rule, not as a strategy on its own.

By · Published · updated · Editorial policy

Contents
  1. What is the Zweig Breadth Thrust indicator?
  2. How do you calculate the Zweig Breadth Thrust?
  3. How rare are breadth thrust signals, and why does rarity matter?
  4. How reliable is the signal? What a few dozen cases can and cannot show
  5. What does a momentum stand-in test on ES show?
  6. How should you test a breadth thrust rule yourself?
  7. Frequently asked questions
  8. References

What is the Zweig Breadth Thrust indicator?

The Zweig Breadth Thrust indicator is a market-breadth signal. It fires when the 10-day exponential average of the share of advancing stocks climbs from below 0.40 to above 0.615 within ten trading days. Signals are rare, because the market must swing from broad selling to broad buying very fast.

Market breadth is a count of how many stocks took part in a move, as opposed to how far an index moved. An index can rise on a few large companies while most stocks fall; breadth shows that gap. The Zweig Breadth Thrust, named after its originator, reads one breadth number: the share of listed stocks that closed higher. When that share, smoothed over ten days, goes from fewer than four in ten stocks rising to more than six in ten, the whole market has turned in less than two weeks. The idea is that such a wide and sudden turn has usually come near the start of a longer advance.

Two features set this indicator apart from the tools in technical analysis tools and indicators you can test. It uses advance and decline counts, not prices, so you need breadth data, not only bars. And it is an event, not a daily reading: most of the time it says nothing at all. The rest of this article follows one claim through: an indicator that fires a handful of times per decade cannot be graded as a strategy from its own record, so its place is as a filter on a rule that trades more often. The wider family is covered in market breadth indicators and how to test them.

A breadth thrust is one fast swing: the 10-day EMA of the advancers ratio dips below the 0.40 level, then climbs above the 0.615 level within ten trading days or fewer, and the second crossing is the signal A thrust is one fast swing 10-day EMA of the advancers ratio 0.615 0.40 Signal ≤ 10 days Slow climbs do not count. So: count the days between levels.
The signal is one fast move: the smoothed advancers ratio leaves the 0.40 level and crosses 0.615 inside a ten-day window.

How do you calculate the Zweig Breadth Thrust?

The calculation is three steps in a fixed order: a daily ratio, a 10-day smoothing, and a day count between two thresholds. You need, for each trading day, the number of advancing issues and declining issues on the exchange you follow.

  1. Daily ratio. Divide advancing issues by the sum of advancing and declining issues. Unchanged issues are left out. The result sits between 0 and 1.
  2. Smooth with a 10-day exponential moving average. An exponential moving average (EMA) is an average that gives the most recent days more weight than older days, so it reacts faster than a simple average of the last ten values. The smoothed line is what the thresholds are applied to.
  3. Count the days between thresholds. Find the last close of the smoothed line below 0.40. Then find the first close above 0.615 after it. Count the trading days from the first point to the second. Ten or fewer is a signal; more than ten is not.
Three steps and one decision: compute the daily ratio of advancers to advancers plus decliners, smooth it with a 10-day EMA, count the trading days from below 0.40 to above 0.615; ten days or fewer is a signal, more than ten is none Three steps, one decision A = advancers, D = decliners 1 Ratio A ÷ (A + D) 2 Smooth 10-day EMA 3 Count 0.40 → 0.615 ≤ 10 days: signal > 10 days: none The day count is the only test. So: fix the issue list first.
Ratio, smoothing, day count. The branch at the end is the only decision in the rule.

Hypothetical example

Suppose 1,200 issues advance and 1,800 decline on a weak day. The ratio is 1,200 ÷ 3,000 = 0.40. A week later a strong day has 2,400 advancers and 600 decliners: 2,400 ÷ 3,000 = 0.80. The smoothed line will not jump straight to 0.80, because the EMA still carries weight from the weak days. For the line to cross 0.615 within ten days of its last close below 0.40, most of those ten days must look like the strong day. That is why the rule is so demanding.

Two details change the count of signals you get. The first is the issue list: an exchange's full list includes funds and preferred shares, and some analysts count only common stocks, which gives a different ratio on the same day. The second is the starting value of the EMA, which matters for the first weeks of a series. Write down both choices before you count signals, so a later change does not quietly alter the record.

How rare are breadth thrust signals, and why does rarity matter?

A rule that fires a handful of times per decade produces a record so small that one or two outcomes decide it, while daily indicators on the same history produce hundreds of testable trades. The thrust needs a near-complete swing in breadth inside two weeks. Markets do that only after a sharp sell-off that reverses hard, and such reversals are uncommon. Years can pass without a single signal.

Rarity is not a flaw in the idea, but it limits what you can learn from it. Compare it with indicators that give a value every day. A KD (Stochastic) indicator crossover rule or a MACD signal line rule on daily bars generates trades every few weeks; an RSI rule that enters below 30 and exits above 50 does the same. Over ten years those rules give hundreds of completed trades. The breadth thrust gives a few. Both records come from the same ten years of history, but one is evidence and the other is a short list of anecdotes.

PropertyZweig Breadth ThrustDaily indicator rule (KD, MACD, RSI)
Data neededAdvance and decline countsPrice bars only
Signals over a decadeA handfulHundreds
What decides the recordOne or two outcomesThe average over many trades
How to grade itAgainst random dates, as a filterOut-of-sample trades, walk-forward
Role in a systemCondition that allows or blocks tradesEntry and exit on its own
Same years, far fewer events: over the same history the breadth thrust rule gives a handful of sparse signals, while a daily momentum rule gives hundreds of trades Same years, far fewer events Same history, one mark per event Breadth thrust A handful Daily momentum Hundreds Evidence is counted in events. So: grade the rule with more trades.
The same years of history give a handful of events to one rule and hundreds of trades to another. Evidence is counted in events, not years.

This is the same lesson that runs through what testing shows about intraday indicators: the indicator with the best story is not the one with the most evidence. A rule you can test a thousand times tells you more about itself than a rule you can test a dozen times, even when the dozen all went well.

How reliable is the signal? What a few dozen cases can and cannot show

With a few dozen signals the uncertainty of the average outcome stays wide, so a high hit rate after a breadth thrust is a hint about market behaviour, not a measured edge you can size a position on. Published studies of the thrust report that the index was higher some months later in most cases. That may well be true. The question is how far you can trust an average built from so few cases.

Think of weighing a coin by flipping it. Ten flips with seven heads tell you almost nothing; four hundred flips with 280 heads tell you the coin is bent. The average outcome after a signal behaves the same way. One formula is worth keeping:

uncertainty of the average outcome = spread of single outcomes ÷ √N

Here the spread of single outcomes is how far individual results typically sit from their average (the standard deviation), N is the number of signals, and √N is its square root. Because the square root grows slowly, you need four times as many signals to halve the uncertainty.

Hypothetical example

Suppose the index return over the 60 trading days after a signal averages +4 percent, and single outcomes typically sit 8 percentage points from that average. With 10 signals the uncertainty is about 8 ÷ 3.2 ≈ 2.5 points, so the true average could be anywhere from about +1.5 to +6.5 percent, and a worse outcome is not ruled out. With 30 signals it is about 8 ÷ 5.5 ≈ 1.5 points. With 400 signals it is 8 ÷ 20 = 0.4 points. Only the last figure is tight enough to call a measured edge, and no breadth-thrust record is that long.

More events, narrower band: an illustrative average outcome for 10, 30, 100 and 400 events, with an uncertainty band that halves each time the event count grows fourfold; the bands for 10 and 30 events cross zero, the band for 400 events clears it More events, narrower band Average outcome with its band Illustration 0 N = 10 N = 30 N = 100 N = 400 A few dozen events can include zero. So: 4× the events to halve the band.
The band around the average shrinks with the square root of the event count. A few dozen events leave a band that can still include zero.

There is a second problem on top of the small sample. The thresholds 0.40 and 0.615 and the ten-day window were chosen by looking at past data. Any pair of thresholds that produced a good-looking record could have been kept, so part of the record is the choice, not the market. Bailey, Borwein, López de Prado and Zhu (2014) show that the more variants were compared, the longer the history needed before the best one can be separated from luck; Harvey and Liu (2015) propose discounting a result for the number of tests behind it. A rare-event rule has neither the history nor the event count to pay that discount.

What does a momentum stand-in test on ES show?

Because breadth data and futures bars are different things, the run behind this article tested a plain Momentum rule on ES daily bars as a stand-in for the thrust idea, and the result is one kept candidate out of 1,024 tried, picked after the fact for its return against its drawdown, which flatters it. The stand-in keeps the spirit of the thrust, a fast change in direction, but uses price alone, so it fires often enough to count.

The search ran in AlphaPrime (Valynox) on E-mini S&P 500 daily bars from 2019-01-02 to 2025-06-30, long and short, one contract, with a Momentum rule as the only entry and exit, no stop, no target and no filters. Every one of the 1,024 candidates was charged $20 commission and $25 slippage per trade. The box below is the kept candidate as the report lists it.

Source: AlphaPrime product engine (CPU), run 2026-10-31. ES daily bars, 2019-01-02 to 2025-06-30, long and short, 1 contract, $20 commission and $25 slippage per trade.

NumberResult
Net profit (closed trades)$91,147.5
Max drawdown$45,397.5
Trades242
Win rate54.13%
Profit factor1.286
Average trade$376.64
Time in market74.52%
Follow the equity curve against the drawdown panel below it, and look at where the deepest drawdown falls relative to the out-of-sample stretch marked on the chart.
Follow the equity curve against the drawdown panel below it, and look at where the deepest drawdown falls relative to the out-of-sample stretch marked on the chart. ES · daily · 2019-01-02 to 2025-06-30 · CPU engine backtest
Read the headline numbers next to the trade count they are built from, and compare the maximum drawdown with the net profit before anything else.
Read the headline numbers next to the trade count they are built from, and compare the maximum drawdown with the net profit before anything else. ES · daily · 2019-01-02 to 2025-06-30 · CPU engine backtest

Read these numbers for what they are. The 242 trades give the stand-in a record roughly ten times longer than a breadth-thrust record over the same years, which is the point of using a stand-in. The win rate of 54.13% and profit factor of 1.286 describe one candidate chosen because it looked best among 1,024 by one measure; the other candidates mostly looked worse, and the best of many always carries a selection bonus. The max drawdown of $45,397.5 is about half the net profit of $91,147.5, which is a large share of the gain to sit through. None of this says that momentum earned that money or that a reader can expect it. It says that a price-based rule in the same family can be tested with enough trades to be judged, where the breadth thrust itself cannot. The rest of the candidates stay sorted alongside the kept one in the strategy databank, so the spread of results the search produced can be read, not only its top.

How should you test a breadth thrust rule yourself?

Write the thresholds and holding period down before you look at outcomes, count the signals, compare the result against random dates, and treat any rule with fewer than about 30 events as a filter to combine with a higher-frequency rule rather than a strategy on its own. The order matters more than any single step, because a rare-event test is easy to bend without noticing.

  1. Write the rule first. Thresholds (0.40 and 0.615, or your own), EMA length, issue list, and the horizons you will measure (for example 20, 60 and 120 trading days). Changing any of these after seeing the outcomes turns the test into a search.
  2. Run on breadth data and count signals. Note the count before reading a single outcome. If it is under about 30, you already know the result will be a hint, not a measurement.
  3. Measure the outcome after each signal at the fixed horizons. Use the index or futures series you would actually trade, and include the cost of the trade.
  4. Compare with the same horizons from random dates. Draw many sets of dates, as many as you have signals, from the same history, and measure the same horizons. If the signal dates do not clearly beat the random sets, the record is the market's general drift, not the signal. Brock, Lakonishok and LeBaron (1992) used this kind of comparison against simulated series to judge simple trading rules.
  5. Decide the role. Fewer than about 30 events: use the thrust as a condition that allows a higher-frequency rule to trade, and test that combination with its hundreds of trades. More: test it as a standalone rule with the usual out-of-sample split.
The event count decides the role: under about 30 breadth-thrust events the rule is only a filter, graded on the hundreds of trades of a daily rule; with 30 or more events it can be tested as its own rule with an out-of-sample split The count decides the role Where the breadth thrust belongs Event count Role Under ~30 30 or more Filter only Hundreds of trades Own rule Out-of-sample split The count, not the hit rate, decides. So: count before reading outcomes.
Rule first, count second, random comparison third. The event count, not the hit rate, decides whether the thrust is a filter or a strategy.

The filter route is where the stand-in test from the previous section becomes useful. A Momentum or MACD rule on daily bars supplies the trades; the breadth state supplies a condition, such as trading long only in the months after a thrust. The combined rule has enough trades to grade, and its grading is a comparison: the daily rule with the filter against the same rule without it. When the combined rule goes through strategy validation, AlphaPrime grades it against thresholds fixed before the run and stops the later checks as soon as one fails, which keeps a rare-event filter from being judged by the one check it happened to pass. The method for the split itself is in how to split in-sample and out-of-sample data.

The first thing to do is small. Take a daily advance and decline series for the exchange you follow, compute the 10-day EMA of advancers ÷ (advancers + decliners), and count how many times it went from below 0.40 to above 0.615 within ten trading days. Write that count down before you look at what the market did afterwards. The number itself tells you which of the two test routes above applies.

Frequently asked questions

How is the Zweig Breadth Thrust calculated?

Each trading day, divide the number of advancing issues by the sum of advancing and declining issues. Smooth that ratio with a 10-day exponential moving average. A signal occurs when the smoothed line moves from a close below 0.40 to a close above 0.615 within ten trading days or fewer. The issue list you use and the starting value of the average both change the count of signals, so fix them before you start.

When was the last Zweig Breadth Thrust signal?

The date depends on which exchange's advance and decline counts you use and whether you include all issues or only common stocks, so two sources can disagree by a signal or two. The reliable way to know is to compute the 10-day EMA from a daily breadth series yourself and find the most recent crossing from below 0.40 to above 0.615 inside ten days. Because the rule fires only a handful of times per decade, gaps of several years between signals are normal.

How accurate is the Zweig Breadth Thrust?

Published records report that the index was higher some months after most signals. The record is only a few dozen events, and the uncertainty of an average shrinks with the square root of the event count, so a few dozen cases leave a wide range around any hit rate. Treat the high hit rate as a hint about market behaviour, and compare the signal dates with random dates from the same history before giving it any weight.

Can you backtest a breadth thrust on futures?

Not directly from futures bars, because the rule needs daily counts of advancing and declining stocks. You can compute the signal from a breadth series and then measure what an index future such as ES did after each signal date, with commission and slippage included. The test in this article used a price-based Momentum rule as a stand-in, because it produces enough trades to be judged, where the thrust itself does not.

Should I trade the breadth thrust as a standalone strategy?

With fewer than about 30 signals in the record, the average outcome is too uncertain to size a position on. A more useful role is as a filter: a condition that allows a daily rule, such as a Momentum or MACD rule, to take long trades for a set period after a signal. The combined rule has hundreds of trades, so it can be graded out-of-sample against the same rule without the filter.

References

  • Bailey, D. H., Borwein, J., López de Prado, M., & Zhu, Q. J. (2014). Pseudo-Mathematics and Financial Charlatanism: The Effects of Backtest Overfitting on Out-of-Sample Performance. Notices of the American Mathematical Society, 61(5), 458–471.
  • Harvey, C. R., & Liu, Y. (2015). Backtesting. The Journal of Portfolio Management, 42(1), 13–28.
  • Brock, W., Lakonishok, J., & LeBaron, B. (1992). Simple Technical Trading Rules and the Stochastic Properties of Stock Returns. The Journal of Finance, 47(5), 1731–1764.