Mean reversion stochastics

Stochastics (Slow)

Slow Stochastics with %K/%D crossover. Bullish: %K crosses above %D while below oversold (20). Bearish: %K crosses below %D while above overbought (80).

Signal family

Mean reversion — Oscillator-based signals that fire at overbought or oversold extremes — typically fade the prevailing move.

Parameters

Name Description Default Range
k_period %K period 14 5–50
d_period %D period 3 2–10
slow_period Slow smoothing period 3 1–10
overbought Overbought level 80 60–90
oversold Oversold level 20 10–40

Historical context

647,232 valid triggers on 3,714 distinct tickers between 2015-02-25 and 2026-04-22. Universe: us_only · mcap ≥ $100,000,000 · price ≥ $1 (3,717 tickers). Entry at open T+1. 1d = intraday T+1; 20d = open T+1 to close T+20.

Benchmarks: spxew (S&P 500 Equal Weight — the primary benchmark here; a median-stock view that avoids the 2020+ megacap-concentration distortion), spx (S&P 500, cap-weighted), and msci (MSCI World USD). Per-stock regime: trending = ADX(14) ≥ 25, high vol = 20d ann. vol ≥ 20%.

At a glance (20d alpha vs S&P 500 Equal Weight, US-only)

Bullish
+0.11%
vs random-date null: worse than random (pperm=1.000)
Bearish (negative alpha = signal right)
-0.04%
vs random-date null: beats random (pperm=0.005)

Reading this: the random-date null is: for each ticker, sample N random dates and compute the same alpha — what alpha does a signal with no information produce? If the signal's observed alpha beats the null (pperm≤0.05), it's adding real information. If it's inside or worse than the null, the signal doesn't add value over random firing — any observed alpha is either noise or a universe artifact.

How often does STOCHASTICS fire in each regime?

The signal's bucket distribution is itself informative. If 50%+ of all STOCHASTICS triggers fire in the "non-trending + high vol" quadrant, the signal is structurally a chop-market event — regardless of what its textbook definition claims. Bullish and bearish are shown separately; counts are across the full US-only sample after the mcap and price floor.

Stochastics (Slow) (stochastics) — trigger count distribution by per-stock regime quadrant (trending/non-trending × high/low realized volatility) for , US-only universe

Per-stock regime quadrant — 20d alpha

Each trigger is tagged with the host stock's own technical regime on the trigger date: is the stock itself in a trend (ADX(14) ≥ 25) or ranging? And is its realized 20-day volatility high (≥ 20% annualized) or low? This is the textbook conditioning variable — "does this signal work better in trending stocks?" — answered at the level of the individual stock, not the market. Positive bars are good for the signal; negative bars mean alpha vanishes into the benchmark or worse.

Stochastics (Slow) (stochastics) — mean 20-day alpha versus S&P 500 Equal Weight by per-stock regime quadrant,  side by side
Trending + Low vol
Stock in a clean directional move with low realized volatility. Textbook "trend-following paradise" — smooth grind with little whipsaw risk.
Trending + High vol
Violent directional moves — parabolic rallies, crisis selloffs. Trend exists but the path is noisy. Signal timing may be imprecise.
Non-trending + Low vol
Quiet chop, summer doldrums, consolidations. No directional bias but also no big swings — small edges become reliable if they exist at all.
Non-trending + High vol
Choppy and violent — the classical "whipsaw zone" for momentum signals. Crossovers and breakouts fire repeatedly without follow-through.

Sub-period check — does the signal work in every era?

A multi-year average can hide major instability. We split the sample into three non-overlapping windows: 2015–2019 (pre-COVID, normalized monetary policy), 2020–2022 (pandemic crash + recovery + rate-shock bear), and 2023+ (post-ZIRP, AI megacap rally). If a signal's alpha is positive overall but comes entirely from one era, that's a red flag — the conditions that produced it may not repeat. A robust signal shows a consistent sign across all non-empty buckets.

Stochastics (Slow) (stochastics) — 20-day alpha split by historical sub-period (2015-2019, 2020-2022, 2023+) to check consistency across market regimes

↑ Bullish triggers

Bench Metric 1d 5d 20d 60d 252d
spx Stock % -0.01% +0.22% +1.10% +3.33% +13.28%
Bench % +0.01% +0.30% +1.21% +3.46% +14.25%
Alpha % -0.04% -0.08% -0.08% -0.11% -0.95%
Median alpha -0.05% -0.22% -0.58% -1.76% -9.05%
Hit rate (α>0) 48.6% 47.7% 47.2% 45.4% 39.5%
p (naive) <0.001 <0.001 0.0003 0.0057 <0.001
p (HAC) <0.001 <0.001 0.0077 0.1549 0.0091
N 307,332 306,984 304,584 296,711 271,577
msci Stock % -0.01% +0.22% +1.10% +3.33% +13.28%
Bench % +0.08% +0.32% +1.11% +3.12% +12.18%
Alpha % -0.07% -0.11% -0.01% +0.22% +1.09%
Median alpha -0.10% -0.26% -0.51% -1.41% -6.93%
Hit rate (α>0) 47.5% 47.3% 47.5% 46.2% 41.9%
p (naive) <0.001 <0.001 0.8210 <0.001 <0.001
p (HAC) <0.001 <0.001 0.8684 0.0055 0.0028
N 306,336 304,085 302,125 295,074 270,226
spxew Stock % -0.01% +0.22% +1.10% +3.33% +13.28%
Bench % +0.04% +0.23% +1.01% +2.94% +10.72%
Alpha % -0.06% -0.01% +0.11% +0.42% +2.69%
Median alpha -0.08% -0.15% -0.38% -1.16% -5.47%
Hit rate (α>0) 48.0% 48.3% 48.1% 46.8% 43.3%
p (naive) <0.001 0.1885 <0.001 <0.001 <0.001
p (HAC) <0.001 0.2040 0.0005 <0.001 <0.001
N 306,138 304,506 301,436 294,670 268,823
Distribution of all 20d alpha outcomes for this direction. Median and winsorized mean shown.
Stochastics (Slow) (stochastics) — bullish 20-day alpha histogram showing distribution of per-trigger returns
Observed 20d alpha (vertical line) against the null distribution of random-date firing. If the line is deep inside the null cloud, the signal adds no information. If it sits in a tail, the signal is doing real work in that direction.
Stochastics (Slow) (stochastics) — bullish 20-day observed alpha versus random-date permutation null (200 iterations)
Permutation null detail — all horizons × both benchmarks
200-iteration null: for each ticker, sample N random dates from its history (matching observed trigger count) and compute the same alpha. The null distribution's 95% CI is where a signal with no information would land. pperm = one-sided fraction of null iters with mean ≥ observed.
Horizon Bench Observed α Null mean Null 95% CI pperm
1d spx -0.04% -0.01% [-0.04%, +0.25%] 0.980
1d msci -0.07% -0.03% [-0.06%, +0.22%] 1.000
1d spxew -0.06% -0.03% [-0.06%, +0.22%] 0.910
5d spx -0.08% +0.09% [-0.01%, +0.35%] 1.000
5d msci -0.11% +0.10% [-0.01%, +0.36%] 1.000
5d spxew -0.01% +0.12% [+0.01%, +0.38%] 1.000
20d spx -0.08% +0.20% [+0.06%, +0.54%] 1.000
20d msci -0.01% +0.33% [+0.17%, +0.66%] 1.000
20d spxew +0.11% +0.40% [+0.25%, +0.73%] 1.000
60d spx -0.11% +0.40% [+0.18%, +0.79%] 1.000
60d msci +0.22% +0.85% [+0.62%, +1.24%] 1.000
60d spxew +0.42% +1.08% [+0.85%, +1.48%] 1.000
252d spx -0.95% +0.91% [+0.45%, +1.51%] 1.000
252d msci +1.09% +3.23% [+2.79%, +3.84%] 1.000
252d spxew +2.69% +4.62% [+4.16%, +5.22%] 1.000

Example triggers on US large-caps (2023+, mcap ≥ $30B)

Six recent bullish STOCHASTICS triggers on US mega-caps, filtered to |alpha| ≤ 25% to exclude catalyst-driven outliers (earnings surprises, M&A, binary events). The first three are the strongest outcomes — what the signal looks like when it works. The last three are the weakest — what the signal looks like when it fails. Each chart shows the stock's price with signal-appropriate technical overlays (e.g. MACD subpanel on MACD pages, Bollinger Bands on Bollinger pages, the 52-week trailing max line on 52w-high pages), a dot marking the trigger date, and the forward window shaded (green when the signal was right, red when it wasn't). Click any chart to open full-size.

Strongest outcomes (what STOCHASTICS looks like when it works)
Weakest outcomes (what STOCHASTICS looks like when it fails)
Stock-regime quadrants (2×2 per-stock, 20d alpha detail table)
Each quadrant groups triggers by the stock's own ADX(14) and RV(20) at the trigger date — the textbook conditioning variable (not market-level). Stock %, bench %, alpha %, and HAC p-value shown for each benchmark.
Quadrant N Stock % (spx) Bench % (spx) Alpha % (spx) p (HAC) Stock % (msci) Bench % (msci) Alpha % (msci) p (HAC) Stock % (spxew) Bench % (spxew) Alpha % (spxew) p (HAC)
Trending + Low vol Clean directional grind, low whipsaw 18,415 +0.09% +0.68% -0.57% <0.001 +0.09% +0.53% -0.41% <0.001 +0.09% +0.40% -0.25% <0.001
Trending + High vol Crisis selloff or parabolic rally 115,003 +1.29% +1.45% -0.14% 0.0106 +1.29% +1.31% -0.01% 0.7800 +1.29% +1.18% +0.14% 0.0086
Non-trending + Low vol Quiet chop, summer doldrums 28,057 +0.29% +0.81% -0.49% <0.001 +0.29% +0.66% -0.33% <0.001 +0.29% +0.50% -0.16% 0.0003
Non-trending + High vol Classical "whipsaw zone" for momentum 145,996 +1.29% +1.18% +0.13% 0.0032 +1.29% +1.17% +0.16% 0.0006 +1.29% +1.14% +0.21% <0.001
Sub-period breakdown table (20d alpha)
Historical clustering check. If alpha concentrates in one era, the signal's robustness is questionable.
Period N Alpha % (spx) p (HAC) Alpha % (msci) p (HAC) Alpha % (spxew) p (HAC)
2015-2019 2015-01-01 → 2020-01-01 84,909 +0.21% <0.001 +0.37% <0.001 +0.27% <0.001
2020-2022 2020-01-01 → 2023-01-01 100,318 +0.03% 0.5955 +0.14% 0.0175 -0.17% 0.0020
2023-2026 2023-01-01 → 2099-01-01 122,245 -0.37% <0.001 -0.37% <0.001 +0.24% <0.001

↓ Bearish triggers negative alpha = signal was right (stock underperformed market)

Bench Metric 1d 5d 20d 60d 252d
spx Stock % -0.01% +0.18% +0.63% +2.26% +10.88%
Bench % +0.02% +0.20% +0.96% +2.91% +13.28%
Alpha % -0.02% -0.01% -0.28% -0.63% -2.39%
Median alpha -0.02% -0.13% -0.74% -1.91% -8.24%
Hit rate (α>0) 49.4% 48.4% 45.9% 44.5% 39.4%
p (naive) <0.001 0.1096 <0.001 <0.001 <0.001
p (HAC) <0.001 0.1217 <0.001 <0.001 <0.001
N 339,616 338,076 335,478 329,805 294,678
msci Stock % -0.01% +0.18% +0.63% +2.26% +10.88%
Bench % +0.02% +0.18% +0.81% +2.40% +10.67%
Alpha % -0.02% +0.01% -0.11% -0.10% +0.23%
Median alpha -0.02% -0.10% -0.58% -1.37% -5.58%
Hit rate (α>0) 49.3% 48.8% 46.8% 46.0% 42.8%
p (naive) <0.001 0.1457 <0.001 0.0022 0.0057
p (HAC) <0.001 0.1590 <0.001 0.1390 0.4648
N 338,363 336,252 334,056 328,124 292,839
spxew Stock % -0.01% +0.18% +0.63% +2.26% +10.88%
Bench % +0.03% +0.19% +0.74% +2.12% +9.53%
Alpha % -0.04% -0.02% -0.04% +0.19% +1.49%
Median alpha -0.02% -0.10% -0.47% -1.09% -4.53%
Hit rate (α>0) 49.3% 48.8% 47.3% 46.7% 43.9%
p (naive) <0.001 0.0289 0.0452 <0.001 <0.001
p (HAC) <0.001 0.0355 0.1608 0.0061 <0.001
N 338,115 334,836 332,853 327,373 291,487
Distribution of all 20d alpha outcomes for this direction. Median and winsorized mean shown.
Stochastics (Slow) (stochastics) — bearish 20-day alpha histogram showing distribution of per-trigger returns
Observed 20d alpha (vertical line) against the null distribution of random-date firing. If the line is deep inside the null cloud, the signal adds no information. If it sits in a tail, the signal is doing real work in that direction.
Stochastics (Slow) (stochastics) — bearish 20-day observed alpha versus random-date permutation null (200 iterations)
Permutation null detail — all horizons × both benchmarks
200-iteration null: for each ticker, sample N random dates from its history (matching observed trigger count) and compute the same alpha. The null distribution's 95% CI is where a signal with no information would land. pperm = one-sided fraction of null iters with mean ≥ observed.
Horizon Bench Observed α Null mean Null 95% CI pperm
1d spx -0.02% +0.00% [-0.02%, +0.24%] 0.010
1d msci -0.02% -0.02% [-0.04%, +0.22%] 0.910
1d spxew -0.04% -0.02% [-0.04%, +0.22%] 0.164
5d spx -0.01% +0.12% [+0.01%, +0.50%] 0.010
5d msci +0.01% +0.13% [+0.01%, +0.51%] 0.030
5d spxew -0.02% +0.15% [+0.03%, +0.53%] 0.005
20d spx -0.28% +0.26% [+0.12%, +0.57%] 0.005
20d msci -0.11% +0.39% [+0.24%, +0.70%] 0.005
20d spxew -0.04% +0.46% [+0.31%, +0.77%] 0.005
60d spx -0.63% +0.60% [+0.39%, +0.94%] 0.005
60d msci -0.10% +1.04% [+0.82%, +1.41%] 0.005
60d spxew +0.19% +1.27% [+1.06%, +1.61%] 0.005
252d spx -2.39% +1.81% [+1.49%, +2.18%] 0.005
252d msci +0.23% +4.13% [+3.82%, +4.53%] 0.005
252d spxew +1.49% +5.47% [+5.13%, +5.83%] 0.005

Example triggers on US large-caps (2023+, mcap ≥ $30B)

Six recent bearish STOCHASTICS triggers on US mega-caps, filtered to |alpha| ≤ 25% to exclude catalyst-driven outliers (earnings surprises, M&A, binary events). The first three are the strongest outcomes — what the signal looks like when it works. The last three are the weakest — what the signal looks like when it fails. Each chart shows the stock's price with signal-appropriate technical overlays (e.g. MACD subpanel on MACD pages, Bollinger Bands on Bollinger pages, the 52-week trailing max line on 52w-high pages), a dot marking the trigger date, and the forward window shaded (green when the signal was right, red when it wasn't). Click any chart to open full-size.

Strongest outcomes (what STOCHASTICS looks like when it works)
Weakest outcomes (what STOCHASTICS looks like when it fails)
Stock-regime quadrants (2×2 per-stock, 20d alpha detail table)
Each quadrant groups triggers by the stock's own ADX(14) and RV(20) at the trigger date — the textbook conditioning variable (not market-level). Stock %, bench %, alpha %, and HAC p-value shown for each benchmark.
Quadrant N Stock % (spx) Bench % (spx) Alpha % (spx) p (HAC) Stock % (msci) Bench % (msci) Alpha % (msci) p (HAC) Stock % (spxew) Bench % (spxew) Alpha % (spxew) p (HAC)
Trending + Low vol Clean directional grind, low whipsaw 34,920 +0.15% +0.51% -0.31% <0.001 +0.15% +0.31% -0.10% 0.0197 +0.15% +0.15% +0.07% 0.0802
Trending + High vol Crisis selloff or parabolic rally 120,452 +0.79% +1.08% -0.24% <0.001 +0.79% +0.96% -0.09% 0.0694 +0.79% +0.85% +0.01% 0.7966
Non-trending + Low vol Quiet chop, summer doldrums 38,657 +0.20% +0.65% -0.42% <0.001 +0.20% +0.42% -0.19% <0.001 +0.20% +0.33% -0.09% 0.0195
Non-trending + High vol Classical "whipsaw zone" for momentum 145,722 +0.82% +1.04% -0.18% <0.001 +0.82% +0.92% -0.04% 0.3119 +0.82% +0.90% -0.03% 0.5061
Sub-period breakdown table (20d alpha)
Historical clustering check. If alpha concentrates in one era, the signal's robustness is questionable.
Period N Alpha % (spx) p (HAC) Alpha % (msci) p (HAC) Alpha % (spxew) p (HAC)
2015-2019 2015-01-01 → 2020-01-01 105,960 -0.39% <0.001 -0.17% <0.001 -0.11% 0.0044
2020-2022 2020-01-01 → 2023-01-01 104,094 +0.03% 0.5379 +0.18% 0.0004 -0.14% 0.0063
2023-2026 2023-01-01 → 2099-01-01 129,706 -0.41% <0.001 -0.28% <0.001 +0.13% 0.0060

Methodology and caveats

How to read. Entry at open of T+1 (one trading day after the signal fires on close of T). 20d = open T+1 to close T+20. Alpha = stock return − benchmark return over the same window (Convention A, single-sided, textbook). For bullish triggers, POSITIVE alpha = signal was right. For bearish triggers, NEGATIVE alpha = signal was right (stock underperformed market). No sign-flipping; the direction of the bet determines what "good" looks like. Per-stock regime is each stock's own ADX(14) and RV(20) at the trigger date — not market-wide state.

Three p-values, three robustness tests. (a) p_naive: scipy one-sample t-test on winsorized alphas. Optimistic because overlapping 20d windows on the same ticker inflate effective N. (b) p_hac: Newey-West HAC with lag = horizon — corrects for the overlap and is the academic-finance standard. (c) p_perm: fraction of 200 random-date null iterations with mean ≥ observed. Tests whether the signal beats random date selection at all. A signal that clears all three (pnaive, phac, pperm all < 0.05) has real information; a signal that fails pperm has zero edge even if the t-test says "significant."

Caveats. (i) Universe reflects today's active tickers; delisted losers pruned → survivorship bias. (ii) Mcap ≥ $100M filter uses today's snapshot, not point-in-time — mild lookahead on which stocks enter the sample, not on returns. (iii) Means and p-values use winsorized alphas (1/99 percentile) to prevent data errors from dominating. Medians and hit rates use raw data. (iv) Zero transaction costs assumed. Realistic bid-ask + commissions remove 20–40bps from 20d alpha on US large-caps, more on small-cap. Sub-20bps alpha is noise in practice. (v) Past performance does not predict future results.

How to use this

1 · When to reach for this signal

Caution recommended. Bullish 20d alpha is -0.08% and worse than random — triggering on random dates would have produced better long-side returns. Either direction fails the "beats random" test. Don't use Stochastics (Slow) as a standalone entry trigger. It may still be useful as part of a composite (section 4).

2 · When it works — the setups that drive it

  • Best bullish setup: Non-trending + High vol — alpha +0.13% / 20d on 145,996 historical triggers.
  • Best bearish setup: Non-trending + High vol — alpha -0.18% / 20d on 145,722 historical triggers.
  • Best era for bullish: 2015-2019 — alpha +0.21% / 20d.
  • Best era for bearish: 2020-2022 — alpha +0.03% / 20d.

3 · When it fails — common false positives

  • Weakest bullish cell: Trending + Low vol — alpha -0.57% / 20d on 18,415 triggers.
  • Weakest bearish cell: Non-trending + Low vol — alpha -0.42% / 20d on 38,657 triggers.
  • Worst era for bullish: 2023-2026 — alpha -0.37% / 20d.
  • Worst era for bearish: 2023-2026 — alpha -0.41% / 20d.

Signal-specific failure patterns

Bullish Stochastics (K cross above D out of oversold) fails
Slow Stochastics bullish produces α=−0.08 at 20d (p(HAC)=0.008, p_perm=1.000). The edge looks marginal but the permutation null rejects any claim of outperformance — random-date firing would have produced higher alpha. At 60d α=−0.11 but p(HAC)=0.15 (non-significant). The signal is a weak negative — 'don't use' rather than 'avoid'.
evidence: bullish vs SPX: 20d α=−0.08 p_perm=1.000; 60d α=−0.11 p_perm=1.000
Bearish is the clean tradable side
Stochastics bearish produces α=−0.28 at 20d (p(HAC)<1e-24, p_perm=0.005), compounding to −0.63 at 60d. The short-side edge is very strong statistically (absolute N=340k gives sharp p-values) and persistent across sub-periods except 2020-2022.
evidence: bearish vs SPX: 20d α=−0.28 N=340k p_perm=0.005; 60d α=−0.63 p_perm=0.005
2020-2022 liquidity regime rendered bearish Stochastics noise
Sub-period: 2015-2019 −0.39, 2020-2022 +0.03 (signal failed), 2023-2026 −0.41. Same QE-era breakdown as other oscillators. Use bearish Stochastics cautiously during identifiable liquidity surges (2020 COVID response, similar events).
evidence: bearish 20d vs SPX: 2015-19 −0.39, 2020-22 +0.03, 2023-26 −0.41

4 · Pairing inside a screen

The statements below describe how this signal relates to others by construction — which indicator family it belongs to, and where same-family redundancy might reduce the independence of evidence inside a Daily Report. These are taxonomic classifications drawn from standard technical-analysis texts; they are not pairing backtests. A multi-signal convergence backtest is planned but not yet run.

Oscillator-family redundancy

Stochastics belongs to the momentum-oscillator family alongside RSI, Williams %R, and CCI — each is constructed from closing price over a short lookback, normalised to a bounded range (Murphy, Technical Analysis of the Financial Markets, 1999; Pring, Technical Analysis Explained, 5th ed. 2014; Kirkpatrick & Dahlquist, Technical Analysis, 3rd ed. 2015). Stacking two or more of these in the same direction within a single Daily Report produces correlated rather than independent evidence.

What would likely rescue this signal

This block calls out the data or conditions that could turn a technically weak signal into a usable one in a composite screen. Based on signal mechanics and the observed failure patterns above; individual combinations are not yet backtested.

  • Pair with trend filterAdding a 50DMA downtrend filter to bearish Stochastics should concentrate the alpha. Untested individually but consistent with how the other oscillators behave.
  • Longer holding horizon60d alpha (−0.63) is more than double 20d alpha (−0.28). Time stops preserve more of the signal's edge than price stops.

See also Why technical-only signals don't survive on their own for the broader argument.

5 · Before you act — a 5-point checklist

  1. Normal trading day? Rule out earnings (within ±3 days), ex-dividend, or known corporate-action dates — the signal is almost certainly reading noise, not momentum, in those windows.
  2. Where is price vs its own 50 / 200 DMA? A mean-reversion signal firing against the long-term trend (e.g. oversold in a clean uptrend) is much more reliable than one firing with it.
  3. What's the sector breadth doing? An isolated signal in a broadly down-trending sector is a lower-confidence setup than one firing with the rest of its peer group.
  4. Is ADV20 enough for your size? If the trigger is on a $500M name and you want to move $1M notional, you're the tape. Consider adv20d ≥ 5% of your intended position.
  5. What invalidates you? Define a price level (for longs: a close below the trigger-day low; for shorts: close above the trigger-day high) and honor it. The backtest alpha is an average; any one trade can be at either tail.

Execution notes

Bearish is tradable. 20d and 60d both significant; 60d compounds. Entry open T+1. Bullish is a weak negative — skip.