Strategies
SPY Dual-Timeframe Trend Confluence — Long-Short, Single-Instrument: Take a Directional Position ONLY When WEEKLY and DAILY Trend Agree, Flat on Disagreement, ATR-Trailed Winners (SPY.USEQ, Daily+Weekly Bars, 3-Parameter)
Outcome: Abandoned
SpyDualTimeframeTrendConfluenceLS
Outcome Summary
SpyDualTimeframeTrendConfluenceLS deliberately reused the factory's one validated directional recipe — fast and slow trends must agree, flat on disagreement, ATR-trailed winners — and ported it to SPY on daily bars plus a derived weekly confirm, betting that the well-documented equity-index TSMOM premium would carry it. The 33-year backtest was clean and well-measured (8,452 bars, 442 trades, near-zero beta) but decisively negative: -9.61% total return, profit factor 0.934, essentially zero Sharpe, and a negative per-trade expectancy below even the commission-free USEQ floor. The analyst abandoned it at the backtest-review gate, noting the dual-timeframe momentum-confluence class has 0/213 survival and that 3 tunable parameters would only curve-fit noise and die at holdout. It never reached optimization or any later stage.
Hypothesis
ohlcv_trend_confluence_negative_expectancy: SPY dual-timeframe trend confluence is a net loser over a well-measured 442-trade / 33-year sample — total_return -9.61%, profit_factor 0.934 (<1.0), avg_trade_return_pct -0.092% (negative, below the USEQ floor), expectancy -$25.89/trade, Sharpe 0.052 with CI straddling zero. This is the OHLCV dual-timeframe momentum-confluence template (0/213 survival, L9/L41/L62); the equity-index TSMOM premium does not survive the discrete entry/exit rules here, and per L8/L9 negative total_return with PF<1.0 is disqualifying. Only 3 tunable parameters cannot turn a negative-expectancy mechanism positive — the ~225-trial optimization would curve-fit noise and die at holdout, not reach the promotion floor. Not worth the 2-hour run.
Implementation
Long-short, single-instrument dual-timeframe trend confluence on SPY.USEQ daily bars (history from 1993). A FAST daily trend read -- the ATR-normalised spread between a 10-day and a ~30-day EMA -- must AGREE in sign with a SLOW weekly read (the multi-week return measured against the close of the calendar week that ended `weekly_lookback` completed weeks ago) before any position is taken: agree-up = long, agree-down = short, disagreement = flat. Winners are trailed out with an ATR stop (close when price gives back trail_atr_mult x the entry ATR from the best close since entry); positions are also cut when the weekly trend flips against them or the daily spread flips. Sizing is risk-first in WHOLE SHARES: shares are set so the trailing-stop distance risks ~1.2% of equity, hard-capped at 60% of equity notional at leverage 1.0. Three free parameters (ema_ratio, weekly_lookback, trail_atr_mult), all clamps declared in _param_bounds.
Verification Results
Optionally defer setting self._side/self._extreme/self._entry_atr until the entry is actually submitted, or reset to 0/None when returning None.
should_enter() sets self._side / self._extreme / self._entry_atr BEFORE the base template's size>0 and min_notional checks (base_template lines 392-408). If an entry is dropped for zero-size or sub-min-notional, self._side is left non-zero while the strategy is still flat, and calculate_signal() will keep updating self._extreme. BENIGN: while flat the base template only calls should_enter() (never should_exit()), and a real entry always resets self._side/self._extreme/self._entry_atr, so no wrong exit or mis-trail can occur. At SPY prices the risk-first size is tens of shares (far above the $5 floor), so the drop path is not expected to fire. Cleanliness only.
No code change required; let walk-forward/holdout judge on full history.
Sandbox headline metrics (Sharpe 0.31, CI [-1.55, 2.32], 7 trades) are weak/wide. These are PERFORMANCE concerns for the analyst/backtest-review stage, not correctness defects: per-trade economics are healthy (avg_trade_return_pct 0.54%, PF 1.78), clearing the USEQ ~0.05% floor and 0.15% viability bar by ~10x. The full 30+yr walk-forward resolves the sample-size question.
Backtest Review
- Sharpe
- 0.05
- Total return
- -9.61%
- Max drawdown
- 30.05%
- Trades
- 442
- Win rate
- 26.9%
- Profit factor
- 0.93
Long history (8452 daily bars, 1993-2026) and 442 trades give a statistically well-measured result
Low fee drag on USEQ and clean O(1) implementation — the code is not the problem
Market-neutral-ish (beta 0.009), so no hidden index beta inflating results
Negative total_return (-9.61%) with profit_factor 0.934 (<1.0) — a net loser over 33 years (L8/L9 disqualifying)
avg_trade_return_pct is NEGATIVE (-0.092%), below even the zero-commission USEQ floor — no edge to capture
Sharpe 0.052 with CI [-0.255, 0.393] straddling zero; information_ratio -0.51 vs buy-hold
Expectancy -$25.89/trade, win_rate 0.269; both long and short legs are net losers across most years
Dual-timeframe trend/momentum confluence is the OHLCV directional class with 0/213 survival (L9/L41/L62); porting to SPY does not create the missing edge
30% max drawdown (CI high 77%) for a strategy that loses money
Outcome Summary
Porting a validated momentum-confluence recipe to a new asset (SPY) does not manufacture an edge — the dual-timeframe OHLCV trend template remains a negative-expectancy class even over a clean, well-measured 33-year sample.
The analyst issued an 'abandon' verdict at the pre-optimization backtest-review gate because negative total return with profit factor below 1.0 is disqualifying (L8/L9); the OHLCV dual-timeframe momentum-confluence template has 0/213 survival, so the equity-index TSMOM premium did not survive the discrete entry/exit rules and 3-parameter optimization could not turn a negative-expectancy mechanism positive.
A long/short, single-instrument dual-timeframe trend-confluence strategy on SPY.USEQ that takes a directional position only when a fast daily EMA-spread trend and a derived weekly momentum trend agree, stays flat on disagreement, and trails winners out with an ATR stop, using three free parameters (ema_ratio, weekly_lookback, trail_atr_mult).
Over 33 years (1993-2026, 8,452 daily bars) and 442 trades it lost money: total return -9.61%, profit factor 0.934, Sharpe 0.052 (CI [-0.255, 0.393]), win rate 26.9%, negative expectancy of -$25.89/trade and avg_trade_return_pct of -0.092%, with information ratio -0.51 vs buy-and-hold and a 30% max drawdown.
Backtest and paper results are hypothetical. Trading involves risk of loss.