Strategies
SPY Market-Strength-Conditioned Half-Month Calendar Strategy
Outcome: Abandoned
SpyStrengthConditionedHalfMonthCalendar
Outcome Summary
This strategy tested whether a Chinese-index rule (a half-month calendar effect conditioned on market strength) works on SPY. Over 30 years and 252 trades it returned +19.6% with a Sharpe of 0.15, and its returns came from a roughly 25%-notional long exposure. The short leg lost money even before costs. After 3 iterations the analyst abandoned it: the signal carried no information (IC 0.013, t=0.24), alpha was negative, drawdown reached 23.0% against a 15% limit, and walk-forward failed. The verdict covers only moving the rule to SPY daily bars, not the original Chinese-index result.
Hypothesis
A source-inspired adaptation of Guosen Securities' market-strength-conditioned month-start effect, published by BigQuant 宽邦. Trade SPY.USEQ using 1-DAY bars: remain long in strong markets; in weaker markets, go long before calendar day 15 and short from day 15 onward. The original report concerns Chinese indices. This experiment tests transferability to a liquid US index ETF; it does not reproduce the report or adopt its claimed returns. Because the full PDF's RPS definition could not be verified, use the explicitly registered causal proxy below.
Preserve the source's index-calendar mechanism rather than inventing a crypto seasonal edge. USEQ supplies decades of daily history and low execution costs. Long/short exposure addresses the portfolio's 82.6% long-only concentration and avoids adding another Binance experiment. Single-symbol scope is justified by the source's index timing design. corpus_concentration is empty, so instrument-specific novelty cannot be established. This differs from the failed SPY one-session overshoot fade and sector momentum rotation through its calendar-conditioned holding rule. Options and Hyperliquid deficits do not justify moving an equity calendar mechanism onto unsuitable instruments.
premise_falsified (no_edge). Thirty years of SPY data show no value from this calendar rule. It has negative alpha, an information ratio of -0.47 versus SPY and a signal IC of 0.013 (t=0.24). Fees are not the cause: 0.291% per trade against the 0.05% floor. The strategy breaks its own 15% drawdown limit (23.0%), and walk-forward rejected it for insufficient candidate coverage. With no tunable parameters, iterating cannot change the result. Prior SPY and QQQ calendar strategies (option-expiration cycle, pension month-end, QQQ turn-of-month) were abandoned too. This verdict covers moving the Guosen month-start effect to SPY daily bars only. It does not test the original Chinese-index result. Research should stop proposing half-month calendar strategies on US large-cap indexes.
Implementation
Trades SPY.USEQ on daily bars. Market strength is the 10-day average of SPY's 252-day price rank. When strength is 0.6 or higher the strategy holds long. Below 0.6 it is long for sessions before the 15th of the month and short from the 15th on, using the calendar day of the next session. Each decision is made at a session close and executed at the next session's open. To do that, it places a linked one-cancels-other pair one tick either side of the decision close: a STOP_MARKET and a MARKET_IF_TOUCHED, both in the trade's direction. A one-second timer lets the venue accept the pair before the next bar is matched. The open gaps through one of the two levels, that order fills as a market order at the open, and the other is cancelled. A direction reversal uses one netting order sized to the held position plus the new one. If a close shows a 4% loss on the position, it exits at the next open. It does not re-enter until the target direction changes. Position size is the smaller of 25% of equity and 1% risk divided by the 4% stop, which is 25% of equity, at 1x leverage.
Verification Results
Acceptable as is. If the import allowlist ever includes src.data.market_calendar, use its next-session function.
_next_session_day takes the next WEEKDAY as the execution session and ignores exchange holidays. It is wrong only when a holiday moves the next session across the day-15 boundary. Example: Good Friday on the 14th means the code computes day 14 (long), but execution is on Monday the 17th (should be short). This is rare and the developer documented it, since market_calendar is not on the import allowlist.
Optional: log how many fills differ from the bar open in the full backtest. If the count is material, move the triggers further apart (e.g. ±0.5 bp) so an open equal to the close still fires at the open of the bar after.
Next-open execution uses an OCO STOP_MARKET/MIT pair placed one tick either side of the decision close. If the next open equals the decision close exactly (within one cent on SPY), neither leg fires at the open. One leg then triggers intrabar and fills at the trigger price, i.e. the decision close ±1 tick, not the open. The developer's own run saw a few fills at the trigger price. This leaks a small, symmetric amount of close-price execution on a small fraction of days. It is not a directional look-ahead.
No action needed. Optionally re-issue the order from the cancel event.
_cancel_stale_orders sends the cancel and _process_primary then runs in the same bar. The cancel goes through the venue's latency, so the cache still shows the cancelled orders as open. The base returns early with 'order_in_flight' when flat, or should_exit returns False, so the re-issued decision slips one more session. This only happens after a full session in which SPY never moved more than one tick from the prior close, which is practically never.
Keep the open-orders guard in should_exit. If brackets are ever added, restore the cancel-before-close step.
_submit_exit overrides the base and drops its _close_pending guard and its cancel_all_orders before closing. This is safe here: should_exit returns False while any order for the instrument is open, so close orders cannot stack, and no protective legs exist to cancel.
Sandbox: Sharpe 0.18, PF 1.06, 46 closed trades, beta 0.13. Losses fall in the stressed vol tercile (-6.1%), in rate_shock_2022 and in covid_2020. The half-month rule comes from Chinese index research. Its transfer to SPY is unproven, and in weak US markets the short half of the month may simply be shorting rebounds. At about 8 round trips a year, the full 1993+ history gives roughly 250 trades, so the full backtest can measure it. Check first whether the weak-regime short leg (short win rate 0.35) has positive gross expectancy. If it does not, the long-only strength filter is doing all the work.
Backtest Review
- Sharpe
- 0.15
- Total return
- 19.56%
- Max drawdown
- 23.02%
- Trades
- 252
- Win rate
- 40.5%
- Profit factor
- 1.12
Reliable sample: 253 closed trades from 1994 to 2024 (127 long, 126 short) with clean accounting and no data gaps.
avg_trade_return_pct is 0.29%, above the USEQ floor of 0.05%. PF is 1.12 and Sharpe is positive at 0.15.
Execution is causal: orders fill at the next session open, never at the decision close.
The premise leg loses money. The 126 SHORT trades (weak-regime, second-half-of-month) total -$23,746 net. Borrow cost is only about $621, so this leg loses before costs too. The 127 LONG trades total +$39,843. QA's concern is confirmed: the half-month short in weak US markets mostly shorts rebounds.
What survives is a roughly 25%-notional SPY long. Beta is 0.12, alpha -0.0027 and information ratio -0.47, so the strategy adds no edge over its benchmark exposure. Total return is +19.6% over 30 years.
The signal-IC diagnostic rejects the forecast: IC 0.013, t=0.24, verdict 'rejected_no_information'. The Sharpe 95% CI is [-0.20, 0.51].
The strategy sat flat from 2016-06-28 to 2018-10-25. A long was stopped out, and the registered rule 'reentry_after_stop = next_target_direction_change' then blocked longs for 28 months while the strong regime persisted, so it missed the 2016-18 rally. This contradicts 'remain long in strong markets'.
Max drawdown is 23.0%, above the pre-registered 15%. The stressed vol tercile loses money (-7.1%, Sharpe -0.08).
The optimization plan has an empty tunable set (operation 'frozen'), so optimization cannot change the result.
Analysis
Accounting is clean: orders fill at the next session's open, there is no lookahead, and the sample is 30 years of SPY with 252 closed trades.
Fees are not the problem: average trade return is 0.291%, about 5.8 times the 0.05% USEQ floor. Market impact takes 11.8% of gross.
No edge over buy-and-hold: +19.6% total return over 30 years, Sharpe 0.15 (95% interval -0.20 to 0.51), profit factor 1.12, alpha -0.27% a year, information ratio -0.47 versus SPY buy-and-hold.
The signal carries no information: correlation with forward returns (IC) is 0.013, t=0.24.
Max drawdown is 23.0%, above the pre-registered 15% risk limit. That limit cannot be waived, and the drawdown has not recovered (about 9,300 days).
Walk-forward rejected the strategy for insufficient candidate coverage: only 36 of 59 windows had an acceptable candidate, and the latest window had none. From the 2009 window onward, the one fixed rule broke the 15% drawdown limit in every window. There are no tunable parameters.
Results are inconsistent: 16 of 30 years are positive (53%, below the 60% floor), 1997 alone carries 40% of the profit, and the strategy loses in the high-volatility third (Sharpe -0.08). In-sample Sharpe falls from about 1.4 to about 0.2 over time.
Code defect, recorded but not the reason for this verdict: the strategy sat flat from 2016-06 to 2018-10. A stop blocked re-entry while the market-strength target stayed long.
Iteration History
Verification failed (Layer 1.5 — hypothesis/config consistency) [class=hypothesis_mismatch]: - optimization_plan fixes leverage at 1.0
Outcome Summary
In weak US markets, shorting SPY in the second half of the month mostly shorted rebounds. Half-month calendar rules on US large-cap indexes showed no edge, matching earlier abandoned SPY/QQQ calendar strategies, so research should stop proposing them.
The backtest review sent it to optimization. The analyst then abandoned it as premise_falsified (no_edge). The signal IC was 0.013 (t=0.24) with no alpha over SPY, and drawdown broke the pre-registered 15% limit. Walk-forward rejected it for insufficient candidate coverage (36 of 59 windows), and with no tunable parameters, iterating could not change the result.
The strategy tested whether Guosen Securities' market-strength-conditioned month-start effect, published for Chinese indices, carries over to SPY daily bars. It stayed long when a smoothed 252-day price-rank strength proxy was at or above 0.6. Otherwise it went long before calendar day 15 and short from day 15 onward.
Over 1994-2024 it made +19.6% total return with a Sharpe of 0.15 (95% CI -0.20 to 0.51), across 252 closed trades. Average return per trade was 0.291%, profit factor 1.12, alpha -0.0027, information ratio -0.47 and max drawdown 23.0%. The 126 short trades lost about $23.7k net and the long trades made about $39.8k.
Analysis
基于市场强弱下月初效应的指数投资方法 国信证券_20180813_ - BigQuant量化交易
Backtest and paper results are hypothetical. Trading involves risk of loss.