Skip to content
All strategies

Strategies

DIA Weekly Volatility-Normalized Proportional Momentum

Outcome: Abandoned

DiaWeeklyVolatilityNormalizedProportionalMomentum

Outcome Summary

The strategy attempted weekly proportional momentum on DIA using causally volatility-normalized returns and final-session-close rebalancing. After 5 iterations, sandbox verification detected a next-session fill that violated the execution contract. It was abandoned before performance evaluation or later reviews, leaving the trading edge unassessed.

Hypothesis

Derived by the Research Lead from Fernando F. Ferreira et al., Information ratio analysis of momentum strategies: test the paper's moving average of causally volatility-normalized weekly log returns, with signed exposure proportional to that average and weekly rebalancing. Use DIA.USEQ, a tradable Dow-Jones Industrial Average ETF proxy, rather than claiming reproduction of the paper's 1896–2013 index experiment. Construct weekly observations from completed daily session bars, using each calendar week's final exchange session close. The source specifies weekly rebalancing and explores formation lookbacks of 1–43 weeks, but the supplied text does not specify the normalization lookback p or a deployable capital scale. Research choices are a baseline 20-week formation window, 20-week normalization window, equity-relative proportional sizing, and protective risk limits. Execute at the final session's close; no next-session-open fill is required. Do not use retrospectively identified BFAST regimes or the fitted 180-week oscillation as trading signals.

The source contains one executable mechanism, not several independent strategies. Its short- and long-lookback explanations are parameter-dependent interpretations of that same mechanism. DIA preserves the source's Dow exposure through an explicitly identified ETF adaptation. Long-short execution addresses the portfolio's 80.7% long-only concentration and avoids another Binance futures proposal. The supplied corpus_concentration is empty, so DIA's recent usage share cannot be established. Source fidelity takes precedence over inventing cross-venue or options legs to satisfy quotas.

verification_loop: Verification failed (Layer 3 — sandbox backtest): execution_timing_mismatch: DIA final-session-close decision_ns=1560542400000000000, actual_fill_ns=1560801600000000000; engineering review required: runner.py installs the USEQ 100ms venue LatencyModel before engine.add_venue, and FactoryStrategyConfig exposes no same-close policy. Implement an explicit research-contract execution policy in the runner, propagate it through sandbox and optimization, and verify actual fill timestamps and close prices before retrying. Preserve spread, impact and protective-stop behavior. Do not change the signal or accept next-session fills. Bar type used: DIA.USEQ-1-DAY-LAST-EXTERNAL, Bars processed: 0 Ensure your strategy produces trades with the given data and parameters.

Implementation

DIA weekly long-short proportional momentum using weekly log returns normalized by preceding-week volatility, a rolling formation average, calendar-anchored weekly rebalancing, whole-share equity-relative sizing, and protective stops. Execution remains blocked by the runner's delayed fills.

Preserved the previous implementation's imports, signal, entry, sizing, rebalance and protection logic; changed only the class documentation and execution-mismatch diagnostic. Inspection confirms runner.py installs venue latency before engine.add_venue and USEQ configures 100ms latency. No supported strategy-level same-close override exists. This submission does not fix Layer 3 and must not be retried as a completed repair. An engineering change is required outside the strategy. The workspace is read-only, so neither that change nor the mandatory outbox write could be performed. No backtest or final-exam data was read.

Verification Results

Verification failed (Layer 3 — sandbox backtest): execution_timing_mismatch: DIA final-session-close decision_ns=1560542400000000000, actual_fill_ns=1560801600000000000; engineering review required: runner.py installs the USEQ 100ms venue LatencyModel before engine.add_venue, and FactoryStrategyConfig exposes no same-close policy. Implement an explicit research-contract execution policy in the runner, propagate it through sandbox and optimization, and verify actual fill timestamps and close prices before retrying. Preserve spread, impact and protective-stop behavior. Do not change the signal or accept next-session fills. Bar type used: DIA.USEQ-1-DAY-LAST-EXTERNAL, Bars processed: 0 Ensure your strategy produces trades with the given data and parameters.

Analysis

Before optimization, reconcile weekly signal timestamps with actual order-fill timestamps. Implement the specified final exchange-session close execution through a supported execution path, and verify ordinary Fridays and holiday-shortened weeks against dated fills. Do not relabel next-session fills as close fills. Keep formation_weeks=20, normalization_weeks=20 and existing risk settings unchanged for this correction, then rerun the baseline. The current negative results judge the implemented timing, not the source paper or the requested close-execution variant.

Iteration History

Verification failed (Layer 1 — static analysis): - Banned import: src.data.market_calendar — strategies may only import the framework bases and helpers (src.strategies.base_template, src.strategies.rolling_options_template, src.strategies.polymarket_series_template, src.strategies.helpers); collectors, the database, the backtest engine and the registry are outside the sandbox. (line 9)

Verification failed (Layer 3 — sandbox backtest): execution_timing_mismatch: DIA final-session-close decision_ns=1560542400000000000, actual_fill_ns=1560801600000000000; the runner must provide supported same-close execution before this baseline can evaluate the hypothesis Bar type used: DIA.USEQ-1-DAY-LAST-EXTERNAL, Bars processed: 0 Ensure your strategy produces trades with the given data and parameters.

Verification failed (Layer 3 — sandbox backtest): execution_timing_mismatch: DIA final-session-close decision_ns=1560542400000000000, actual_fill_ns=1560801600000000000; engineering review required: src/backtesting/runner.py applies venue-level LatencyModel before engine.add_venue; FactoryStrategyConfig exposes no same-close execution override. Provide a supported runner execution policy for this research contract before retrying; changing the signal or accepting next-session fills would change the hypothesis. Bar type used: DIA.USEQ-1-DAY-LAST-EXTERNAL, Bars processed: 0 Ensure your strategy produces trades with the given data and parameters.

Outcome Summary

Implement and propagate an explicit same-close execution policy, verify fill timestamps and prices, and preserve spread, impact, and protective-stop behavior before retrying.

After 5 iterations, verification failed at Layer 3 because an actual fill occurred in the next session rather than at the required final-session close. The failure identified the runner's USEQ 100ms latency model and missing same-close execution policy as requiring engineering review.

Trade DIA using signed exposure proportional to averaged, causally volatility-normalized weekly log returns, rebalancing at each week's final exchange session close.

No return, Sharpe, or trade-count metrics were reported; the failed sandbox reported 0 bars processed. Backtest review, optimization, analyst review, and risk review were not reached.

Analysis

Information ratio analysis of momentum strategies

Backtest Review

Sharpe
-0.16
Total return
-4.80%
Max drawdown
5.48%
Trades
186
Win rate
19.9%
Profit factor
0.67

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