Skip to content
All strategies

Strategies

High-Volume Return Premium on Point-in-Time S&P 500 Stocks: every 20 sessions, go long the 15 members whose last-5-session share volume most exceeds their own prior 50-session norm and short the 15 with the deepest volume drought, excluding the formation-week return extremes, dollar-neutral, fixed 20-session hold (USEQ 1-DAY, long-short cross-section)

Outcome: Verifying

Sp500HighVolumeReturnPremiumLS

High-Volume Return Premium on Point-in-Time S&P 500 Stocks: every 20 sessions, go long the 15 members whose last-5-session share volume most exceeds their own prior 50-session norm and short the 15 with the deepest…

Hypothesis

Original Research Lead hypothesis built on the published 'high-volume return premium' (Gervais, Kaniel and Mingelgrin 2001, Journal of Finance 56(3): stocks whose trading volume over a day or week is unusually high relative to their own recent history earn higher returns over the following ~20 trading days, and unusually low-volume stocks earn lower returns; confirmed across 41 countries by Kaniel, Ozoguz and Starks 2012, JFE). The mechanism is the visibility/attention effect (Miller 1977, Merton 1987): a volume……Show moreShow less

Original Research Lead hypothesis built on the published 'high-volume return premium' (Gervais, Kaniel and Mingelgrin 2001, Journal of Finance 56(3): stocks whose trading volume over a day or week is unusually high relative to their own recent history earn higher returns over the following ~20 trading days, and unusually low-volume stocks earn lower returns; confirmed across 41 countries by Kaniel, Ozoguz and Starks 2012, JFE). The mechanism is the visibility/attention effect (Miller 1977, Merton 1987): a volume shock makes a stock visible to more investors, enlarging its investor base and demand, while a quiet stock drifts out of view. The effect is about VOLUME, not the price move, so the design neutralises the price move by excluding the formation-week return extremes. This is a mechanism the factory has never tested on equities: the only prior 'high-volume return premium' run was a single-asset ETH spot timing rule. It is also not one of the USEQ families that keep dying here (price reversal, OPEX/TOM calendars, cross-asset lead-lag, ETF pairs). UNIVERSE (point in time, survivorship-aware): at each rebalance, the S&P 500 members AS OF THAT DATE (FactoryStrategy.universe_at()/index_member() over sp500_membership.parquet, former members included where bars exist; candidates via `python -m src.data.listings sp500 --start 2006-01-01 --end <run end> --with-data`), that have at least 60 completed sessions of 1-DAY bars and a last close >= $5. SPY.USEQ is the primary bar clock (it sets the rebalance calendar) and is NEVER traded. Residual bias, stated honestly: Yahoo has no bars for some acquired/bankrupt former members, and those names are absent from the cross-section. Backtest window starts 2006-01-01 to keep the bar load tractable (~5,200 sessions x ~650 names). Execution: decisions are taken on the SPY session close and fill at the NEXT session's open on USEQ (next_open_fill, supported). No stops are needed for the risk route (see exit_logic); there are no intrabar or exchange-resting stop requirements. COST ARITHMETIC: USEQ round trip is ~0.02-0.05% (spread + impact, zero commission). GKM report a high-minus-low volume spread of roughly 0.5-1.0% over 20 days in their sample, smaller for large caps and probably smaller after 2006. I predict a 0.5% leg spread per 20-session period. That gives about +0.25% per trade averaged over long and short legs, versus at most 0.05% round-trip cost, so 5x the cost. Turnover is near 100% of each side per rebalance (volume shocks do not persist), so cost per period is about 2 x 0.04% = 0.08% of gross against an expected 0.25% book return per period. PRE-REGISTERED EVIDENCE COUNT (lesson L238: trades on the same date are not independent): about 260 distinct rebalance periods over 2006-2026 (about 210 in development, about 50 in the holdout), each with 30 legs. The unit of evidence is the period, not the ~7,800 leg trades. PRE-REGISTERED COMPARATOR (lesson L217): the incremental claim is that the volume rank adds expectancy over a random long/short pick from the same return-filtered PIT pool. That comparator's expected period return is ~0. The analyst should read the per-period book return and its HAC t-statistic, not the leg count. Separately reported: the long-leg and short-leg mean 20-session market-adjusted returns. Lesson L230 warns that the two sides of an effect can differ, and the literature finds the high-volume (long) side the stronger.

Corpus balance: USEQ is at 9.8% of experiments, under the ~15% share cap. This adds a long-short (24% of corpus) market-neutral design and a mechanism (volume-shock attention premium) that the factory has never run on equities. Within crypto the down-shock/NR7 absorption family is now heavily replicated, and a new mechanism adds more diversity than another transfer of it. I first considered a Connors-style VIX-stretch SPY dip-buy. I rejected it after a fixed-rule check on SPX/VIX (1993-2026): once VIX's one-day publication lag is respected (US_VIXCLS appears the day after), the VIX trigger averaged 0.28%/trade versus 0.58% for a plain RSI(2)<10 price dip. It added no incremental expectancy (lesson L217) and would have duplicated the promoted Double-7 family.

Implementation

Dollar-neutral high-volume return premium on point-in-time S&P 500 members, using USEQ daily bars. SPY.USEQ is the session clock only and is never traded. Decision sessions are those whose trading-day ordinal (counted on the platform exchange calendar from a fixed anchor date, so the schedule is restart-safe) is a multiple of hold_sessions (20). On a decision session the pool is the names in universe_at(index='sp500') that have a bar at that close, at least max(60, formation+baseline+1) daily bars, and a close >=……Show moreShow less

Dollar-neutral high-volume return premium on point-in-time S&P 500 members, using USEQ daily bars. SPY.USEQ is the session clock only and is never traded. Decision sessions are those whose trading-day ordinal (counted on the platform exchange calendar from a fixed anchor date, so the schedule is restart-safe) is a multiple of hold_sessions (20). On a decision session the pool is the names in universe_at(index='sp500') that have a bar at that close, at least max(60, formation+baseline+1) daily bars, and a close >= $5. Volume score = log(mean volume over the last formation_sessions (5) / mean volume over the baseline_sessions (50) sessions before that). The pool is sorted by formation-window return and floor(return_exclusion_frac/2 x n) names are dropped from each tail, so 20% in total by default. The survivors are ranked by volume score: long the top n and short the bottom n, n = min(n_per_side=15, pool/2), with no book if n < min_names_per_side (5). Execution: on the decision close every held leg is closed (fills at the next session's open). On the following close the new book is opened, equal-weighted with half the gross on each side; fills come at the session after that. Each leg is its own position held for one period and closed at the next decision session. Delistings are closed by the platform, and index leavers are dropped because the whole book turns over each period.

Implements the hypothesis's 20-session high-minus-low volume-shock book on the point-in-time S&P 500. The candidates are the 670 S&P 500 members (2006-01-01 to now, former members included) that have daily bars, from `python -m src.data.listings sp500 --with-data`, with point_in_time_universe=True; ranking uses only universe_at(index='sp500') at each decision. An extra-leg bar is used only when its timestamp equals the SPY close being processed. Three deviations, all forced by execution: (1) Initial margin at the……Show moreShow less

Implements the hypothesis's 20-session high-minus-low volume-shock book on the point-in-time S&P 500. The candidates are the 670 S&P 500 members (2006-01-01 to now, former members included) that have daily bars, from `python -m src.data.listings sp500 --with-data`, with point_in_time_universe=True; ranking uses only universe_at(index='sp500') at each decision. An extra-leg bar is used only when its timestamp equals the SPY close being processed. Three deviations, all forced by execution: (1) Initial margin at the fixed 1x is checked at submission and still counts legs whose exit is in flight. A same-close close-and-reopen of a fully turning-over book would therefore have its entries capped to near zero. So exits are sent on decision close R (fill at R+1 open) and the new book, selected at R, is sent on R+1's close (fill at R+2 open). This adds a one-session gap between formation and entry. Each leg is held hold_sessions-1 sessions. (2) Deployed gross is min(gross_exposure, margin_headroom x leverage) = 0.8 of equity, not 1.0. A dollar-neutral book's gross notional grows with the market during the hold while its equity does not, and peak margin above 1.02x is a hard gate (the prior USEQ dollar-neutral run hit 1.03 at 1x). (3) Names held through a period are closed and re-opened rather than resized, so every leg is its own ledger trade, as the fixed-hold, leg-level evidence count needs. 'Formation-week return extremes' is read as return_exclusion_frac in total, split evenly between the two tails. backtest_start (2006-01-01) is applied as 'no decisions before that date'; it does not affect paper or live. Expected ledger: about 260 periods x 30 legs, or about 7,800 leg trades. Risk route: a signal/time exit with capped sizing (each leg is about 2.7% of equity).

Backtest and paper results are hypothetical. Trading involves risk of loss.