Stacking Signals: Compose Without Overfitting

The most common improvement in any strategy is adding a confirmation filter. The most common cause of strategy failure is adding too many. This article covers how to stack signals — combine indicators into compound rules — without crossing into overfit territory.

Why Stacking Helps

A single indicator captures one dimension of market behavior. RSI captures recent price extremes. ADX captures trend strength. Volume captures conviction. A signal from any single indicator includes false positives that other dimensions could rule out.

Combining two well-chosen indicators with AND logic typically:

  • Cuts trade count by 40–60%.
  • Improves hit rate by 5–15 percentage points.
  • Trades larger average wins for smaller average losses (because losers are filtered out earlier).

The improvement is real. The trade-off — fewer trades, slower deployment of capital — is the price.

The Independence Principle

The lift from stacking comes from independent information. Two indicators measuring the same thing (RSI and Stochastic both reading "oversold") barely confirm anything beyond what one alone says. Two indicators measuring different things (RSI saying oversold + ADX saying ranging) are genuine independent confirmation. Pick filters that capture different dimensions.

The Three Dimensions to Combine

Dimension 1: Direction

What is the price doing? Examples: RSI level, MACD position, price vs. moving average. The primary entry signal usually lives here.

Dimension 2: Regime

Is the market in a state where the strategy works? Examples: ADX (trending vs ranging), Hurst Exponent (mean-reverting vs trending), HMM regime probability. Regime filters dramatically reduce whipsaw.

Dimension 3: Confirmation

Is there independent evidence the signal is real? Examples: volume (RVOL), volatility (ATR), order flow (OBV). Confirmation filters reduce false breakouts and noise-driven entries.

A well-stacked strategy hits one filter from each dimension: directional + regime + confirmation. Three filters from the same dimension (e.g., RSI + Stochastic + Williams%R) add little because they're correlated.

The Diminishing Returns

Stacking Diminishing Returns
  • 1 filter: baseline strategy. All trades pass.
  • 2 filters: ~2× hit-rate improvement, ~50% trade reduction. Best ROI on filtering.
  • 3 filters: additional 5–10% hit-rate improvement, 30–50% further trade reduction. Often the sweet spot.
  • 4 filters: marginal improvement, 30% further trade reduction. Often hurts statistical significance more than it helps.
  • 5+ filters: almost certainly overfit. Signal is whatever the data happened to support.

The Overfit Test

Three quick checks to know if your stack is over-fit:

  1. Trade count after the stack. If you have fewer than 30 trades over a multi-year sample, you don't have a strategy — you have a coincidence.
  2. Marginal contribution of each filter. Remove each filter individually and re-run. If removing any single filter dramatically degrades performance, that filter is doing real work. If removing any filter slightly improves the result, that filter is overfit and should go.
  3. Walk-forward survival. Run the stacked strategy through walk-forward. If the WF Sharpe is < 50% of the IS Sharpe, the stacking is mostly fitting noise.

The Composability Pattern

UB001UNIV expresses stacking via boolean rules:

entry_long = (RSI < 30) AND (ADX < 25) AND (RVOL > 1.2) AND (price > SMA(200))

Read this as: "Enter long when RSI says oversold AND we are in a ranging regime AND volume confirms AND we are above the long-term trend."

Each clause is independent. Each adds discipline. The stack is honest because each filter has a justification — directional, regime, confirmation, contextual.

Anti-Patterns

  • Adding filters in response to disappointing backtests. "RSI alone gave Sharpe 0.6 — let me add ADX." If the lift is real, fine. If you keep adding until you reach Sharpe 2.5, you've filtered the data, not the noise.
  • Highly-correlated filters. RSI(14) AND RSI(7) AND Stochastic — all measuring the same thing, just with different lags. Adds nothing.
  • Filters with optimized thresholds. "RSI < 23.7" is suspicious; "RSI < 30" is honest. Round numbers don't hide their tuning.
  • Ad-hoc filter stacking inside walk-forward. Adding filters between WF folds defeats the purpose of walk-forward.

The Bottom Line

Two filters from independent dimensions is the sweet spot. Three is fine if each is well-justified. Four or more, and you're probably curve-fitting. The discipline of "every added filter must have a separate justification rooted in market mechanics, not just in backtest improvement" is what keeps stacking honest.

Further Reading

Foundational papers

  • Lo, A. W., Mamaysky, H. & Wang, J. (2000). Foundations of Technical Analysis: Computational Algorithms, Statistical Inference, and Empirical Implementation. Journal of Finance, 55(4), 1705–1765.
  • Brock, W., Lakonishok, J. & LeBaron, B. (1992). Simple Technical Trading Rules and the Stochastic Properties of Stock Returns. Journal of Finance, 47(5), 1731–1764.

Textbook references

  • Kaufman, P. J. (2013). Trading Systems and Methods (5th ed.). Wiley.
  • López de Prado, M. (2018). Advances in Financial Machine Learning. Wiley.

Related QuanterLab articles

Try it in QuanterLab

In UB001UNIV stack two filters from different dimensions (e.g., RSI for direction, ADX for regime). Run the marginal-impact test: remove each filter one at a time and re-run. The ones that don't change the WF result are not earning their keep.

Back to QuanterLab
Report
Loading report...
Article
Loading article...