Strategies
SPY Weekly-Step Majority-vs-Minority Scheme Selector: Follow or Fade the Last 5-Session Move, Whichever Earned More Over a Trailing 26-Step Memory, Flat When Neither Is Positive (SPY.USEQ 1-DAY, Long-Short)
Outcome: Abandoned
SpyWeeklyMajorityMinorityWealthSelector
Outcome Summary
SpyWeeklyMajorityMinorityWealthSelector tested an agent-based-model claim: on SPY, choosing weekly between trend-following and trend-fading by their trailing realised scores could earn money. After 5 iterations, the full-history backtest (1993-2023, 810 trades) returned just +1.49% with profit factor 1.004 and a Sharpe CI that straddled zero, and any gains were confined to high-volatility periods. The analyst abandoned it at backtest review as no_edge (premise_falsified), so optimization, analysis and risk review were never reached. The analyst also flagged recurring paired large daily MTM swings for engine review as a possible impact/MTM folding artifact (unverified), but noted it did not change the verdict.
Hypothesis
Implementation
Wealth-game selector on SPY.USEQ daily bars using calendar-anchored 5-session (weekly) steps. Each week it scores two strategies over the last 26 steps: majority (follow the sign of the last weekly return) and minority (fade it), net of a flip cost. It holds the higher-scoring side if that score is > 0 and stays flat otherwise. Long/short, whole shares, 50% of equity per position.
Verification Results
Treat this backtest as the final measurement of the mechanism. Do not submit further parameter-only iterations.
Iteration 5 differs from iteration 4 only in the equity_fraction default and config value (0.95 -> 0.50). should_enter, should_exit, the scoring and the holding schedule are unchanged. Per L132, a pure constant retune on a late iteration usually burns budget. It is not a correctness defect, and the delta targets a gate coherence flag rather than the signal.
None required. If exact 5-session steps are wanted, count sessions from a fixed anchor date.
Steps are calendar weeks (Monday-anchored week_id, sampling the close of the first session of each week), not exactly 5 sessions. Holiday weeks produce 4-session steps and a missing Monday shifts the sample to Tuesday. This is a faithful and calendar-anchored reading of '5-session step' (check 20 is satisfied) but not an exact one. The order-2 variant the hypothesis pre-registers is not implemented here; it is described as scored separately, so this is acceptable.
Optional: document the implicit weekly-hold risk. No code change needed.
There is no stop-loss, and the position is held for a full week at 50% of equity, unlevered. Worst-case gross is 0.5x equity (leverage 1.0, no dynamic scalar), which is well under the USEQ 2x cap. Tail risk is one adverse SPY week on half the book. That is acceptable, but the hypothesis states no stop either way. Shorts on SPY are liquid, so borrow realism is fine.
The sandbox shows 149 trades at PF 0.914, Sharpe -0.04, avg_trade -0.038% of notional, beta 0.03, with the loss concentrated in the normal-vol tercile (-16.9%). PF near 1.0 is what an edgeless strategy looks like; it is not a polarity problem. The developer's own cost-free replay over 1993-2026 gives a weekly Sharpe of about 0.20, a flat share of about 10% (the hypothesis predicted 25-35%) and unstable annual signs, and the developer recommends abandoning. The follow-vs-fade selector on weekly SPY steps looks like near-zero edge. Iteration 5 changes only equity_fraction (0.95 -> 0.50). That is a pure resize and cannot create edge (L132). The full backtest should be treated as the final measurement: if it shows PF about 1.0 over roughly 1,700 weeks, abandon rather than retune. The Sharpe/return coherence issue the developer attributes to the runner folding impact twice into the sampled MTM points is unverified here and should go to engine review.
Backtest Review
- Sharpe
- 0.25
- Total return
- 1.49%
- Max drawdown
- 32.57%
- Trades
- 810
- Win rate
- 54.0%
- Profit factor
- 1.00
The mechanism runs as specified: 810 round trips over 1993-2023, 400 long and 410 short, a weekly schedule, and 78.5% exposure. That is consistent with a flat share of about 20%.
It is not beta: beta is -0.015 and correlation is -0.03.
PF is 1.004 on 810 trades over 30 years. This is the zero-edge result described in L120: a tight estimate that sits at zero.
Total return is +1.49% over 30 years. CAGR is shown as 5.36%, which contradicts that total.
Sharpe is 0.25 with a bootstrap CI of -0.11 to 0.60, which straddles zero. PSR is 0.886.
avg_trade_return_pct is 0.058%, against a USEQ floor of 0.05% and a preferred 0.10%. That is barely above cost. Modeled impact is 90.7% of gross.
Max drawdown is 32.6%, the recovery factor is 0.05, and the longest drawdown lasts 7,014 days. Only about 16 of 31 years were profitable.
Profitability splits by regime: calm -25.8%, normal -12.8%, stressed +32.1%. Any edge is confined to high-vol periods and is not persistent.
Possible engine artifact, not verified: from 2004 on there are recurring paired daily moves of about -10% to -17% followed by +12% to +19% (for example 2019-09-24 and 2019-09-25). The final bar, 2023-12-29, is -15.9%, and the book has been flat since mid-December. The developer's note about impact being double-folded into the sampled MTM points should go to engine review. It does not change the verdict, because the trade ledger (PF 1.004) is independent of it.
Analysis
Backtest gate: - metrics unreliable: Incoherent: Sharpe 0.77 disagrees in sign with total_return -15.65% — 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
sandbox_timeout: Verification failed (Layer 3 — sandbox backtest): smoke test exceeded the 300s wall-clock limit on a ~20000-bar window (2400 days of SPY.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
A majority/minority (follow vs. fade) selector on a single index at a 5-session step shows no edge on 30 years of SPY, so single-index variants with a different memory length or step size should not be re-proposed, and resizing positions cannot create an edge.
At backtest review, after iteration 5 (which only changed equity_fraction from 0.95 to 0.50), the analyst abandoned it before optimization with code no_edge (premise_falsified): PF was about 1.0 over roughly 1,600 weekly steps. All profit came from the stressed-vol tercile (+32%); the calm (-26%) and normal (-13%) terciles lost money.
A 'wealth-game' selector on SPY daily bars (from Baek et al., arXiv:1002.4744) that each 5-session step chose between following and fading the last step's move, picking whichever had the higher trailing 26-step score, and stayed flat when neither score was positive.
Over 1993-2023 it made 810 round trips (400 long, 410 short) with a total return of +1.49%, profit factor 1.004, and Sharpe 0.25 (bootstrap CI -0.11 to 0.60). Average trade return was 0.058% against the 0.05% USEQ floor, impact took 90.7% of gross, and max drawdown was 32.6% and never recovered in 7,014 days.
Analysis
Market behavior and performance of different strategy evaluation schemes
Backtest and paper results are hypothetical. Trading involves risk of loss.