QuanterLab produced this study: it wasn’t written up afterwards. Registered hypothesis and search record in Appendix A2.
As seen on Quantocracy
All research
QuanterLab · Research

Navigating Mean Reversion: Breaking Down the Base Mechanism

How this study was run: the companies, the method, the dates
Universe · S&P 500 (point-in-time constituents)
Method · Comparative: Stressed-market dips vs Every dip
Manipulated variable ·
Two arms open each first of January with the same point-in-time S&P 500 membership; Every Member passes the whole index into the same rule. Arm B takes every dip: a buy when the two-day RSI closes below 10 while the close is above its 200-day average, a sale when the close is back above its 5-day av… (full registered statement)Two arms open each first of January with the same point-in-time S&P 500 membership; Every Member passes the whole index into the same rule. Arm B takes every dip: a buy when the two-day RSI closes below 10 while the close is above its 200-day average, a sale when the close is back above its 5-day average. Arm A takes the same dips only when the market was stressed: the CBOE Volatility Index closed at 20 or above the session before (a day late on purpose, the index settles after the stock close). The level is fixed before the walk: from 1990 to 2005 the index averaged 19.45 and closed at 20 or above on 41 percent of days. The reason is the textbook one: a dip buyer supplies liquidity to sellers, and that pays most when liquidity is scarce, which is when the index is high (Nagel 2012). Exits follow the same rule in both arms whatever the index does. So the arms differ in one registered confirmation, and arm A trades only in stressed markets. Both hold up to ten positions, each a fixed tenth of the book from entry to exit; a new dip takes free room, shares it equally when it is short, and is skipped when the book is full. Fills follow the engine: the signal is read at the close and the position is held from that close; 0.1% of the traded value is paid on every entry and exit. What Happens Next rides on arm B: every new dip in the year after the anchor, its return 1, 5, 10 and 20 sessions later and against SPY over the same days, split by the stressed market and by quiet volume, once bought at the next open and once at the dip day's close.
Step size · 1 year per forward window
Out-of-sample span · 2006-01-03 → 2025-12-31
Compiled · September 26, 2026
Search family · the paper's twelve walks (N = 12, every member reported)
Abstract

Mean reversion is the idea that a price pushed too far in a few days tends to come part of the way back. The research explains it as a trade: holders who must sell at once push the price below what the news justifies, and whoever buys from them is paid when it drifts back.

We test its plainest trading form, the two-day RSI dip rule: buy a stock after a sharp two-day fall while its long trend is still up, and sell at the first close back above its short average. We run it on every member of the S&P 500 for twenty years, one year at a time, each year registered on the platform before it was run.

We measured the bounce first, with no trading: what the stock did in the days after a dip, and what the market did over the same days. Most of the bounce was the market's. Then we let the rule trade. Before costs it beat holding the index, but it trades so often that a small charge on each buy and each sell takes that lead away. Last we tried three ways to take fewer dips. Choosing them by the shape of the fall, or by how the stock behaved the year before, kept less than taking every dip. Taking only the dips that came when the VIX was high, when the research on liquidity expects buyers to be scarce, kept more once costs were high. Most of that lead was made in the three stressed years that began with the pandemic, and in calm bull years the gated book sits almost idle.

Why this one

I came to quantitative finance through mean reversion. A price pushed too far in a few days tends to come part of the way back, and that was the first market behaviour I could actually set up myself. Since then I have built thousands of versions of it: other entries, other exits, other filters, other markets, other holding periods. It is still my favourite mechanism, because it works like a tool with many knobs, and each knob changes what the tool does.

That is also why this paper shows the plain version and not my best one. After thousands of combinations, any striking curve I could put on this page would be the one that survived my own search, and it would tell you more about my search than about the market. So this paper is a lesson in how the mechanism works. It takes the textbook rule, runs it on every member of the S&P 500 for twenty years, and turns two knobs: what trading costs, and which dips to take. Every card in the circuit opens in the lab, and every knob this paper leaves alone is one you can turn yourself.

The mechanism

The usual answer in the research is a trade between two kinds of people. Some holders need to sell now, because of a margin call, a fund outflow, a stop order or plain fear, and they sell faster than buyers arrive, so the price falls further than the news behind it justifies. Whoever buys from them provides a service, the chance to sell at once, and is paid for it when the price drifts back. Lehmann (1990) and Jegadeesh (1990) found this short-term reversal in US stocks: the losers of one week or one month tended to do better the next. Lo and MacKinlay (1990) showed that part of it comes from stocks catching up with one another. Nagel (2012) tied the pay to the service: reversal profits were largest when the VIX was high, because that is when few people are willing to buy.

The rule in this paper is the plainest form of that trade. A dip is a day on which the two-day RSI, a gauge of how one-sided the last two closes were, falls below 10 while the close is still above its 200-day average: the long trend is up and the last two days were not. The position is sold when the close is back above its 5-day average. Practitioners know the rule from Connors and Alvarez (2008), and it has a thousand variations. We use its common form.

1  Methodology, in detail (click to open)

1  Methodology

The index. Each window starts on the first of January of a year from 2006 to 2025 with the S&P 500 as it stood that day, members included whatever became of them later. The Every Member card passes the whole index to the rule, with no ranking and no screen. A member counts when our data vendor has its prices: 345 members in 2006, rising to 498 from 2021 on (see the limits).

The rule. A dip is a day on which the two-day RSI closes below 10 while the close is above its 200-day average. The position is closed when the close is back above its 5-day average. Long only.

The book. Each window starts with 100,000 dollars. A new dip asks for a tenth of the book and keeps its size from entry to exit. Dips arrive faster than the book frees cash, so a day's new dips share whatever cash is free, and most positions end up far smaller than a tenth. The book usually holds many more than ten names. A dip that finds no free cash at all is skipped, and is not bought later in the middle of its move. The book buys at the close that gives the signal.

The cost. Four copies of each twenty-year walk differ only in the cost charged on every buy and every sell: nothing, 0.02, 0.05 and 0.1 percent of the traded value. A round trip pays twice that.

The walk. Each of the twenty one-year windows was registered on the platform before it was run, with the rule, the book and the cost fixed in the registration, and the paper is compiled from the frozen run reports. Growth a year compounds the twenty yearly returns. Sharpe ratios are the platform's pooled figure on the daily returns of all twenty windows, one basis for the whole page.

What Happens Next. On the every-dip book a second card records every new dip in the year and the stock's return 1, 5, 10 and 20 trading days later, bought at the next open (the figures) or at that day's close, raw and against SPY over the same days. It trades nothing and measures the bounce on its own. It counts every dip on every member, including dips on names the book already held.

The three designs. The first test registered, quiet slides, took a dip only when the last three days traded on less than 0.8 of the stock's 50-day average volume and less than half of the fall came in the overnight gaps: a slide on thin volume reads as selling that runs out, a gap as news. The second split the index by the Hurst exponent over the prior year and traded the most mean-reverting third against the most trending third. The third took a dip only when the VIX had closed at 20 or higher the session before. The level was fixed before the walk from years the walk does not test: from 1990 to 2005 the VIX averaged 19.45, so a stressed market here means a VIX above its long-run average, and about a quarter of all dips fell on such days. The one-session lag is there because the VIX settles after the stock market closes.

The family. Three designs at four costs make twelve walks, all reported here. On 24 September 2026 the first walk was registered and read, the Hurst design was registered after it, and the stress design after the Hurst walks were read. The paper's trial count is twelve.

2  Results

2.1  Headline

Stressed-market dips, Sharpe
0.47
pooled, at 0.1 percent a side
Every dip, Sharpe
0.30
pooled, at 0.1 percent a side
The result
Buying every dip in the S&P 500 grew a book 14.2 percent a year from 2006 to 2025 before trading costs, against 8.4 percent for SPY's price. It traded about 2,480 times a year, and at 0.1 percent on each buy and each sell it kept 3.6 percent. Taking only the dips that came after the VIX had closed at 20 or higher the session before cut the trades to about 740 a year and kept 5.1 percent at the same cost, most of the difference made in 2020 to 2022.

This paper answers for a declared family of 12 registered studies. 12 member walks are drawn as 24 lines (a comparative walk contributes one line per arm), each chained across its own out-of-sample windows, on one calendar axis, all rebased to 1× on the first session they share. 4 of them are shown to start, the ones the paper reads by; the others are switched off until their name is clicked. The paper’s own walk is the heavy line; the dashed grey line is the study’s own benchmark.

Every member walk chained across its out-of-sample windows, growth of 10.00x8.01x16.02x2007200920112013201520172019202120232025dips in a stressed market every dip · no trading cost · Stressed-market dipsdips in a stressed market every dip · no trading cost · Every dipplatform reference (SPY)dips in a stressed market every dip · Stressed-market dipsdips in a stressed market every dip · Every dip
Figure 1. The declared family: 24 lines, one per walk and one per arm of a comparative walk, 4 shown to start; the dashed grey line is the study’s own benchmark, platform reference (SPY), on the paper’s own windows (+402.8%). Growth of 1 on the left axis, every line rebased to 1× on 2006-01-03, the first session all of them share. The family table prints each walk over its own windows. Click a name to show or hide its line.
What happens after a dip. Every new dip of the rule in the S&P 500 from 2006 to 2025, split by the market it came in: the VIX at 20 or higher the session before (green, 16,512 dips) or lower (grey, 48,693). Each bar is the stock's average return 1, 5, 10 and 20 trading days later, bought at the next open; the right panel subtracts SPY over the same days.
Figure 2. What happens after a dip. Every new dip of the rule in the S&P 500 from 2006 to 2025, split by the market it came in: the VIX at 20 or higher the session before (green, 16,512 dips) or lower (grey, 48,693). Each bar is the stock's average return 1, 5, 10 and 20 trading days later, bought at the next open; the right panel subtracts SPY over the same days.
What the costs take. Growth a year over the twenty windows for the book that buys every dip and the book that buys only dips in a stressed market, at four costs charged on every buy and every sell. The dashed line is SPY's price, bought and held.
Figure 3. What the costs take. Growth a year over the twenty windows for the book that buys every dip and the book that buys only dips in a stressed market, at four costs charged on every buy and every sell. The dashed line is SPY's price, bought and held.
When each book trades. Trades opened in each year. The gated book trades most in 2009 to 2011 and 2020 to 2022, much less in other years, and not at all in 2017.
Figure 4. When each book trades. Trades opened in each year. The gated book trades most in 2009 to 2011 and 2020 to 2022, much less in other years, and not at all in 2017.
Sections 2.2 to 3, the full record: every year, every test, and how each one was run (click to open)

Table 1. What each book kept, by trading cost: growth a year, 2006 to 2025. Twenty one-year windows compounded. The cost is charged on every buy and every sell, so a round trip pays twice. Trades are the positions actually opened in a year, on average. SPY is its price only, without its dividends.

BookTrades a yearNo cost0.02% a side0.05% a side0.1% a side
Every dip2,48014.2%12.0%8.8%3.6%
Dips in a stressed market7408.6%7.9%6.9%5.1%
Quiet slides7008.2%6.8%4.7%1.3%
Mean-reverting third (Hurst)79011.6%9.9%7.4%3.5%
Trending third (Hurst)77010.6%9.0%6.6%2.7%
SPY price, bought and heldnone8.4%8.4%8.4%8.4%

Table 2. Sharpe on the pooled daily returns, by trading cost. The platform's pooled Sharpe over the daily returns of all twenty windows, the one basis this page uses.

BookNo cost0.02% a side0.05% a side0.1% a side
Every dip0.920.800.610.30
Dips in a stressed market0.730.680.600.47
Quiet slides0.720.610.450.17
Mean-reverting third (Hurst)0.870.760.590.32
Trending third (Hurst)0.820.710.540.27

Table 3. What happens after a dip, bought at the next open. Every new dip of the rule in the year, pooled over the twenty windows, split by the VIX close of the session before. Returns are averages, in percent. It counts every dip on every member, including dips on names the book already held, so it counts more dips than the book signalled.

DipsHow many1 day5 days10 days20 days20 days vs SPYUp after 5 days
In a stressed market16,512+0.09+0.62+1.25+2.13+0.4957.5%
In a calm market48,693+0.00+0.23+0.32+0.53-0.0854.2%
All dips65,205+0.02+0.33+0.55+0.94+0.0655.0%

Table 4. The two books year by year at 0.1% a side, 2006 to 2015. Trades opened in the year, and the year's return after costs, in percent.

YearTrades, every dipTrades, stressed onlyEvery dipStressed onlySPY price
20061,92473+15.3+2.7+11.8
20071,898497+9.8+11.5+3.4
2008694607-12.0-13.9-37.7
20091,9991,994+5.4+5.4+19.9
20101,8981,229-0.5-0.4+11.0
20112,2841,041-2.6+5.7-1.2
20122,526492-2.8+2.1+11.7
20133,361172+22.9+3.8+26.4
20143,334268+10.4+5.6+12.4
20152,005264-4.2+11.6-0.8

Table 5. The two books year by year at 0.1% a side, 2016 to 2025. Trades opened in the year, and the year's return after costs, in percent.

YearTrades, every dipTrades, stressed onlyEvery dipStressed onlySPY price
20162,432412-1.9+1.8+11.2
20173,1640+1.0+0.0+18.5
20182,393667-11.4-3.6-7.0
20192,75182+8.1+8.1+28.7
20202,3941,871+12.3+23.4+15.1
20214,3021,893+13.0+19.3+28.8
20221,6621,560-1.8+12.8-19.9
20232,175604-1.7+1.6+24.8
20243,765574+18.6+7.0+24.0
20252,566568+2.4+3.9+16.6

2.2  Per-step results

Table 6. One row per step, raw out-of-sample results. A short window can pair a negative return with a positive annualised Sharpe: at high daily volatility the arithmetic mean of daily returns sits above the compounded window return, and the Sharpe reads the former. Volatility drag, printed rather than smoothed.
#Out-of-sample window Stressed-market dips SR Every dip SR
1 2006-01-03 → 2006-12-29 1.43 1.25
2 2007-01-03 → 2007-12-31 1.06 0.71
3 2008-01-02 → 2008-12-31 -0.49 -0.39
4 2009-01-02 → 2009-12-31 0.39 0.39
5 2010-01-04 → 2010-12-31 0.06 0.06
6 2011-01-03 → 2011-12-30 0.41 -0.04
7 2012-01-03 → 2012-12-31 0.34 -0.18
8 2013-01-02 → 2013-12-31 1.10 1.74
9 2014-01-02 → 2014-12-31 1.64 0.89
10 2015-01-02 → 2015-12-31 1.48 -0.18
11 2016-01-04 → 2016-12-30 0.27 -0.10
12 2017-01-03 → 2017-12-29 n/a 0.16
13 2018-01-02 → 2018-12-31 -0.28 -0.71
14 2019-01-02 → 2019-12-31 2.18 0.69
15 2020-01-02 → 2020-12-31 1.04 0.61
16 2021-01-04 → 2021-12-31 1.58 0.87
17 2022-01-03 → 2022-12-30 0.84 -0.02
18 2023-01-03 → 2023-12-29 0.26 -0.05
19 2024-01-02 → 2024-12-31 1.42 1.42
20 2025-01-02 → 2025-12-31 0.34 0.22
Out-of-sample equity: normalised growth (1.00x = break even)0.74x1.01x1.28xbars into the window →
Figure 5. Stressed-market dips: every step's out-of-sample curve overlaid, each rebased to 1× at its own start. Read alongside the per-step table: consistent shape across steps is the walk-forward's evidence; a single lucky leg is not.
Out-of-sample equity: normalised growth (1.00x = break even)0.75x1.03x1.30xbars into the window →
Figure 6. Every dip: the same windows, the other arm. Compare shape-for-shape with the previous figure: the two arms trade the identical out-of-sample windows.

2.2b  Every test, in numbers

Figure 1 draws these walks; here is every one of them in numbers, the paper’s own walk first and the study’s benchmark last.

WalkWindowsSpanGrowth CAGRWorst drawdownPooled Sharpe
dips in a stressed market every dip · Stressed-market dips (this paper) 20 2006-01-03 → 2025-12-31 +171.9% +5.1% -27.5% 0.47
dips in a stressed market every dip · Every dip (this paper) 20 2006-01-03 → 2025-12-31 +103.3% +3.6% -32.2% 0.30
quiet slides every dip · Quiet slides 20 2006-01-03 → 2025-12-31 +30.0% +1.3% -33.8% 0.17
quiet slides every dip · Every dip 20 2006-01-03 → 2025-12-31 +103.3% +3.6% -32.2% 0.30
quiet slides every dip · no trading cost · Quiet slides 20 2006-01-03 → 2025-12-31 +382.7% +8.2% -23.4% 0.72
quiet slides every dip · no trading cost · Every dip 20 2006-01-03 → 2025-12-31 +1319.9% +14.2% -24.9% 0.92
the mean-reverting third the trending third · Mean-reverting third 20 2006-01-03 → 2025-12-31 +97.9% +3.5% -40.7% 0.32
the mean-reverting third the trending third · Trending third 20 2006-01-03 → 2025-12-31 +69.8% +2.7% -27.5% 0.27
the mean-reverting third the trending third · no trading cost · Mean-reverting third 20 2006-01-03 → 2025-12-31 +795.1% +11.6% -22.1% 0.87
the mean-reverting third the trending third · no trading cost · Trending third 20 2006-01-03 → 2025-12-31 +654.9% +10.6% -22.1% 0.82
quiet slides every dip · 0.02% a trade · Quiet slides 20 2006-01-03 → 2025-12-31 +271.4% +6.8% -25.3% 0.61
quiet slides every dip · 0.02% a trade · Every dip 20 2006-01-03 → 2025-12-31 +862.7% +12.0% -25.5% 0.80
the mean-reverting third the trending third · 0.02% a trade · Mean-reverting third 20 2006-01-03 → 2025-12-31 +561.9% +9.9% -24.8% 0.76
the mean-reverting third the trending third · 0.02% a trade · Trending third 20 2006-01-03 → 2025-12-31 +460.1% +9.0% -22.5% 0.71
quiet slides every dip · 0.05% a trade · Quiet slides 20 2006-01-03 → 2025-12-31 +150.6% +4.7% -28.4% 0.45
quiet slides every dip · 0.05% a trade · Every dip 20 2006-01-03 → 2025-12-31 +437.3% +8.8% -26.3% 0.61
the mean-reverting third the trending third · 0.05% a trade · Mean-reverting third 20 2006-01-03 → 2025-12-31 +320.9% +7.5% -28.5% 0.59
the mean-reverting third the trending third · 0.05% a trade · Trending third 20 2006-01-03 → 2025-12-31 +258.0% +6.6% -22.9% 0.54
dips in a stressed market every dip · no trading cost · Stressed-market dips 20 2006-01-03 → 2025-12-31 +423.4% +8.6% -25.0% 0.73
dips in a stressed market every dip · no trading cost · Every dip 20 2006-01-03 → 2025-12-31 +1319.9% +14.2% -24.9% 0.92
dips in a stressed market every dip · 0.02% a trade · Stressed-market dips 20 2006-01-03 → 2025-12-31 +359.1% +7.9% -25.5% 0.68
dips in a stressed market every dip · 0.02% a trade · Every dip 20 2006-01-03 → 2025-12-31 +862.7% +12.0% -25.5% 0.80
dips in a stressed market every dip · 0.05% a trade · Stressed-market dips 20 2006-01-03 → 2025-12-31 +277.3% +6.9% -26.3% 0.60
dips in a stressed market every dip · 0.05% a trade · Every dip 20 2006-01-03 → 2025-12-31 +437.3% +8.8% -26.3% 0.61
platform reference (SPY) (benchmark) 2006-01-03 → 2025-12-31 +402.8% +8.4% -57.4%

2.3  Search accounting

This paper's search is a declared family: the paper's twelve walks, counted at N = 12 evaluated books. Every member is either a registered walk with its own hypothesis and frozen record, or a derived average computed from those frozen records; every member is reported, in the family figure and table, and none was selected away. The count is declared by the author rather than derived from one project's ledger, because the members are sibling registered studies; the declaration names them and is frozen in this artifact. What the source strategy's author searched before publishing is not knowable from here and is not counted. The registered per-step record below still guarantees each window's hypothesis was hashed and registered before that window was scored.

2.4  The comparison

Both arms trade the same registered windows, so their returns can be PAIRED: inside each window the two return series are inner-joined date by date and the difference rStressed-market dips − rEvery dip is the object under test. Because this is ONE pre-declared contrast, frozen at registration before any window was scored, the paired statistic needs no multiple-testing deflation; the arm-level records carry the declared family count of §2.3 as their search accounting, and this contrast, registered per window before scoring, is not multiplied by it.

In the table: Arm A = Stressed-market dips · Arm B = Every dip.

Table 7. Window-by-window paired comparison. Δ is the growth gap (Arm A − Arm B) over the window's paired dates.
#WindowPaired bars Arm AArm B ΔLeader
1 2006-01-04 → 2006-12-29 250 +2.7% +15.3% -12.6 pp Arm B
2 2007-01-04 → 2007-12-31 250 +11.5% +9.8% +1.7 pp Arm A
3 2008-01-03 → 2008-12-31 252 -13.9% -12.0% -1.9 pp Arm B
4 2009-01-05 → 2009-12-31 251 +5.4% +5.4% +0.0 pp tie
5 2010-01-05 → 2010-12-31 251 -0.4% -0.5% +0.1 pp Arm A
6 2011-01-04 → 2011-12-30 251 +5.7% -2.6% +8.3 pp Arm A
7 2012-01-04 → 2012-12-31 249 +2.1% -2.8% +4.9 pp Arm A
8 2013-01-03 → 2013-12-31 251 +3.8% +22.9% -19.1 pp Arm B
9 2014-01-03 → 2014-12-31 251 +5.6% +10.4% -4.8 pp Arm B
10 2015-01-05 → 2015-12-31 251 +11.6% -4.2% +15.9 pp Arm A
11 2016-01-05 → 2016-12-30 251 +1.8% -1.9% +3.7 pp Arm A
12 2017-01-04 → 2017-12-29 250 +0.0% +1.0% -1.0 pp Arm B
13 2018-01-03 → 2018-12-31 250 -3.6% -11.4% +7.8 pp Arm A
14 2019-01-03 → 2019-12-31 251 +8.1% +8.1% -0.0 pp tie
15 2020-01-03 → 2020-12-31 252 +23.4% +12.3% +11.1 pp Arm A
16 2021-01-05 → 2021-12-31 251 +19.3% +13.0% +6.3 pp Arm A
17 2022-01-04 → 2022-12-30 250 +12.8% -1.8% +14.6 pp Arm A
18 2023-01-04 → 2023-12-29 249 +1.6% -1.7% +3.3 pp Arm A
19 2024-01-03 → 2024-12-31 251 +7.0% +18.6% -11.6 pp Arm B
20 2025-01-03 → 2025-12-31 249 +3.9% +2.4% +1.5 pp Arm A

Paired Sharpe of the difference track: 0.10 · block bootstrap (2000 paths, block 10, seed 1234): P(Stressed-market dips beats Every dip) = 69.0%.

Window win-rate. Stressed-market dips led 12 of 20 windows (60.0%), Every dip led 6, and 2 windows were ties, and the mean window gap of +1.40 pp points the same way. Widest single window: 2013 at -19.1 pp.

Table 8. The same comparison split at 2010. Pooling the whole walk into one row hides which side of the split the difference came from.
PeriodWindows Stressed-market dipsEvery dip Mean gapStressed-market dips led
All windows 20 +5.42% +4.02% +1.40 pp 12/20
Before 2010 4 +1.44% +4.64% -3.20 pp 1/4
2010 onward 16 +6.42% +3.87% +2.55 pp 11/16
All windowsn=20 · Stressed-market dips led 12 · Every dip led 6 · ties 2+5.4%+4.0%+1.40 ppBefore 2010n=4 · Stressed-market dips led 1 · Every dip led 2 · ties 1+1.4%+4.6%-3.20 pp2010 onwardn=16 · Stressed-market dips led 11 · Every dip led 4 · ties 1+6.4%+3.9%+2.55 ppgap
Figure 7. Mean window return per period. Stressed-market dips above, Every dip below, with the gap at right. The pooled bar and the post-2010 bar are the same comparison over different periods.

The two eras disagree by 5.75 pp. The pooled figure is therefore not a standing property of either method, it is dominated by the later period. Read the two rows, not the average.

3  The circuit

The strategy is a circuit of platform primitives, frozen when the study is registered. Below is the circuit as wired on the canvas, the objective it encodes and how the search runs through it, followed by the mathematics each primitive actually computes, the same formulas the execution engine runs. The complete parameterisation is preserved in the study ledger (Appendix A).

The hypothesis under test

The sentence below is the registered design with its rules in plain words; the exact registration record is in Appendix A2; the authored description of the design is Section 1.

A COMPARATIVE study: Stressed-market dips vs Every dip, walked on the same registered out-of-sample windows. Stressed-market dips: S&P 500, every member of the index, unranked, bought when the 2-day RSI is below 10; only when the close is above its 200-day average and the VIX closed at or above 20 the session before; sell when the close is above its 5-day average, and forward-tested out-of-sample from the anchor: the rule set is frozen at the anchor, with no in-sample re-optimization. Every dip: S&P 500, every member of the index, unranked, bought when the 2-day RSI is below 10; only when the close is above its 200-day average; sell when the close is above its 5-day average, and forward-tested out-of-sample from the anchor: the rule set is frozen at the anchor, with no in-sample re-optimization. The arms differ in: Signal Module, config (confirm: {2 entries} → {4 entries}). The contrast under test: whether Stressed-market dips generates better risk-adjusted returns than Every dip over the identical out-of-sample windows.

Every block in this study is a card from the platform's catalog: the index, Every Member, the Signal Module with the rule and its confirmations, the forward test that takes dips first come, the cost card and What Happens Next. Nothing was written for this paper. The thresholds, the confirmations, the exit, the slots and the cost are settings on those cards, so a reader can rebuild any of the twelve walks and change any of it.

The frozen circuit, data flows left to rightuniverse: click for detailsuniverseevery member: click for detailsevery membersignal module: click for detailssignal modulebacktest validator: click for detailsbacktest validatortransaction cost: click for detailstransaction costsignal forward autopsy: click for detailssignal forward autopsyuniverse: click for detailsuniverseevery member: click for detailsevery membersignal module: click for detailssignal modulebacktest validator: click for detailsbacktest validatortransaction cost: click for detailstransaction costsignal forward autopsy: click for detailssignal forward autopsyevent table: click for detailsevent tableevent table: click for detailsevent tableStressed-market dipsEvery dipshared
Figure 8. The frozen circuit, every node a primitive, every wire a typed data-flow; the two arms are colour-coded (Stressed-market dips green, Every dip blue, shared feeds neutral). Each box is one step of the strategy; data flows along the wires left to right, and no box can see data dated later than the box feeding it. The whole diagram was frozen when the hypothesis was registered. Click any node to open what that step ran with and what it produced.

Envelopes show counts, ratios, dates, and the parameters the author chose. Full price and per-name data series are not republished: the underlying market data is licensed to QuanterLab. Point figures quoted in the prose, a named holding's return over a stated span, are summary facts derived from public market prices, not redistributed series.

What each part does
Universe, The starting set of tickers, resolved point-in-time from the index change-log, so names delisted or removed later still compete on the dates they traded.
Every Member, Every name of the universe, unranked.
Signal Module, The entry / exit rule, turn indicators into a per-bar trade signal.
Backtest Validator, Forward-test the winning rule on unseen, out-of-sample data.
Transaction Cost, Charge for trading, slippage + commission on every turn.
Event Table, What happens next: every event, and the return that followed it.

The objective and the search

Stressed-market dips

UniverseS&P 500 index constituents.
Selectionevery member of the universe, unranked (no screen, no ranking).
Signal generationbuy when the 2-day RSI is below 10; only when the close is above its 200-day average and the VIX closed at or above 20 the session before; sell when the close is above its 5-day average.
Validation & out-of-samplesignal forward test (1y horizon from the anchor, each position a fixed 1/10 of the book; a position keeps its size to its exit, new signals take free room, share it equally when it is short, and skip the trade when the book is full; up to 520 names priced); overlays: Transaction Cost.
Other componentsSelect: Every Member.

Every dip

Signal generationbuy when the 2-day RSI is below 10; only when the close is above its 200-day average; sell when the close is above its 5-day average.

Every other specification row is identical to Stressed-market dips's table above.

What differs between the arms, one difference; the comparison is clean:

  • paramSignal Module, config
    • · only when: the close is above its 200-day average and the VIX closed at or above 20 the session before (Stressed-market dips); the close is above its 200-day average (Every dip)

Everything else is held identical, so an out-of-sample gap between the arms is attributable to this one change.

Cost elements are wired into the circuit.

Show the mathematics, 6 primitives, formulas and parity notes

3.1  Universe

The starting set of tickers, resolved point-in-time from the index change-log, so names delisted or removed later still compete on the dates they traded.

Before any math, you need a list of stocks. An index preset (S&P 500, Nasdaq-100, Dow 30) is reconstructed as it stood ON your anchor date by replaying the historical add/drop change-log backwards, so a 2018 backtest sees the 2018 membership, not today's winners.

Point-in-time membership

Start from today's constituents and un-apply every membership change after the anchor t:

\mathcal{U}(t) = \mathcal{U}_{\text{now}} \;\ominus\; \{\text{adds after } t\} \;\oplus\; \{\text{drops after } t\}
Constituents resolved from the index change-log; the same point-in-time set the factor + screening modules use.

3.2  Every Member

Every name of the universe, unranked.

Passes the whole universe through as survivors, in no order and without a screen. With a point-in-time universe that is the index exactly as it stood at the anchor, so a rule meant to look at every member (every dip, every event) does, and no ranking choice sits between the universe and the signal.

The set it passes
\mathcal{S} = \mathcal{U}(t_0)
All members at the anchor t0. The Signal Module then decides, name by name, which ones trade.

3.3  Signal Module

The entry / exit rule, turn indicators into a per-bar trade signal.

Composes indicators (RSI, moving averages, …) with comparison and logic operators into a rule that says enter, exit, or hold each bar. The rule is emitted as a portable config the optimizer tunes and the walk-forward validates, so what you design is exactly what gets traded.

Boolean rule → position state
\text{signal}_t = \begin{cases} +1 & \text{entry rule true} \\ 0 & \text{exit rule true} \\ \text{hold} & \text{otherwise}\end{cases}
e.g. enter when RSI < 30, exit when RSI > 50.

3.4  Backtest Validator

Forward-test the winning rule on unseen, out-of-sample data.

Takes the wired rule config (the Walk-Forward validated config wins, else the optimized config, else the raw signal config) and trades it FORWARD on the out-of-sample window to the right of the anchor, data it never saw during optimization, re-deriving the regime as-of each bar. It produces the true out-of-sample equity curve, trades and statistics: the signal-path twin of the Portfolio Forward Test, not an in-sample replay.

Apply the frozen rule forward (OOS)
E_t = E_{t-1}\,(1 + r_t),\qquad \text{Sharpe} = \frac{\bar r - r_f}{\sigma_r}\sqrt{252}
Config frozen from optimization / walk-forward, then replayed bar-by-bar on the forward window it has never seen, with cost + risk overlays applied.

3.5  Transaction Cost

Charge for trading, slippage + commission on every turn.

Real trading isn't free. This deducts a cost proportional to how much you trade (turnover), in basis points, so the backtest reflects net, not gross, performance.

Cost per rebalance
\text{cost}_t = \frac{\text{bps}}{10{,}000}\;\times\;\text{turnover}_t, \qquad \text{turnover}_t = \tfrac12\sum_i \lvert w_{i,t}-w_{i,t^-}\rvert

3.6  Event Table

What happens next: every event, and the return that followed it.

Finds every day a rule fires on the names it receives (a new event, not a repeat of yesterday), then measures each event’s return 1, 5, 10 and 20 sessions later, raw and against a benchmark over the same days, bought at the next open or at that day’s close. Up to two split rules divide the events into groups (quiet against loud volume, a stressed market against a calm one), so the table shows which kind of event was followed by what. It trades nothing: it is the evidence under a rule.

The return after an event
r_{i,h} = \frac{P_{i,\,t+h}}{P_{i,\,\text{fill}}} - 1, \qquad x_{i,h} = r_{i,h} - r_{\text{bench},h}
t is the event day; the fill is the next open or that close; h = 1, 5, 10, 20 sessions; the benchmark return runs over the same days.
Per group and horizon
\bar r_h,\ \operatorname{median}(r_h),\ \Pr(r_h > 0),\ \bar x_h
The count, the mean and median return, the share of events that were up, and the mean against the benchmark: overall, by calendar year, and by the split rules.
Reading it

Only events inside the window count: the year after the anchor in a walk, or the lookback years before it. A name without prices is listed as unpriced, not dropped without a word. Events close in time are not independent, so read the yearly rows before trusting a small difference.

4  Discussion

4.1  Findings

Most of the bounce is the market's. Twenty trading days after a dip the stock was up just under 1 percent on average, bought at the next open, and only 0.06 of it was ahead of SPY (Table 3).

The every-dip book beats the index before costs. It grew 14.2 percent a year against 8.4 percent for SPY's price (Table 1).

It trades too much for its edge. The book took about 2,480 trades a year, and every trade pays on the way in and on the way out. Each hundredth of a percent on a buy or a sell took about one point of growth a year off it (Figure 3, Table 1). It matches SPY's price at about 0.05 percent a side.

Trading less by what the dip or the stock looked like did not help. Quiet slides cut the trades to about 700 a year and kept less than every dip at every cost (Table 1). Split by the Hurst exponent, the most mean-reverting third did a little better than the most trending third, and neither kept as much as every dip at any cost.

Trading less by when the dip came did better once costs were high. Taking only the dips that came when the VIX had closed at 20 or higher the day before cut the trades by about 70 percent. Before costs the gated book grew less than every dip, because it sat out most calm years. Each hundredth of a percent a side took only about a third of a point a year off it, so above about 0.08 percent a side the order flips: at 0.1 percent it kept 5.1 percent a year against 3.6 (Table 1). It was ahead in twelve years, behind in six and level in two, and the paired test in Table 7 gives it about a seven-in-ten chance of beating every dip, where a coin would give five in ten. Most of its lead came in 2020 to 2022 (Tables 4 and 5). Leave those three years out and the two books grew at the same pace.

The reason is in the dips themselves (Figure 2, Table 3). A dip in a stressed market bounced several times as far as a dip in a calm one, and after twenty days only the stressed dips were ahead of SPY. The dips that pay are the ones bought when few others are buying, which is what Nagel (2012) found for reversal profits.

In calm bull years the gated book sits almost idle. In 2017 the VIX never closed at 20 or higher and it made no trade at all, and in 2013 it made a small part of every dip's gain. In 2022 it gained while every dip and SPY both lost. It did not protect in 2008, when it lost a little more than every dip.

4.2  Interpretation

We turned two knobs. These are the others a practitioner reaches for, and each is a card or a setting on the circuit in the lab.

How deep the dip. A two-day RSI below 10 is a moderate fall. Below 5 takes fewer, deeper dips; a three- or five-day RSI takes slower ones. Deeper dips tend to bounce harder and come less often, which raises the gain per trade and cuts the number of trades.

What confirms it. The 200-day average keeps the rule out of stocks in a long decline. Other confirmations test the story behind the fall: volume against its own average, the share of the fall that came in overnight gaps, the distance from the 52-week high, the state of the market. We tried two of the first kind and found little; the state of the market was the one that mattered here.

When to leave. Selling at the first close above the 5-day average takes the first part of the bounce. Waiting for the RSI to recover to 50 or 70, or holding a fixed number of days, trades less and holds longer, and What Happens Next shows the stressed dips still rising after twenty days.

How big a position. This book asks for a tenth of itself per dip and usually gets far less. Sizing by volatility gives calmer stocks more room; a cap on positions per sector keeps one bad day from filling the book with one industry.

How to fill. We filled at the signal close. Buying at the next open gave back a little of the bounce in our data; a limit order a little below the close buys only the dips that keep falling for a moment, a common practitioner refinement that also changes what the book pays in spread.

What to trade. The same rule on SPY itself trades a few times a year and pays one spread instead of hundreds; on pairs of related stocks it becomes statistical arbitrage, where the dip is measured against a partner instead of the stock's own past (Avellaneda and Lee 2010).

Which side. Everything here is long. The mirror rule, selling spikes, meets the index's long upward drift and pays for borrowing, which is why practitioners mostly keep the short side for hedged books.

Each of these changes the trade count and the gain per trade together, so judge a variation by what it keeps per trade after costs. The reversal the early papers measured has also shrunk as more money trades it: Khandani and Lo (2007) followed a daily reversal strategy of Lehmann's kind and found its returns falling year after year from 1995 to 2007. In our data the every-dip book did not fade: at 0.1 percent a side it grew at about the same pace in the second decade as in the first. The one knob this paper cannot turn for you is your own trading cost.

Enter the lab

The circuit behind every walk is published with this paper: the index, Every Member, the Signal Module with the rule, the forward test, the cost card and What Happens Next. Open it in the lab, change one knob, and walk it forward over the same twenty years. The platform registers your version before it runs and keeps its record next to ours.

4.3  Limitations

Prices are missing for part of the index in the early years. Our vendor has price histories for 345 of the index's members in 2006, rising to 498 by 2021; most of the missing names are companies that later left the index. For a dip buyer that flatters the early years, because the dips that never came back include those of companies that failed. The gate's lead was made in 2020 to 2022, when nearly every member was priced, so the missing names do not drive it.

The book buys at the close that gives the signal. Buying at the next open instead gives back a little of the bounce.

Prices in this paper leave out dividends, for the stocks and for SPY alike. The every-dip book holds stocks most of the year, so it misses close to what SPY misses, about two points a year, and its comparison with SPY's price is close to like for like. The gated book sits in cash most of the year, so it misses less, and its idle cash earns nothing here. Dividends would add more to the every-dip book and interest on cash more to the gated book. Each could move the gap between them at 0.1 percent a side by about a point, in opposite directions.

Costs are a flat share of the traded value. Real costs grow with size and with the speed at which a book buys into a falling market. Read the ladder for its shape. Your own bill depends on your size and your broker.

The VIX level of 20 was fixed from 1990 to 2005, before the walk, and was not tuned on these years. Other levels give other books, and a reader who tries them is running a new search.

The stress design was registered after the first two designs were read, which the family record states and the trial count of twelve covers.

References

QuanterLab reference architecture
  1. Gelman, A., & Loken, E. (2013). The garden of forking paths: Why multiple comparisons can be a problem, even when there is no “fishing expedition.” Working paper, Columbia University.
  2. Harvey, C. R., Liu, Y., & Zhu, H. (2016). … and the Cross-Section of Expected Returns. Review of Financial Studies, 29(1), 5–68. doi:10.1093/rfs/hhv059
  3. Lo, A. W. (2002). The Statistics of Sharpe Ratios. Financial Analysts Journal, 58(4), 36–52. doi:10.2469/faj.v58.n4.2453
Author’s references?
  1. Lehmann (1990), Fads, martingales, and market efficiency, Quarterly Journal of Economics: the losers of one week in US stocks beat the winners the next week.
  2. Jegadeesh (1990), Evidence of predictable behavior of security returns, Journal of Finance: monthly stock returns reverse in the following month.
  3. Lo and MacKinlay (1990), When are contrarian profits due to stock market overreaction?, Review of Financial Studies: part of the reversal profit comes from stocks lagging one another.
  4. Connors and Alvarez (2008), Short Term Trading Strategies That Work: the two-day RSI rule with the 200-day and 5-day averages.
  5. Nagel (2012), Evaporating liquidity, Review of Financial Studies: short-term reversal profits rise with the VIX; a dip buyer is paid for providing liquidity.
  6. Khandani and Lo (2007), What happened to the quants in August 2007?, Journal of Investment Management: a daily reversal strategy whose returns fell year after year from 1995 to 2007.
  7. Avellaneda and Lee (2010), Statistical arbitrage in the US equities market, Quantitative Finance: reversal measured against related stocks.

Appendix A  Reproducibility in QuanterLab

Each step is backed by a frozen run report. The study is re-derivable from the ledger below.

#CommitReportAnchorOOS window
1 e92ae6815e59 11360 2006-01-01 2006-01-03 → 2006-12-29
2 079ceae179e5 11361 2007-01-01 2007-01-03 → 2007-12-31
3 4103de442c6f 11362 2008-01-01 2008-01-02 → 2008-12-31
4 a61c7a0d3c82 11363 2009-01-01 2009-01-02 → 2009-12-31
5 b72c96a99dec 11364 2010-01-01 2010-01-04 → 2010-12-31
6 1cee65bb8c0d 11365 2011-01-01 2011-01-03 → 2011-12-30
7 b43994d20996 11366 2012-01-01 2012-01-03 → 2012-12-31
8 bb08b6798802 11367 2013-01-01 2013-01-02 → 2013-12-31
9 0b238458bb83 11368 2014-01-01 2014-01-02 → 2014-12-31
10 3772eecfe2df 11369 2015-01-01 2015-01-02 → 2015-12-31
11 5785df0d15f3 11370 2016-01-01 2016-01-04 → 2016-12-30
12 9738f836d9da 11371 2017-01-01 2017-01-03 → 2017-12-29
13 1a541366eb64 11372 2018-01-01 2018-01-02 → 2018-12-31
14 f609049b5520 11373 2019-01-01 2019-01-02 → 2019-12-31
15 54491c680b57 11374 2020-01-01 2020-01-02 → 2020-12-31
16 7a863a9b8901 11375 2021-01-01 2021-01-04 → 2021-12-31
17 8539e1193648 11376 2022-01-01 2022-01-03 → 2022-12-30
18 9b6e4a14a3d3 11377 2023-01-01 2023-01-03 → 2023-12-29
19 96498a58666f 11378 2024-01-01 2024-01-02 → 2024-12-31
20 2652dc605a09 11379 2025-01-01 2025-01-02 → 2025-12-31

Appendix A2  Registration record

What this record does and does not establish. Every window in this study is historical: the data existed before the study began, so this is sequential registration on past windows, not pre-registration in the clinical-trial sense, and no procedure could make it so. What the platform does enforce is order, each step's specification was frozen and hashed before that step was scored, and the walk cannot advance past a step that was never run or close one with a result registered for a different window. The two timestamp columns below are the evidence: read them together and each registration precedes its own run, and each run precedes the next registration. A study whose registrations all post-date its runs would show it here. Wall-clock spacing between registrations varies with the author's schedule and queue latency; the ordering, not the tempo, is the claim.

“A COMPARATIVE study: Stressed-market dips vs Every dip, walked on the same registered out-of-sample windows. Stressed-market dips: S&P 500, selected by statistical / factor criteria, traded via enter long when RSI (length=2) less than 10; confirmed by BBANDS (length=200, std=2) greater than 0 and VIX (lag=1) ≥ 20; exit when BBANDS (length=5, std=2) greater than 0, and forward-tested out-of-sample from the anchor: the rule set is frozen at the anchor, with no in-sample re-optimization. Every dip: S&P 500, selected by statistical / factor criteria, traded via enter long when RSI (length=2) less than 10; confirmed by BBANDS (length=200, std=2) greater than 0; exit when BBANDS (length=5, std=2) greater than 0, and forward-tested out-of-sample from the anchor: the rule set is frozen at the anchor, with no in-sample re-optimization. The arms differ in: Signal Module, config (confirm: {2 entries} → {4 entries}). The contrast under test: whether Stressed-market dips generates better risk-adjusted returns than Every dip over the identical out-of-sample windows.”

The same hypothesis was registered independently at every step, hashed before each step's out-of-sample window was scored:

Table 9. Registration audit, one row per registered step, with the time each specification was frozen and the time its window was scored. The hypothesis is identical on every row by design: it was registered once and re-registered unchanged at each anchor. Rows that differ would mean the specification moved mid-walk, which is the thing this record exists to rule out. The timestamps are the separate claim: each registration precedes its own run, and each run precedes the next registration.
#AnchorRegistered at (UTC)Run completed (UTC)
1 2006-01-012026-09-24 14:47:45 2026-09-24 14:49:10
2 2007-01-012026-09-24 14:49:10 2026-09-24 14:51:00
3 2008-01-012026-09-24 14:51:00 2026-09-24 14:52:25
4 2009-01-012026-09-24 14:52:25 2026-09-24 14:53:50
5 2010-01-012026-09-24 14:53:50 2026-09-24 14:55:27
6 2011-01-012026-09-24 14:55:27 2026-09-24 14:56:52
7 2012-01-012026-09-24 14:56:52 2026-09-24 14:58:30
8 2013-01-012026-09-24 14:58:30 2026-09-24 14:59:55
9 2014-01-012026-09-24 14:59:55 2026-09-24 15:01:32
10 2015-01-012026-09-24 15:01:32 2026-09-24 15:03:09
11 2016-01-012026-09-24 15:03:09 2026-09-24 15:04:46
12 2017-01-012026-09-24 15:04:46 2026-09-24 15:06:24
13 2018-01-012026-09-24 15:06:24 2026-09-24 15:08:01
14 2019-01-012026-09-24 15:08:01 2026-09-24 15:09:40
15 2020-01-012026-09-24 15:09:40 2026-09-24 15:11:17
16 2021-01-012026-09-24 15:11:17 2026-09-24 15:12:54
17 2022-01-012026-09-24 15:12:55 2026-09-24 15:14:32
18 2023-01-012026-09-24 15:14:32 2026-09-24 15:16:09
19 2024-01-012026-09-24 15:16:09 2026-09-24 15:17:46
20 2025-01-012026-09-24 15:17:46 2026-09-24 15:19:24

Appendix B  Per-step diagnostics

Realized in the projection tables below is the risk engine scoring its own forecast: the buy-and-hold return of the segment that followed each rebalance, on the same gross basis the cone was projected on. It is deliberately not the charged, calendar-window total return the study’s tables print, so the two will not reconcile line by line; the cone and its outcome share one basis, which is what a calibration test requires. Each row names its segment’s span so a boundary session is visible.

Names held is the union across the window: the count of distinct instruments the book touched between the window’s first and last session, not the number it held at one time. A book that rotates monthly touches more names than it holds.

What each step's run actually did beyond its return: capital allocation across lanes and regimes, the portfolio book's rebalancing and cost drag, and how positions were sized. Harvested from the frozen run reports, present where the circuit produced them. Cost drag is the gap between the step's return before and after its trading costs, in percentage points of the step's starting capital, so on a book that trades every session and compounds it can exceed the step's own net return.

Open the full per-step grid (20 steps: every rebalance, capital routing and sizing, per window)

Step 1 · 2006-01-03 → 2006-12-29

Position sizing, sizing: equal

Step 2 · 2007-01-03 → 2007-12-31

Position sizing, sizing: equal

Step 3 · 2008-01-02 → 2008-12-31

Position sizing, sizing: equal

Step 4 · 2009-01-02 → 2009-12-31

Position sizing, sizing: equal

Step 5 · 2010-01-04 → 2010-12-31

Position sizing, sizing: equal

Step 6 · 2011-01-03 → 2011-12-30

Position sizing, sizing: equal

Step 7 · 2012-01-03 → 2012-12-31

Position sizing, sizing: equal

Step 8 · 2013-01-02 → 2013-12-31

Position sizing, sizing: equal

Step 9 · 2014-01-02 → 2014-12-31

Position sizing, sizing: equal

Step 10 · 2015-01-02 → 2015-12-31

Position sizing, sizing: equal

Step 11 · 2016-01-04 → 2016-12-30

Position sizing, sizing: equal

Step 12 · 2017-01-03 → 2017-12-29

Position sizing, sizing: equal

Step 13 · 2018-01-02 → 2018-12-31

Position sizing, sizing: equal

Step 14 · 2019-01-02 → 2019-12-31

Position sizing, sizing: equal

Step 15 · 2020-01-02 → 2020-12-31

Position sizing, sizing: equal

Step 16 · 2021-01-04 → 2021-12-31

Position sizing, sizing: equal

Step 17 · 2022-01-03 → 2022-12-30

Position sizing, sizing: equal

Step 18 · 2023-01-03 → 2023-12-29

Position sizing, sizing: equal

Step 19 · 2024-01-02 → 2024-12-31

Position sizing, sizing: equal

Step 20 · 2025-01-02 → 2025-12-31

Position sizing, sizing: equal

QuanterLab · Study b345b7fc5960 · compiled September 26, 2026. Point-in-time constituents and hypothesis-registration timestamps are enforced by the platform. This report is generated from the frozen study artifact and is reproducible from the ledger above. Educational research, not investment advice: every result on this page is simulated, and nothing here is a recommendation to buy or sell any security.

Run a study like this one

Everything above was produced inside QuanterLab, the registration, the walk, the statistics and the paper itself. Build the circuit on a canvas, register the hypothesis before you score it, and the platform enforces the rest.

Reading the research needs no account; creating one is free. Follow the research and we'll tell you when the next study publishes.

As seen on Quantocracy

A note on AI. QuanterLab is a quantitative finance research platform, and every number in this study comes from a run on the platform. The hypothesis, the parameter choices, the validation design and the conclusions belong to the author. Runs execute on point-in-time data with walk-forward validation, and each study ships with its methodology and logs, so a reader can reconstruct the result instead of trusting it. I use AI to edit and structure the prose; it does not generate results, produce numbers, or decide what a study concludes.