Strategies
Developed-Market Turn-of-the-Month Flow Window, Disjoint-Universe Replication: long an equal-weight EWG/EWJ/EWU/EFA basket from the open of the month's last NYSE session to the open of the 4th session of the new month, vol-targeted, flat otherwise (USEQ 1-DAY, long-only calendar event, frozen rule)
Outcome: Abandoned
DevelopedEtfTurnOfMonthBasket
Outcome Summary
DevelopedEtfTurnOfMonthBasket tested the promoted turn-of-the-month flow window on a separate universe: four developed-market country and region ETFs, traded long-only on USEQ daily bars with next-open fills. The pre-study expected +0.215% gross per window. In the backtest the 1996-2020 development period gave only +0.043% per window, an average trade of 0.041%, Sharpe 0.05 and a 35.5% drawdown, with negative windows after 2010. The analyst abandoned it at backtest review after one iteration, before optimization, because the window added no return over simply holding the basket on random days and its expectancy was below the USEQ cost floor.
Hypothesis
Quota position: USEQ is 9.7% of the corpus and long-only is over-represented. I tested and rejected several under-represented alternatives before choosing this one, each on its own data. HKEQ TOM on 2800.HK: +0.36% per window against a ~0.30% statutory round trip, under 2x the cost. A VIX-minus-realized VRP timer on SPY: no Sharpe gain over buy-and-hold (0.56 vs 0.57), and its short arm loses. The crypto funding-settlement, weekend, confluence, NR7, volume-share and gold-session families are already saturated in the corpus. This hypothesis earns its slot as a mechanism-level breadth test that lessons L227/L228 ask for: one rule, frozen from a promoted run, measured on a disjoint universe. Its success criteria are pre-registered from a fixed-rule pre-study, and the independent sample is stated as 367 distinct month windows (L238).
negative_expectancy: on 291 month windows (1996-2020 development period), the frozen turn-of-the-month rule on the developed-market ETF basket EWG/EWJ/EWU/EFA averages 0.041% per trade against the 0.05% USEQ floor. PF is 1.01, Sharpe 0.05, and total return +2.7% over 24 years. The basket window return is +0.043% (t 0.30), which does not beat the hypothesis's own random 4-session-block comparator (about +0.05%), and it is negative in 2010-2020 (-0.14% and -0.09% per window in the two sub-periods). Drawdown is 35.5% against the pre-registered 20%. QA's edge concern is borne out. Trade timing matches the rule exactly, so this is not a code defect, and optimization can only shift or scale the same window. Not the reason for this verdict: statistical significance, family history, drawdown on its own. This verdict covers this disjoint-universe replication on developed-market ETFs only. It is not a verdict on the promoted SPY or EM-basket turn-of-the-month runs, though it suggests the flow effect does not transfer to developed ex-US ETFs traded open-to-open from the US.
Implementation
Long-or-cash turn-of-the-month basket on the four developed-market country/region ETFs EWG/EWJ/EWU/EFA (USEQ daily). At the close of the session before the month's last NYSE session (entry_offset=0) it orders an equal-weight basket that fills at the open of the last session (next_open_fill); at the close of the 3rd session of the new month it orders the exit, which fills at the open of the 4th session (exit_session=4). Gross = min(gross_cap=1.0, target_vol_ann / annualised 20-session realised vol of the equal-weight basket), split equally across legs listed and printing at the decision session. Flat otherwise. Trading days and month boundaries come from src.strategies.helpers.sessions only.
Frozen-rule transfer of the promoted EM country-ETF TOM basket (same code path, renamed to the plan's parameter names: entry_offset, exit_session, target_vol_ann tunable; gross_cap=1.0, vol_lookback=20, min_history_bars=21 fixed) onto the disjoint developed-market universe chosen by rule. Execution uses the supported next_open_fill: decisions on session N's close fill at session N+1's open, giving the 4-session open-to-open hold. point_in_time_universe=True so the window starts at the 1996 history and EFA joins from its first bar (2001-08). Risk route (b): calendar time exit plus capped unlevered sizing (gross <= 1.0 equity, ~25% per leg), leverage 1.0; vol scaling is clamped by gross_cap. Signal is the continuous window clock for the next session (positive = sessions left inside the window, negative = sessions until it opens). Every leg is its own order/position, so the ledger books ~4 trades per month window (~1,400 over the history), but the independent sample is the ~367 month windows.
Verification Results
Optional: drop that leg's previous close (or skip its return) when its bar for the session is missing.
When a listed leg prints no bar at a decision session, its stored _leg_prev_close is kept. The next return for that leg then spans two sessions and is averaged into the basket series as one day, which slightly inflates the realised vol. The base point-in-time barrier makes this rare on these ETFs.
Skip _submit_exit_position when cache.orders_open(instrument_id=iid) already holds a closing order.
Extra-leg exits are re-submitted on every bar while signal <= 0 and a position is still open. In the backtest the next-open fill closes the position before the next decision bar, so this is harmless there. In paper, an exit still in flight could be duplicated, though reduce-only handling makes this at most a warning.
Pre-study evidence is thin: mean +0.215% per window at t=1.72 on 367 windows, and only +0.076% over 2010+ (201 months). The post-2010 figure is close to the random-block comparator (~0.05%) and only about 1.5-4x the 0.02-0.05% USEQ round-trip cost. Vol targeting at 10-20% annual on a basket with ~15-20% realised vol will often set gross below 1, which shrinks dollar PnL but leaves per-trade % unchanged. The analyst should measure the window's return over the random-4-session-block comparator (L217) on the full history and by sub-period, not the raw average trade.
Backtest Review
- Sharpe
- 0.12
- Total return
- 17.66%
- Max drawdown
- 35.46%
- Trades
- 1397
- Win rate
- 54.6%
- Profit factor
- 1.06
The code does what the hypothesis says. All 291 basket entries fill at the open of the month's last NYSE session (dates 26th-31st) and exit at the open of the 4th session of the new month (6-7 calendar days). The basket is long-only, equal-weight, about 0.33x per leg with three legs (EFA joins in 2001-08), and vol-targeted gross falls to about 0.22x per leg in high-vol periods.
The sample is large and reliable: 291 independent month windows and 1,101 leg trades over 1996-2020. Zero commissions. Input audit is clean.
Measured net expectancy is not positive after costs. Average trade is 0.041% of notional, below the USEQ floor of 0.05%. PF is 1.01, Sharpe 0.05, and total return +2.7% over 24 years (CAGR 0.11%).
Per-window equal-weight basket return over the development period is +0.043% (t 0.30, hit rate 0.54, n=291). By sub-period: 1996-2002 +0.06%; 2003-2009 +0.27% (t 1.0); 2010-2014 -0.14%; 2015-2020 -0.09%. Post-2010 it is negative.
QA's concern is borne out. The window's return (+0.043%) does not beat the hypothesis's own random 4-session-block comparator (about +0.05%), so the window adds no incremental return over simply being long.
Drawdown is 35.5% against the pre-registered 20% constraint, and the longest drawdown lasted 3,411 days. 13 of 25 calendar years were negative.
The backtest is well below the pre-study's +0.215% gross per window, even after allowing for the pre-study including later years. I have not checked the cause (for example, how the pre-study measured windows versus engine fills at catalog opens), so it is not asserted here.
Outcome Summary
A calendar-flow edge that works on SPY and emerging-market ETFs does not automatically carry over to developed ex-US ETFs traded open-to-open from the US, so a pre-study's gross estimate (+0.215% per window here) should be checked against engine fills and the incremental comparator before it is trusted.
The analyst abandoned it at backtest review for negative expectancy. The basket's window return of +0.043% (t 0.30) did not beat the hypothesis's own random 4-session comparator of about +0.05%, it was negative after 2010, and drawdown was 35.5% against the pre-registered 20% limit. Trade timing matched the rule, so it was not a code defect, and optimization was not run.
This was a frozen-rule test of whether the turn-of-the-month flow effect, already promoted on SPY and on an emerging-market ETF basket, also shows up in developed ex-US ETFs (EWG/EWJ/EWU/EFA). The rule held an equal-weight, vol-targeted long basket from the open of the month's last NYSE session to the open of the 4th session of the new month, and stayed in cash otherwise.
In the 1996-2020 development period the backtest review counted 291 month windows. The average trade was 0.041% of notional, below the 0.05% USEQ floor, with profit factor 1.01, Sharpe 0.05 and total return +2.7%. The full-history report shows 1,397 trades, an average trade of 0.087%, Sharpe 0.12, total return 17.7% and maximum drawdown 35.5%.
Backtest and paper results are hypothetical. Trading involves risk of loss.