Strategies
Same-Calendar-Month Return Seasonality, Dollar-Neutral Cross-Section of 18 Sector + Country ETFs (USEQ 1-DAY, Monthly Rebalance at Month-End Close, Long Top-k / Short Bottom-k by Seasonal Excess Return)
Outcome: Abandoned
SameMonthSeasonalityEtfLS
Outcome Summary
SameMonthSeasonalityEtfLS pursued cross-sectional monthly return seasonality across 18 ETFs with inverse-volatility sizing. After four iterations, QA identified an execution mismatch: the hypothesis required month-end-close fills, while the platform executes these orders at the next session's open. Negative sandbox expectancy was advisory; the execution mismatch caused abandonment before later pipeline stages.
Hypothesis
This fills under-represented buckets (long_short 18.8%, USEQ 6.6%, multi-instrument) with a mechanism absent from the corpus. The ETF panel avoids the membership trap of a stock-constituent universe (L190). It needs no supplementary feed (L189), targets moves of several percent per month, and decades of daily history give hundreds of rebalances.
verification_loop: Verification failed (Layer 4 — QA review) [class=hypothesis_mismatch]: - [edge_concern] The sandbox reports negative expectancy, particularly in stressed regimes. This is advisory and does not determine the correctness verdict. - [critical] The hypothesis explicitly requires month-end rebalance orders to fill at that session's close. _reconcile submits ordinary market orders through _submit_entry_instrument and _submit_exit_position. This bar-driven USEQ configuration fills those orders at the next session's open, as confirmed by src/backtesting/next_open.py and the brief's execution_capabilities. Thus entries, reductions and reversals cannot meet the specified execution timing. The submission itself acknowledges this incompatibility. (line 292) — fix: Obtain a revised research specification explicitly requiring month-end-close decisions with next-session-open execution, then update the strategy documentation accordingly. Preserving the current specification requires platform support for same-close execution; strategy code cannot supply it.
Implementation
Monthly seasonal-excess ranking of the fixed 18-ETF USEQ panel, inverse-volatility weighted top-k longs and bottom-k shorts, 100% gross exposure and 15% intrabar protective stops. Existing implementation retained for review; the required month-end same-close execution is unsupported.
Preserves the previous signal, universe, sizing, reconciliation and protective stops. QA identifies a real execution-contract mismatch. The explicit USEQ developer rule requires abandon when the hypothesis requires same-close fills; infrastructure changes and next-session substitution would violate this task scope. Negative sandbox expectancy remains advisory and is not the reason for abandonment.
Verification Results
Verification failed (Layer 4 — QA review) [class=hypothesis_mismatch]: - [edge_concern] The sandbox reports negative expectancy, particularly in stressed regimes. This is advisory and does not determine the correctness verdict. - [critical] The hypothesis explicitly requires month-end rebalance orders to fill at that session's close. _reconcile submits ordinary market orders through _submit_entry_instrument and _submit_exit_position. This bar-driven USEQ configuration fills those orders at the next session's open, as confirmed by src/backtesting/next_open.py and the brief's execution_capabilities. Thus entries, reductions and reversals cannot meet the specified execution timing. The submission itself acknowledges this incompatibility. (line 292) — fix: Obtain a revised research specification explicitly requiring month-end-close decisions with next-session-open execution, then update the strategy documentation accordingly. Preserving the current specification requires platform support for same-close execution; strategy code cannot supply it.
Obtain a revised research specification explicitly requiring month-end-close decisions with next-session-open execution, then update the strategy documentation accordingly. Preserving the current specification requires platform support for same-close execution; strategy code cannot supply it.
The hypothesis explicitly requires month-end rebalance orders to fill at that session's close. _reconcile submits ordinary market orders through _submit_entry_instrument and _submit_exit_position. This bar-driven USEQ configuration fills those orders at the next session's open, as confirmed by src/backtesting/next_open.py and the brief's execution_capabilities. Thus entries, reductions and reversals cannot meet the specified execution timing. The submission itself acknowledges this incompatibility.
Iteration History
Install and synchronize each leg's reduce-only stop immediately after entry or resize fills using fill/position events, or use supported contingent orders. Verify protection exists before the next session's OHLC execution.
Protective stops are synchronized before queued entry orders fill. Newly opened positions therefore have no stop, and existing resized positions retain stale stop quantities. There is no fill callback to synchronize protection. The next synchronization occurs after the following daily bar's execution processing, leaving that entire session unprotected or incompletely protected. This violates the specified 15% intrabar protective stop.
Complete flips through fill-driven reconciliation at the original rebalance timestamp, or submit a correctly managed netting reversal. Verify both removal of old exposure and establishment of the new target at month-end.
A sign-changing leg is closed during the month-end callback, but its opposite-side entry is deferred because the queued close has not filled when _net_qty is read again. _reconcile is called again only on the next aligned daily bar. The opposite position consequently opens at the next session's close rather than the required month-end close, missing the first session of the holding month.
Check aggregate executed long and short notionals after applying the tolerance, and reconcile residual imbalance within an explicitly approved portfolio tolerance.
The 20% per-leg resize tolerance can leave the executed book materially different from its dollar-neutral, 100%-gross targets. For example, retained long exposure can be 120% of its side's target while retained short exposure is 80%, producing approximately 20% net exposure before rounding. Target weights alone do not establish actual neutrality.
Track complete calendar-year coverage and apply the hypothesis's eligibility rule, or explicitly clarify that eligibility means 60 completed monthly returns.
Eligibility tests for 60 completed monthly returns rather than five complete calendar years. An ETF listed midyear can qualify before five full January-through-December years have completed.
During the pre-evaluation freeze, ingest history but do not advance executed rebalance state or reconcile orders. Define reconciliation completion from actual signed positions and outstanding orders, rather than submission attempts. Establish an explicit evaluation-boundary policy that preserves month-end execution semantics, and handle rejected submissions without silently declaring the portfolio complete.
_reconcile returns True after submitting orders without checking whether targets were reached. This interacts incorrectly with the actual backtest warmup: the runner sets _no_entries_before_ns, and the base calls calculate_signal during that preamble while suppressing entry submissions. At a warmup month-end, calculate_signal records the upcoming month's _rebal_target_mk, builds targets, and clears _rebal_pending although the book remains flat. If evaluation begins in that upcoming month, its month-start fallback also skips because _rebal_target_mk already equals mk. The strategy therefore misses that month's portfolio and holds no exposure until the following month-end. Rejected or suppressed submissions during ordinary execution can similarly leave an incomplete, non-neutral book marked complete.
Use the repository calendar's trading-day functions for month-end and month-start detection, retaining the daily bars' actual session-close timestamps.
The strategy duplicates the USEQ calendar instead of using src/data/market_calendar.py as specified. Its calendar omits the repository's exceptional closures. For example, it treats January 2, 2007 as a session, so January 3 is not recognized as the actual first session by its fallback. Daily half-day bars themselves are handled by their supplied close timestamps.
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 20)
Implement an explicit research-contract same-close execution policy in the execution infrastructure and propagate it through sandbox, full backtests and optimization. Verify each rebalance leg's actual fill timestamp against the month-end session close and its fill price against that instrument's close, allowing the intended execution costs. Preserve spread, impact and intrabar protective stops; do not substitute next-session execution.
The hypothesis requires executions at the month-end close. These ordinary market submissions use the default USEQ execution path: venue_configs.py sets latency_ms=100, and runner.py installs that LatencyModel before adding the venue. Thus orders submitted after the aligned month-end bars are received are delayed beyond that close; the strategy/config provides no same-close execution policy. This also affects rebalance reductions and reversals. Passing the sandbox smoke test does not establish the required fill timestamps or prices.
Outcome Summary
Align the research execution specification with platform capabilities before implementation, either accepting next-session-open fills or adding same-close execution support.
After four iterations, Layer 4 QA verification failed because USEQ market orders execute at the next session's open, violating the hypothesis's required month-end-close fills. Later pipeline stages were not reached.
Rank 18 sector and country ETFs by same-calendar-month seasonal excess return, buying the strongest and shorting the weakest in a dollar-neutral portfolio rebalanced at month-end close.
No backtest performance metrics or optimization report were provided. QA cited negative sandbox expectancy, particularly in stressed regimes, as an advisory concern.
Abandon Reason
verification_loop: Verification failed (Layer 4 — QA review) [class=hypothesis_mismatch]: - [edge_concern] The sandbox reports negative expectancy, particularly in stressed regimes. This is advisory and does not determine the correctness verdict. - [critical] The hypothesis explicitly requires month-end rebalance orders to fill at that session's close. _reconcile submits ordinary market orders through _submit_entry_instrument and _submit_exit_position. This bar-driven USEQ configuration fills those orders at the next session's open, as confirmed by src/backtesting/next_open.py and the brief's execution_capabilities. Thus entries, reductions and reversals cannot meet the specified execution timing. The submission itself acknowledges this incompatibility. (line 292) — fix: Obtain a revised research specification explicitly requiring month-end-close decisions with next-session-open execution, then update the strategy documentation accordingly. Preserving the current specification requires platform support for same-close execution; strategy code cannot supply it.
Backtest and paper results are hypothetical. Trading involves risk of loss.