Skip to content

View original

SectorDispersionGatedCrossSectionalMomentumLS

Hypotheses

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

Hypotheses

A dollar-neutral, MULTI-INSTRUMENT, cross-sectional relative-strength momentum rotation across the 9 long-history US SPDR sector ETFs (XLK, XLF, XLE, XLV, XLI, XLY, XLP, XLU, XLB) on DAILY bars, rebalanced monthly. This is a deliberate MECHANISM and ASSET-CLASS pivot away from the flagged idea and its dead siblings: it is NOT single-instrument crypto directional trend, NOT a Kaufman Efficiency-Ratio / trend-quality gate, NOT EMA-cross or Donchian breakout, NOT funding/OI/liquidation gated, NOT sub-hourly, and NOT on a perp at all. The engine is the classic equity cross-sectional momentum premium (Moskowitz/Grinblatt/Asness): rank the sectors by their trailing 6-month total return (126 daily bars, skipping the most recent 10 to sidestep short-term reversal), go long the top-K and short the bottom-K equal-weighted so the book is ~dollar-neutral. The novel, non-textbook edge that distinguishes this from the equity anomalies that already died on USEQ (sector-ETF short-horizon REVERSION, dual-TF trend confluence, staples cointegration pairs, calendar seasonality, vol-regime switching — all abandoned per the lessons) is a CROSS-SECTIONAL DISPERSION gate: a momentum rotation only has spread to harvest when the sectors are actually differentiating from each other. When the cross-sectional standard deviation of the formation-window returns is in a low percentile (sectors moving together, macro beta dominating), the strategy holds NO position — that is the fee/edge-defense mechanism, the cross-sectional analogue of 'only trade when there is edge', applied to a different asset class than the flagged idea. US equities are chosen because (a) the USEQ venue is essentially unmined in the corpus, (b) daily sector-ETF history runs to 1998 giving DECADES of robustly-backtestable data (the single most backtestable regime in the whole factory), (c) shorts are allowed on the 2x Reg-T margin account so the book is genuinely dollar-neutral, and (d) commissions are ~0 so a low-turnover monthly rebalance carries negligible fee drag — escaping the crypto fee graveyard that killed the flagged family.

Hypotheses

Iteration 3, fixing the backtest gate's 'metrics unreliable: Sharpe 0.07 disagrees in sign with total_return -43.90%'. I pulled the stored report for the previous run: 27.7 years (6,967 data days), 514 trades, dense MTM Sharpe +0.069 (positive mean daily return) but a -43.90% equity curve with 54.0% max drawdown. A positive-mean series that compounds to -44% is the volatility-drag signature (geometric = mu - sigma^2/2), i.e. an over-levered near-zero-mean book, not a directional loss — implied annualised vol ~20% on what should be a ~10% dollar-neutral sector book. The smallest change that removes the incoherence is therefore to cut SCALE, which shrinks the sigma^2/2 drag quadratically while shrinking the mean only linearly: leverage 2.0 -> 1.0 and gross_exposure 0.75 -> 0.60, taking gross from 1.50x to 0.60x (drag falls ~6x, so the compounded curve now carries the sign of the Sharpe reported beside it, and max drawdown falls with it). This is the 'cap gross notional independently of the equity path' discipline from the sizing-blowup lessons. Second change, same spirit and one line: disp_pct_gate 0.30 -> 0.60. At 0.30 the gate let the book trade ~70% of months, so the hypothesis's ACTUAL novel claim — that sector momentum only has spread to harvest when sectors differentiate — was never tested; the run was a plain sector rotation wearing a gate, and it delivered the textbook weak result. At 0.60 only the top-40% dispersion regime trades. Nothing else changed: the synchronised single-buffer alignment, the calendar-anchored month key, the equal-dollar neutral construction, the netting delta orders and the continuous rank-minus-gate signal all passed Layers 1-3 and are untouched, and sizing still reads self.config.leverage directly (the iteration-2 leverage_set_but_unused fix). Honest caveat, since the Analyst will weigh it: the previous run's per-trade edge was NEGATIVE (avg_trade_return_pct -0.578%, profit factor 0.878, 16 losing years of 27), so this iteration is the one fair test of the dispersion gate — if the next backtest is still gross-negative with the gate binding, the hypothesis is falsified on the cleanest multi-decade dataset in the factory and the strategy should be abandoned rather than iterated again.

Hypotheses

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).

Verification Results

`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.

Verification Results

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

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.

Backtest Review

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.

Backtest Review

The dispersion gate now actually binds (disp_pct_gate 0.60), so the hypothesis's central claim was fairly tested.

Backtest Review

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.

Backtest Review

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.

Backtest Review

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.

Backtest Review

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.

Outcome Summary

SectorDispersionGatedCrossSectionalM-d3f0f0bca7

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.

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.

Outcome Summary

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.

Outcome Summary

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.

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.
Strategy report

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