Strategies
Double-7s Portfolio (pinkfish, F. Aultman after Connors & Alvarez): Buy a 7-Day Closing Low Above the 200-SMA, Sell a 7-Day Closing High, Equal Weight Across SPY/QQQ/DIA/IWM, USEQ Daily Bars, Long-Only
Outcome: Abandoned
Double7sPortfolioUseq
Outcome Summary
Double7sPortfolioUseq put the Connors/Alvarez Double-7s rule on four broad US index ETFs on the zero-commission USEQ venue, long-only and equal-weighted, with a 200-SMA regime filter. It never passed verification: Layer 3 sandbox smoke tests timed out at 300s on all 3 iterations, including iteration 2, which made per-bar work incremental. The iteration-3 profiling notes say the time went to the backtest runner's catalog instrument scan, not the strategy. The run was abandoned before any backtest, optimization, analyst or risk review, so its edge was never measured.
Hypothesis
verification_loop: 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).
Implementation
Stratmill translation of pinkfish's double-7s-portfolio (F. Aultman, MIT). Uses Connors & Alvarez's Double 7's rule on SPY/QQQ/DIA/IWM daily USEQ bars, long-only with equal 1/N weights. An ETF is bought when it closes at its 7-day closing low while above its 200-day SMA. It is sold when it closes at its 7-day closing high, or below its stop (the default stop_loss_pct=1.0 puts the stop at 0, so it never fires, as in the source).
Verification Results
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
When a sandbox timeout comes from catalog scanning before the first bar and not from strategy code, rewriting the strategy cannot fix it; it needs an infrastructure fix, not more coding iterations.
After 3 iterations it was abandoned in a verification loop: each Layer 3 sandbox backtest went past the 300s wall-clock limit on the 2400-day SPY.USEQ daily window. The iteration-3 notes say profiling traced the wall time to the ParquetDataCatalog.instruments() glob over the catalog (about 56k Polymarket dirs), which runs before any strategy code, not to per-bar strategy work.
A long-only, equal-weight Double-7s mean-reversion portfolio on SPY/QQQ/DIA/IWM daily USEQ bars (a translation of pinkfish's example of the Connors & Alvarez rule): buy an ETF at its 7-day closing low while it is above its 200-day SMA, and sell it at a 7-day closing high.
No performance numbers exist. The backtest report is empty, optimization did not run, and no return, Sharpe or trade count was produced.
Analysis
double-7s-portfolio
Backtest and paper results are hypothetical. Trading involves risk of loss.