Strategies
Dispersion-Gated Cross-Sectional Sector Momentum, Dollar-Neutral Long/Short (US Equity SPDR Sector ETFs, Daily Bars, Monthly Rebalance) — Rotate Into 6-Month Leader Sectors / Short Laggards ONLY When Cross-Sectional Return Dispersion Is High Enough to Exploit; Sit Flat When Sectors Move Together
Outcome: Abandoned
SectorDispersionGatedCrossSectionalMomentumLS
Outcome Summary
A dispersion gate that binds cannot rescue a cross-sectional sector-momentum signal whose per-trade edge is below zero before costs; test the core premise on the cleanest available data before adding gating machinery.
Hypothesis
Negative expectancy on a decisive 376-trade / 27-year sample: avg_trade_return_pct -0.59% (below zero, far under the USEQ fee floor), profit_factor 0.873 (<1), total_return -13.67%, Sharpe -0.067, Sortino -0.064, expectancy -$48/trade. USEQ commissions are $0 and impact is 0.0% of gross, so this is gross-negative signal, not fee-fragility — the cross-sectional-dispersion sector-momentum premise is FALSIFIED on the cleanest multi-decade dataset in the factory. The dispersion gate now binds (disp_pct_gate 0.60) yet the book still loses in ~16 of 24 years and in both the calm (-12.6%) and stressed (-8.6%) vol terciles — exactly where differentiated sectors should provide the most spread. This is the fair test the developer and QA pre-registered, and it failed; the developer's own committed abandon condition (gross-negative with the gate binding) is met. Optimization cannot lift an edge that is below ZERO before costs, so 2 hours of compute would only curve-fit noise. abandon_class=negative_expectancy (premise_falsified).
Implementation
Dollar-neutral cross-sectional momentum rotation across the 9 long-history US SPDR sector ETFs (XLK, XLF, XLE, XLV, XLI, XLY, XLP, XLU, XLB) on USEQ daily bars, rebalanced on the first session of each calendar month. Each sector's formation return is its 126-session return ending 10 sessions ago (skip-a-window, to avoid short-term reversal). The cross-sectional standard deviation of those 9 formation returns is percentile-ranked against its own trailing 252-session history; if that rank is below disp_pct_gate (0.60) the sectors are moving together and the book goes FLAT for the month. Otherwise it goes long the top 3 and short the bottom 3, equal DOLLAR weighted so both legs carry identical notional (structurally dollar-neutral). Gross exposure is a deliberately low 0.60x of equity (0.30x long + 0.30x short), leverage 1.0. Rebalancing is executed as whole-share netting delta orders per leg, so an unchanged leader keeps its position and turnover stays low.
Verification Results
Verify the base honors the overridden min_bars_required; otherwise rename to a non-shadowing helper and gate explicitly (which the code already does).
`min_bars_required(self)` overrides a base framework method; static analysis flags that the base may rely on its own implementation for warmup gating. The strategy also enforces its own warmup internally (returns 0.0 / proxy until formation+skip history and min_disp_obs are met), so behavior is safe, but confirm the override actually takes effect rather than being silently ignored by the base.
Sandbox (~4.5yr window) is negative: total_return -6.29%, avg_trade_return_pct -1.10%, Sharpe -0.39, PF 0.63, and losses grow monotonically across vol terciles (calm -0.75% / normal -1.57% / stressed -4.23%). Developer's own honest caveat reports the prior full 27-year run was gross-negative (avg_trade_return_pct -0.578%, PF 0.878, 16 losing years of 27) with the dispersion gate barely binding. This iteration (gross cut to 0.60x, disp_pct_gate 0.30->0.60) is the first fair test of the gate's central claim on the cleanest multi-decade dataset in the factory. If the full backtest with the gate now binding is still gross-negative, the cross-sectional-dispersion premise is falsified on decades of data and the run should be abandoned rather than iterated. USEQ round-trip is only spread+impact (~0.02-0.05%) so this is an edge question, not a fee-fragility question. Advisory only — analyst decides on full-history numbers.
Backtest Review
- Sharpe
- -0.07
- Total return
- -13.67%
- Max drawdown
- 19.56%
- Trades
- 376
- Win rate
- 43.4%
- Profit factor
- 0.87
Genuine mechanism/asset-class pivot away from the dead crypto directional families; correct dollar-neutral L/S construction with skip-window formation and a cross-sectional dispersion gate.
Cleanest possible test bed: 6968 daily bars / ~27 years of 9 SPDR sector ETFs on the near-frictionless USEQ venue, 376 trades — a decisive, reliable sample. Commission is $0, impact only $1367 (0.0% of gross), so this is purely an edge question.
The dispersion gate now actually binds (disp_pct_gate 0.60), so the hypothesis's central claim was fairly tested.
Negative expectancy on a decisive sample: avg_trade_return_pct -0.59% (below ZERO, far under the USEQ ~0.05% floor), profit_factor 0.873 (<1), total_return -13.67%, Sharpe -0.067, Sortino -0.064, expectancy -$48/trade.
Gross-negative signal, not fee-fragility (fees ~0 on USEQ), so the cross-sectional-dispersion momentum premise is falsified on decades of the most backtestable dataset in the factory.
Losing in the majority of calendar years (roughly 16 of 24) and negative in both the calm (-12.6%) and stressed (-8.6%) vol terciles; the gate did not rescue it. Confirms QA's pre-registered edge concern.
This is iteration 3; prior full 27-year run was also gross-negative — the developer's own pre-committed abandon condition (gross-negative with the gate binding) is met.
Analysis
Backtest gate: - metrics unreliable: Incoherent: Sharpe 0.07 disagrees in sign with total_return -43.90% — the Sharpe is computed from the mtm_equity_curve series while the return comes from the equity curve. Judge on the equity curve.
Iteration History
Verification failed (leverage_set_but_unused): config sets leverage=2.0 but the strategy never references leverage in sizing. Size positions on it — notional = equity * fraction * leverage / price (read self.config.leverage) — or set leverage=1.0. As written the leverage is inert and the backtest is identical to 1x.
Outcome Summary
The analyst issued an 'abandon' verdict at the pre-optimization backtest review: with USEQ commissions at $0 and impact only 0.0% of gross, the negative expectancy is gross-negative signal (premise falsified), not fee-fragility, so optimization was not run and later stages were not reached.
A dollar-neutral, cross-sectional 6-month momentum rotation across the 9 US SPDR sector ETFs (monthly rebalance, long top-K / short bottom-K), gated to trade only when cross-sectional return dispersion was high enough to offer harvestable spread.
Over a decisive 27-year, 6968-bar / 376-trade backtest it returned -13.67% total (CAGR -57.46%) with Sharpe -0.067, Sortino -0.064, profit factor 0.873, win rate 43.4%, and avg_trade_return_pct of -0.59%. It lost money in roughly 16 of 24 years and in both the calm (-12.6%) and stressed (-8.6%) volatility terciles.
Backtest and paper results are hypothetical. Trading involves risk of loss.