Edge Lab / HV-RSI

HV-RSI — Short-Term Mean Reversion

A survivorship-bias-free evaluation on the S&P 500 — with a cash-matched random-portfolio skill test, out-of-sample robustness, and a capital-efficiency analysis, on split- and dividend-adjusted prices.

Long only Evaluated Capital-light sleeve

← OverviewDeep Dive

The system, and what it returns

HV-RSI buys short-term dips in strong S&P 500 names via a limit order a few percent below the close, and holds for about a week. It is in the market rarely — it holds a position on ~38% of trading days and deploys only ~8% of capital on average — so its raw return is the wrong lens. The questions that fit are whether the per-trade signal is real, whether it survives out-of-sample, and what the deployed slice earns. Across 21 years of survivorship-bias-free history, on split- and dividend-adjusted prices:

Disclosure-date caveat. HV-RSI reached us as a fixed specification from Glenn Osborne in January 2025, and the author states he conceived the system in 2021. We adopt 2025 as the out-of-sample pivot — the conservative date at which we can confirm the exact ruleset was fixed for this test — so only results from 2025 forward are genuine walk-forward. The 2005–17 / 2018–26 split below is a temporal-stability check of the fixed parameters on unseen data, separate from this disclosure pivot. If the 2021 conception is taken as the operative date, that earlier pivot extends the genuine walk-forward window.
Where this sits — Edge Lab stage funnel
S1 · Feasibility & signalsdone
S2 · Entry quality vs randomdone
S3 · Cadence & regimedone
S4 · Portfolio P&L vs buy & holddone
S5 · Robustnessdone
S6 · Publicationdone
S7 · Promotionplanned
S8 · Maintenanceplanned
Contents
  1. The system
  2. Setup & data
  3. The system vs. buying the index (and why exposure matters)
  4. A trade, drawn out (sample chart)
  5. Skill or luck? the cash-matched monkey
  6. Does it hold up out-of-sample?
  7. Can you deploy more capital?
  8. Metrics by lookback
  9. Sizing out-of-sample
  10. Exposure & holding period
  11. What this means for you
  12. Costs, slippage & cash
  13. Constraints
  14. Code, data & artifacts

1. The system

A short-term mean-reversion system specified by Glenn Osborne (January 2025). The thesis: a strong stock making fresh short-term lows on consecutive days is likely to bounce within a week, and a limit order a few percent below the close fills only when intraday selling reaches that price.

Entry signal

A name above its 150-day SMA whose position within the prior 10-day high/low range is below the low for two consecutive days (a fresh short-term low while in an uptrend).

Fill

A limit order 3% below the signal-day close; it fills only if the next day’s low reaches that price. Unfilled orders expire.

Liquidity filters

Price ≥ $2 and 25-day average volume ≥ 100k shares, to keep fills realistic.

Exits

Close above the prior day’s high (the bounce), or a 5-trading-day time stop — whichever comes first.

Sizing

Up to 20 concurrent slots at 10% of equity each; in practice the book rarely fills more than one or two, so deployment stays low.

Ranking

When more signals fire than slots, the deepest short-term lows are taken first.

2. Setup & data

The universe uses point-in-time, survivorship-bias-free (SBF) S&P 500 membership: each historical date resolves to the names that were index members on that date, including those later delisted, acquired, or removed.

Universe (index membership — partial list)

The universe exceeds 100 names, so individual symbols are not enumerated. It is defined by membership: the SBF ever-member set of the S&P 500 is ~959 names. Each trading date resolves to the members active on that date.

ItemValue
UniverseS&P 500, SBF membership (~959 ever-members)
Window2005-01-03 → 2026-05-15 (21.4y)
Slots20 × 10% of equity
Starting capital$100,000
Prices are split- and dividend-adjusted. Each symbol’s open/high/low/close is reconstructed from its adjusted close (ratio method) before any signal, fill price, or P&L is computed, so a stock split is not mistaken for a price move within a held position. The data is an end-of-day, survivorship-bias-free dataset (Norgate-derived) with point-in-time membership. Commissions are modeled and slippage is bounded in §12; the headline runs at 0% on idle cash, which the reader must supplement with their own cash return on the ~90% idle balance.

3. The system vs. buying the index (and why exposure matters)

Finding

On raw return the system trails buy-and-hold (4.0% vs 10.9% a year) because it holds cash most of the time. It is a capital-light book that is rarely exposed, then strikes. The applicable measures are the per-trade edge and the risk-normalized return on the slice it deploys; raw CAGR measures a different exposure profile.

MetricHV-RSI systemBuy & hold SPY
CAGR (as tested, 0% on cash)4.02%10.88%
Exposure-adjusted return (in-market only)~11.0%10.88%
Average capital deployed~7.7%100%
Max drawdown−13.35%−55.19%
Win rate65.0%
Profit factor1.58
N trades / avg hold1,096 / 3.9 days
Final equity ($100k)$232,089$908,276

The book runs at roughly one-thirteenth the capital at risk and one-quarter the drawdown (−13.4% vs −55.2%). The slice it deploys compounds at ~11%/yr (§10); the constraint that binds the system is how rarely it can deploy capital, addressed by the risk-normalized CAR25 in §5.

Capital deployed over time
The defining feature. Capital deployed (violet) averages ~8% and is usually near zero; buy-and-hold is 100% (dashed). The system spikes in only when dips cluster — e.g. 2008, 2011, 2020, 2022 — and sits in cash otherwise.
Equity: HV-RSI vs buy & hold SPY, log scale
Equity, $100k start, log scale. The system (violet) grows slowly and smoothly to $232k; buy-and-hold SPY (dashed) reaches $908k through far deeper declines.
Drawdown, HV-RSI vs SPY
Drawdown from peak. The system’s worst is −13.4%; SPY’s is −55% (2008). Being in cash almost all the time is, mechanically, the drawdown control.

Year by year — monthly returns

System monthly returns — green positive, red negative, color intensity scaled to size. Yr% is the system’s full-year return; SPY is buy-and-hold for context. The system rarely moves much in any month (it is mostly cash) yet stays green through the years the index fell hardest — 2008 system flat vs SPY −37%. 2026 is year-to-date through May.

View the full monthly-returns grid (2005–2026)
YearJanFebMarAprMayJunJulAugSepOctNovDecYr%SPY
2005+0.5+0.2-0.3+1.0+1.4+0.0+0.1+0.5+0.4+4.7+0.0+0.4+9.2+5.3
2006+0.0-0.7+1.1+0.4-1.3+0.7+0.6+0.0-0.4-1.4-0.3+0.1-1.1+13.8
2007+0.6+0.2-2.2+0.0+0.3+0.8-2.4+0.6+0.0+0.0+0.2+0.4-1.4+5.3
2008+1.8+0.0+0.2+0.4+0.4+1.0+2.9+0.0-0.9-1.4+0.0+0.0+4.4-36.2
2009+0.0+0.0+0.0+0.3+1.8+1.1+2.8+0.0+1.6-3.5+3.6+0.0+7.8+22.7
2010+0.6+0.2-0.2-0.7+1.2-1.3+5.1+0.9+0.0+0.1+0.4+0.0+6.3+13.1
2011+0.6+1.3+1.4+0.2+2.8+0.4+0.5-8.2-0.1+0.8+0.1+0.9+0.3+0.9
2012+0.2+0.0+0.8+1.7-1.9+0.0+0.5+0.0+0.0-0.3+0.7+0.0+1.7+14.2
2013-0.1-0.1+0.2+2.2-0.0+2.8-0.2-0.0+0.3+0.5-0.4-0.9+4.3+29.0
2014-0.3+0.0+0.4+1.1+0.0+0.0-1.6+1.1+0.1+4.3+0.4+1.3+6.9+14.6
2015+0.7+0.4+0.3-0.1+0.0+0.1-1.2+2.5-0.4+0.0+0.3+0.4+3.0+1.3
2016-0.3+0.0+0.0+0.1+0.0-0.2+0.6-0.1-0.5-0.1-0.1+0.0-0.5+13.6
2017+0.8-0.6-1.0+0.2-0.2+0.0+0.6+0.0+0.1+0.4-0.1+0.4+0.6+20.8
2018+0.1-1.4+0.4+0.0-1.1-0.4-0.1+0.2-0.1-3.5-2.2-0.6-8.4-5.2
2019+0.0+0.0+0.9+1.2-0.1+1.3+0.2-0.1+0.0+0.0+1.7+0.3+5.4+31.1
2020-2.0-4.4+2.1+0.0+0.4+0.9+0.2+0.0+2.7+2.5+4.0+1.1+7.4+17.2
2021+1.9+3.4+10.5+0.4+0.0-0.1+3.4+0.8+2.9+1.0-0.4+0.7+27.0+30.5
2022+2.6+4.8+0.5+0.8-1.8-6.3+0.1+0.1-1.3+0.0+0.0-1.1-2.0-18.6
2023-0.2+0.3-2.5+0.0-0.3+0.7+0.0+0.8+0.9-0.2+0.6+0.4+0.2+26.7
2024+1.6+0.0+0.3+2.9+1.4+0.4+0.5+1.1+0.5-0.0+0.5-1.2+8.4+25.6
2025-0.4+4.9-1.3+4.4-0.0+0.4+0.0+0.5-0.4+2.2-0.2+0.3+10.7+18.0
2026*+1.0-0.9-0.0-0.1+0.3·······+0.3+8.5
Rolling 12-month return by market regime
Average rolling 12-month return, system (violet) vs buy-and-hold SPY (grey), bucketed by SPY’s own 12-month return. The system is roughly flat-to-positive in every bucket — it neither falls with the index on the left nor keeps up with it on the right. A near-cash, low-beta return stream.

4. A trade, drawn out

One symbol from the run, with the system’s level and decisions on real (split-adjusted) price: the 150-day SMA the trend filter uses, entry marks (green) where a 3%-below limit filled after two consecutive short-term lows, and exit marks colored by reason — the bounce (close above prior high) or the 5-day time stop.

Annotated sample — KLAC (S&P 500)
KLAC dip-buy entries and one-week exits
KLAC over a ~2-year window. Entries cluster on pullbacks within the uptrend (above the 150-day SMA); each holds only a few days to the bounce or the time stop. The short holds and the infrequent fires are why the book is capital-light.

5. Skill or luck? the cash-matched monkey

The monkey baseline here is cash-matched: it runs the identical machinery (same SMA150 / price / volume gates, same 3%-below limit, same exit, same 20 slots) and replaces only the short-term-low signal with a random draw from the eligible pool. 40 seeds per window, scored on canonical risk-normalized CAR25.

Finding

HV-RSI clears 100% of cash-matched monkeys in both windows — every one of the 40 random seeds lands below it. The monkey CAR25 clusters near zero (median ≈ 0) while each deploys 4–8× more capital (random names dip 3% just as often; those fills bounce less, at a monkey win rate ~57–58% against the system’s 65%). The “two consecutive short-term lows in an uptrend” selection is what separates it from random, and the separation is the same magnitude in-sample and out-of-sample.

HV-RSI vs cash-matched monkey CAR25
Risk-normalized CAR25. HV-RSI (violet diamond) sits far right of the random-monkey cluster (grey, p5–p95) — which is clustered near zero, every seed below HV-RSI — in both the in-sample and out-of-sample windows.
WindowHV-RSI CAR25HV exposureHV win rateMonkey CAR25 (p50)Monkey exposureMonkey win rateHV percentile
In-sample 2005–17+4.16%4.9%64.8%−0.04%~33%~57%100%
Out-of-sample 2018–26+6.39%11.8%64.8%−0.08%~38%~58%100%

CAR25 is the canonical risk-normalized annual return (Bandy safe-f at a −20% drawdown constraint), the same metric used to rank systems across the platform; it excludes cash interest. The system’s safe-f pins at the leverage ceiling in every window — the −20% drawdown limit never binds — which means its constraint is capital deployment, not risk (it is so rarely invested that even heavy leverage doesn’t reach a 20% drawdown). See §9.

6. Does it hold up out-of-sample?

Finding

The parameters are taken verbatim from the source specification (nothing was fit here), so an in-sample / out-of-sample split asks “does the same fixed rule keep working on unseen data?” On the S&P 500 the edge is flat-to-improving out-of-sample: the win rate holds and the profit factor rises.

In-sample vs out-of-sample, SPY
Win rate, profit factor, CAGR (ex-interest) and max drawdown, in-sample vs out-of-sample on the S&P 500. The profile is steady-to-improving on unseen data.
MetricSPY in-sample (2005–17)SPY out-of-sample (2018–26)
Trades558539
Win rate64.9%64.9%
Profit factor1.551.61
CAGR (ex-interest)+3.13%+5.40%
Max drawdown−12.75%−13.36%
CAR25 (risk-normalized)+4.16%+6.39%

Small-cap cross-check (next test). Applying the same rules to the Russell 2000 would test whether the edge is universe-dependent. That cross-check is not run on the split-adjusted prices used here (the Russell membership is not available in this run’s environment), so it is not reported as a current result; running it on adjusted data is the next test. Windows: in-sample 2005-01 → 2017-12, out-of-sample 2018-01 → 2026-05.

7. Can you deploy more capital?

Finding

Since the system is capital-constrained, the question is whether a tweak can put more money to work while holding the edge. No tested lever raises out-of-sample risk-normalized CAR25 above the baseline. Selectivity is the source of the edge; loosening it admits the random-like fills from §5 that return near-zero CAR25.

Lever (out-of-sample)TradesWin rateExposureCAR25vs baseline
baseline (3% limit, 2-day, 20 slots)52864.8%11.8%+6.39%
limit 2%90861.5%16.6%+4.58%lower
limit 1%1,56760.1%25.0%−0.04%to zero
limit 0% (at close)2,32157.6%40.7%−0.17%to zero
1 day instead of 21,36361.7%22.9%+2.72%lower
30 slots54564.0%11.9%+4.26%lower
40 slots54464.2%12.0%+3.14%lower

Two patterns: looser entry multiplies the trade count while the marginal fills mean-revert less (win rate falls to ~58–62% and risk-normalized return falls toward zero); more slots keep the 64% win rate and dilute into weaker-ranked names. The baseline parameters sit at the risk-normalized efficient point. This is the ablation that measures how the edge responds to scaling the deployed capital.

8. Metrics by lookback

Trade-level and risk-adjusted metrics over trailing 12 / 24 / 36 months and the full period. Trade metrics are from the trade list; Sharpe and Calmar from the daily equity curve. 1R = the 3×ATR(14) risk box on the entry day (the Edge Lab Stage-2 risk unit); per-trade R is winsorized at ±10R. The R magnitudes are small because the system targets a one-week bounce, a fraction of a 3×ATR box.

WindowTradesWin rateAvg win (R)Avg loss (R)Expectancy (R)SharpeCalmar
Trailing 12m61.0%+0.29−0.38+0.030.741.01
Trailing 24m66.2%+0.35−0.41+0.091.022.12
Trailing 36m69.7%+0.36−0.41+0.131.262.28
Full (21y)1,09665.0%+0.34−0.43+0.070.640.30

9. Sizing out-of-sample

Finding

The position-sizing fraction is itself a fitted choice, so it gets its own out-of-sample test, separate from the ruleset pivot. Fitting the platform Bandy safe-f (the drawdown-constrained fraction, −20% target) on the pre-2018 trades and re-fitting on the post-2018 trades, the fraction pins at the leverage ceiling in both windows and the drawdown-95 stays well inside the −20% target. The finding: sizing is not the binding constraint — capital deployment is. The book is so rarely invested that even the ceiling fraction does not reach the drawdown limit, so the fitted size carries forward trivially.

Windowsafe-fper slot (of 20)CAR25DD-95 at safe-f
sizing in-sample (≤2017)3.0× (ceiling)15%+4.2%−11.6%
sizing out-of-sample (2018+)3.0× (ceiling)15%+6.6%−12.1%

safe-f is the portfolio-aware Bandy fraction on the per-trade return stream, sized as safe-f ÷ 20 per slot. It pins at the analytics ceiling because the deployed slice is small; the drawdown constraint is slack. The equity curve as tested is un-levered. CAR25 excludes cash interest.

10. Exposure & holding period

This is the system’s defining trait. It holds a position on only ~38% of trading days and deploys ~8% of capital on average; the rest sits in cash. Measured over time-in-market only, the deployed slice compounds at ~11%/yr — the raw 4.0% CAGR is the in-market rate diluted by the cash it holds, not a weak signal.

MetricFull (21y)In-sample (≤2017)Out-of-sample (2018+)Buy & hold
Time in market (days holding ≥1 position)37.8%22.0%62.5%100%
Average dollar deployment~7.7%100%
CAGR (raw, 0% on cash)4.02%3.13%5.43%10.88%
Exposure-adjusted return (in-market only)~11.0%~15.1%~8.8%= CAGR
Average holding period3.9 trading days (median 4)

Exposure-adjusted return credits the in-market rate only while capital is deployed and 0 in cash, isolating whether the in-market periods are productive from the cash drag. The buy-and-hold exposure-adjusted return equals its CAGR (always invested).

Recent trade blotter — most recent closed positions
SymbolEntryExitHold (td)Entry $Exit $Profit %Profit $Equity at exitExit reason
UPS2026-03-062026-03-125100.9597.89−3.0%−$694$227,256time
VTRS2026-03-062026-03-12513.8713.70−1.2%−$287$227,256time
BDX2026-03-062026-03-125163.80159.63−2.5%−$583$227,256time
COO2026-03-092026-03-13574.2569.92−5.8%−$173$227,192time
FCX2026-03-202026-03-23252.0154.94+5.6%$1,277$229,310target
XEL2026-03-202026-03-24377.1477.96+1.1%$240$230,010target
NEM2026-03-202026-03-25496.22101.52+5.5%$1,250$231,098target
BALL2026-03-202026-03-25457.2260.75+6.2%$1,401$231,098target
O2026-03-202026-03-26560.2359.75−0.8%−$183$231,176time
HII2026-03-302026-04-013370.34393.32+6.2%$1,425$232,601target
T2026-04-132026-04-16425.6726.40+2.9%$665$233,266target
LMT2026-04-222026-04-285554.79512.29−7.7%−$1,785$231,481time
PH2026-05-012026-05-064882.14902.66+2.3%$534$234,491target
MRNA2026-05-012026-05-06444.5648.79+9.5%$2,194$234,491target
APH2026-05-052026-05-115136.80122.47−10.5%−$2,422$231,787time
TFC2026-05-132026-05-15346.3646.96+1.3%$302$232,089eod_close

The most recent closed positions; full trade list (1,096 trades) is in the data artifacts below. Hold is in trading days; exit reasons are the bounce (target), the 5-day time stop (time), or the final bar (eod_close).

11. What this means for you

QuestionAnswer from 21 years of data
Does the signal separate from random?Yes — clears 100% of cash-matched random monkeys, in and out of sample.
Does it hold up out-of-sample?On the S&P 500 yes (profit factor 1.55 → 1.61, win rate flat). The small-cap cross-check is a pending next test.
Does it beat buying the index?Below the index on raw return; the deployed slice compounds at ~11%/yr at ~8% capital risked and ¼ the drawdown.
Can you scale it up?No tested lever that deploys more capital raises out-of-sample CAR25. Selectivity is the source of the edge.
What kind of tool is it?A low-beta, cash-heavy return stream with an out-of-sample edge on large caps — a portfolio sleeve that leaves the rest of the book free.

The measured fit is a low-correlation, capital-light sleeve: it earns on the small slice it risks and leaves the rest of the book free (for cash yield or other strategies), and the next step is combining this uncorrelated stream with other systems at the portfolio level. As a standalone return engine it is structurally under-deployed; on its own the deployed slice compounds at the rates shown above.

12. Costs, slippage & cash

Finding. Commissions are negligible; slippage is the cost that matters for this system; and the cash the book holds is a return the reader must supply. The fill model (§1) books a limit touch 3% below the close — the frictions below sit on top of that.

Commissions — modeled, negligible

We modeled Interactive Brokers Pro (tiered) US-stock pricing — $0.0035/share, a $0.35 order minimum, a 1%-of-trade cap, plus the SEC Section 31 fee and FINRA TAF on sells — applied to all 1,096 round trips at three account sizes. The drag is a fraction of the raw return:

AccountCommissions / yrDrag on full-book CAGRDrag on the deployed slice
$100,000~$80~8 bps/yr (4.02% → 3.94%)~1.0%/yr (~11.0% → ~10.0%)
$500,000~$370~7 bps/yr (4.02% → 3.95%)~0.9%/yr
$1,000,000~$740~7 bps/yr (4.02% → 3.95%)~0.9%/yr

Large-cap names at $50–900/share make IB’s per-share fee a fraction of a basis point per order; the $0.35 minimum only nicks the $100K book. We modelled IBKR Pro commissions; they lower CAGR by under ~10 bps/yr at every size — covered, and immaterial.

Slippage — the cost that matters

The book turns its deployed slice over roughly 65× a year (1,096 trades, ~3.9-day holds, ~8% average deployment), so a few basis points per fill compound into a real number on the capital actually at work. Slippage is also structurally adverse here: entries are limit-buys into selling exhaustion, and the dips cluster in dislocations (2008, 2011, 2020) where spreads widen 2–5×. A flat assumption understates the tail. The sensitivity, before any regime weighting:

Slippage / sideRound tripDrag on full-book CAGRDrag on the deployed slice (~11%)
0 bps0 bps4.02% (as tested)~11.0%
2.5 bps5 bps−26 bps (→ ~3.76%)−3.2 pp (→ ~7.8%)
5 bps10 bps−51 bps (→ ~3.51%)−6.4 pp (→ ~4.6%)
10 bps20 bps−103 bps (→ ~2.99%)−12.8 pp (deployed edge gone)

At 5 bps/side — an ordinary spread-cross on a liquid large cap — slippage costs the deployed slice ~6.4 pp/yr, more than half the ~11% it earns; at 10 bps/side the deployed edge is gone. Because the entries fire in dislocations, the realistic figure sits at the high end. The deployed-slice return must be read with a slippage assumption attached; a regime-conditional stress (slippage scaling with VIX or recent ATR) is the next test before that number is taken at face value.

Cash is a return you must add

The headline CAGR is computed at 0% on idle cash, and the book sits in cash roughly 90% of the time. We deliberately do not credit a historical cash yield — the rate varies by period and by how the reader manages the balance. For a complete picture you must add the true cash return on the ~90% idle balance at the rate you would actually earn over the period. That cash return is additive to the deployed-slice edge above and, at money-market rates, is the larger of the two components of total return.

13. Constraints

14. Code, data & artifacts

The data loader and the survivorship-bias-free dataset are internal to the research platform and not redistributed; the engine and analysis code below are complete.

Run Manifest.
run_date2026-06-06
data_as_of2026-05-15 (last bar)
test window2005-01-03 → 2026-05-15; ruleset OOS pivot 2025; robustness split 2018; sizing pivot 2018
universeSBF S&P 500 membership, resolved per trading date (~959 ever-members)
pricesEOD, split- & dividend-adjusted (ratio reconstruction from adjusted close)
engineprototype.py (NDX10 dip-buy); develop_eval.py (monkey + levers); run_oos.py (IS/OOS); car25_eval.py; refinements.py
rerun modeRe-fit — prices corrected to split-adjusted
sourceGlenn Osborne, HV-RSI specification (January 2025)

Code

Data (CSV)

Full report

Reproduce

# Head-to-head (split-adjusted)
python prototype.py --index SPY_SandP_500 --start 2005-01-01 --end 2026-05-15

# In-sample / out-of-sample split
python run_oos.py --index SPY_SandP_500

# Cash-matched monkey + capital-efficiency levers (40 seeds/window)
python develop_eval.py --monkey-seeds 40

# Risk-normalized CAR25 / safe-f + refinement artifacts
python car25_eval.py
python refinements.py