Skip to content
All strategies

Strategies

Stock-vs-Own-Sector-ETF Residual Shock Reversal: fade a >=2.5-sigma 5-session idiosyncratic move in 20 US large caps against their SPDR sector ETF, beta-hedged long-short, fixed 10-session hold (USEQ 1-DAY)

Outcome: Abandoned

StockSectorEtfResidualShockReversal

Outcome Summary

The hypothesis proposed a beta-hedged, sector-relative residual reversal on 20 US large caps across four SPDR sector ETFs, and its own pre-study reported a modest positive edge per event. The developer built an O(1) rolling-statistics implementation and revised it over 3 iterations. Iteration 3 was meant to set the config to the plan's fixed 2.0 leverage, but verification still failed the Layer 1.5 hypothesis/config consistency check on that leverage requirement. The run was abandoned as a verification loop, so backtesting, optimization, analyst and risk stages were never reached.

Hypothesis

Multi-instrument, long-short, beta-hedged event strategy on USEQ 1-DAY bars, pure OHLCV. The sector ETFs have daily history from 1998 and the stocks from earlier. Universe: 4 SPDR sector ETFs, each with 5 of its largest members: XLE {XOM, CVX, COP, EOG, SLB}, XLF {JPM, BAC, WFC, C, GS}, XLU {NEE, DUK, SO, D, AEP}, XLP {PG, KO, PEP, WMT, COST}. For each stock, the daily residual is e_t = r_stock - beta*r_etf, with beta from a rolling 120-session regression using data up to the prior session. The signal is z =……Show moreShow less

Multi-instrument, long-short, beta-hedged event strategy on USEQ 1-DAY bars, pure OHLCV. The sector ETFs have daily history from 1998 and the stocks from earlier. Universe: 4 SPDR sector ETFs, each with 5 of its largest members: XLE {XOM, CVX, COP, EOG, SLB}, XLF {JPM, BAC, WFC, C, GS}, XLU {NEE, DUK, SO, D, AEP}, XLP {PG, KO, PEP, WMT, COST}. For each stock, the daily residual is e_t = r_stock - beta*r_etf, with beta from a rolling 120-session regression using data up to the prior session. The signal is z = sum(e, 5) / (sd(e,120) lagged 5 sessions * sqrt(5)). When |z| >= 2.5, take the opposite side of the stock, hedge with beta times the stock notional in its sector ETF, and hold 10 sessions. Mechanism: a liquidity-provision premium for absorbing stock-specific 1-week price pressure (fund flows, block trades, overreaction to news). This is the residual short-term reversal documented by Lehmann 1990, Lo-MacKinlay 1990 and Da-Liu-Schaumburg 2014. It is measured against the stock's own sector, because sector moves trend while within-sector residuals revert. Zero USEQ commissions make a ~0.3% per-event edge viable. PRE-STUDY on the in-repo catalog, 2008-2026, these exact 20 names and rule, at most one open event per name: 911 events (~49/yr). Mean 10-session residual capture +0.33% of stock notional, median +0.22%, hit rate 54.3%, per-event standard deviation 3.6%, t about 2.75. 13 of 19 years are positive; since 2020 the mean is +0.39% on 356 events. All 4 sectors are positive (XLF +0.64%, XLU +0.35%, XLP +0.20%, XLE +0.15%). In a broader 41-name check, fading up-moves (+0.34%) and fading down-moves (+0.33%) earned about the same. That check had 1865 events with a mean of +0.33%. XLE was kept despite being the weakest, to avoid choosing names on in-sample results. Why this slot: USEQ is 5.4% of the corpus, long-short is 16%, and Binance/BTC is over-concentrated. The trigger is a price observation, not a calendar date (L179). It is not a crypto perp trade gated on funding or open interest (L111). Unlike the abandoned dual-class OU spread and the in-pipeline duopoly pairs, there is no cointegration fit: the hedge is the stock's own sector ETF, and a high threshold selects only large residual moves. IMPLEMENTATION NOTE: two earlier USEQ multi-name runs hit the 300-second sandbox timeout, so every statistic must update in O(1) per bar. Keep a fixed-length buffer of residuals per name, running sums of x, y, x^2 and xy for the 120-session beta, a running 5-session residual sum, and a running sum and sum of squares for the 120-session standard deviation. Never rebuild lists, call pandas or rescan history inside on_bar or on_extra_bar. Process each date only after all 24 bars for it have arrived.

verification_loop: Verification failed (Layer 1.5 — hypothesis/config consistency) [class=hypothesis_mismatch]: - optimization_plan fixes leverage at 2.0

Implementation

Fades large stock-versus-sector residual shocks across 20 US large caps, with beta-weighted sector ETF hedges, up to eight simultaneous events, a baseline 10-session hold and residual-risk stops.

Addresses the reported Layer 1.5 failure by setting config.leverage to the research plan's fixed 2.0. Existing equity-relative pair sizing already multiplies by self.config.leverage, so this correction supplies the intended exposure. Executable strategy logic is preserved; only the source docstring documents the correction. All 24 specified instruments remain configured, including the four XLP members omitted from market_context.instruments but explicitly required by the hypothesis description. No verification was run. The requested outbox file could not be written because this session's filesystem permissions are read-only; the complete task-bound JSON is returned directly.

Verification Results

Verification failed (Layer 1.5 — hypothesis/config consistency) [class=hypothesis_mismatch]: - optimization_plan fixes leverage at 2.0

Iteration History

sandbox_timeout: Verification failed (Layer 3 — sandbox backtest): smoke test exceeded the 300s wall-clock limit on a ~20000-bar window (2400 days of XLF.USEQ-1-DAY-LAST-EXTERNAL). This almost always means per-bar work that scales with history — e.g. rescanning the full funding/supplementary series, or rebuilding a list and calling min()/sorted() inside calculate_signal()/on_bar() on every bar. Precompute sorted timestamp arrays ONCE in __init__ and use bisect, or cache lookups keyed by timestamp, so per-bar cost is O(log n) not O(n).

Outcome Summary

Check that the strategy's output config (especially leverage) exactly matches the hypothesis's optimization_plan before resubmitting, because a repeated Layer 1.5 mismatch ends the run before any backtest evidence is produced.

After 3 iterations the run was abandoned in a verification loop at Layer 1.5 (hypothesis/config consistency, class hypothesis_mismatch), with the message 'optimization_plan fixes leverage at 2.0'. The strategy never reached backtesting, analyst review or risk review.

Fade a >=2.5-sigma 5-session idiosyncratic residual move in 20 US large caps against their own SPDR sector ETF (XLE, XLF, XLU, XLP), beta-hedged long-short and held for a fixed 10 sessions on USEQ daily bars, harvesting a short-term residual-reversal liquidity premium.

No pipeline backtest or optimization results exist (the backtest report is empty and there is no optimization report). The only figures are from the hypothesis's own pre-study, not a pipeline backtest: 911 events from 2008 to 2026, mean +0.33% per event, hit rate 54.3%, t about 2.75.

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