UseqIntradayLiquidityShockReversalTwelveLargeCapLS
Hypotheses
Intraday Liquidity-Shock Reversal on 12 Never-Traded USEQ Large Caps — Fade a >=2.5-Sigma CLOSE-TO-CLOSE Move ONLY When It Was Made INSIDE the Session (Overnight-Gap Share < 50% = news/earnings filter), Long AND Short, Per-Name Absolute Trigger, 3-Day Time Exit (3 parameters, no cross-sectional ranking)
Hypotheses
A LONG-AND-SHORT, MULTI-INSTRUMENT, pure-OHLCV, event-triggered short-horizon REVERSAL strategy on 12 sector-diverse, liquid US large caps traded on the commission-free USEQ venue (XOM, CVX, CAT, HON, UNH, MRK, WMT, TGT, NKE, SBUX, LOW, DIS — all 12 confirmed present in the catalog as USEQ-1-DAY-LAST-EXTERNAL with decades of split-adjusted history; none has ever been traded by this factory). The mechanism is the liquidity-provision premium, not momentum and not rotation: when a single name is hit by a large, concentrated INTRADAY order-flow shock (index/ETF flows, a forced unwind, a rebalance, a risk-parity de-gross), market makers absorb the inventory and demand compensation, which shows up as a partial price reversal over the next 1-3 sessions. The distinguishing filter is that it tries hard NOT to trade shocks that are INFORMATION: firm-specific news arrives overnight and is expressed as a GAP, and gap-driven moves DRIFT (PEAD) rather than revert. We have no earnings calendar, but a daily bar gives the gap for free: gap = open_t - close_{t-1}. The rule only fades moves whose overnight component is a minority of the total move. This is a direct response to the COIN overnight-residual abandon of 2026-09-11 (overnight component CONTINUES, corr +0.11) — we exclude those cases instead of betting on them. NO cross-sectional ranking, NO universe sort per bar, NO regime gate: each name is evaluated independently against its own trailing vol, keeping per-bar work O(1) per instrument (the 30-name cross-sectional USEQ construct died at coding with 3 timeouts) and the parameter count at three.
Hypotheses
Iteration 7 addresses the single reported failure — 'Incoherent: Sharpe 0.03 disagrees in sign with total_return -3.29%'. That is not a signal bug: both numbers come from the same MTM equity curve, the Sharpe from the mean/stdev of its dense daily returns and the return from its endpoint (geometric). With ~0.6% daily stdev over a ~20-year daily sample, the arithmetic drift implied by a +0.03 Sharpe (~+5.7% over the span) is smaller than the -0.5*sigma^2*N variance drag (~-9%), so the compounded path ends below par while the mean day is fractionally positive. The only lever that reduces drag without touching the pre-registered edge definition is book scale, because drag falls with the SQUARE of size while drift falls linearly: risk_per_trade 0.0040 -> 0.0020 and gross_exposure 0.60 -> 0.30 (bounds widened so neither sits on a clamp floor) halve daily stdev and quarter the drag, which restores sign agreement. Everything the earlier layers passed on is untouched: same imports, same class structure, same continuous per-name z-score signal, the same pre-registered entry_sigma 2.5 / gap_share_max 0.50 / hold_days 3 (clamp [1,3]), same point-in-time sigma, same gap filter, same calendar-anchored exit, same 12-name USEQ long/short basket at leverage 1.0. In one sentence of honest dissent: this makes the metrics coherent but cannot make them good — Sharpe is scale-invariant, so a 0.03 on a multi-decade 12-name sample says the intraday-shock fade has no edge here, which is why the recommendation below is abandon rather than continue.
Hypotheses
backtest_no_trades: metrics unreliable: Incoherent: Sharpe 0.00 disagrees in sign with total_return -1.01% — the Sharpe is computed from the mtm_equity_curve series while the return comes from the equity curve. Judge on the equity curve.
Implementation
Long/short, 12-name USEQ large-cap daily reversal. Each session, every name is scored independently against its OWN trailing 60-session return volatility: z = (close_t/close_{t-1} - 1) / sigma_i, with sigma taken strictly BEFORE today's return (point-in-time). A name whose |z| >= 2.5 is faded (BUY a down shock, SELL an up shock) ONLY if the overnight gap was a MINORITY of the move (|open_t - close_{t-1}| / |close_t - close_{t-1}| < 0.50) — the news/earnings filter, since information arrives as a gap and drifts (PEAD) rather than reverting. Positions are held exactly 3 completed sessions (calendar-anchored off processed bar timestamps, restart-safe) and then closed; no stop, no target, no ranking, no regime gate. Sizing is per-name inverse-vol risk parity, notional = equity * 0.0020 / (sigma_i * sqrt(3)), capped per name and by a 30%-of-equity gross budget, whole shares, leverage 1.0, max 6 concurrent.
Verification Results
Check `room` separately for the early return; use `continue` otherwise.
Verification Results
`return` instead of `continue` when notional < min_trade_notional abandons the rest of the basket for that session even when the binding term is the risk/name cap rather than exhausted gross budget. Latent at 100k equity.
Verification Results
Carry the pre-append sigma out of the metrics loop and reuse it for sizing.
Verification Results
Sizing sigma is recomputed AFTER today's return is appended, while the trigger sigma is the strictly-prior one — not look-ahead, but it inflates the risk-parity denominator on exactly the shock days the strategy trades, systematically under-sizing its own signal.
Verification Results
Count XNYS sessions between entry_ts and the current bar ts via src/data/market_calendar.
Verification Results
`_session_ts` is in-memory, so after a live/paper restart the time exit counts only post-restart sessions and holds an existing position up to ~2x the pre-registered 3-day horizon. Backtests and replay are unaffected.
Verification Results
Correct implementation, but the measured edge looks absent rather than mis-parameterized. Sandbox: 261 trades, avg_trade_return_pct -0.108% against a USEQ round-trip of only ~0.02-0.05% (zero commissions, $259 total impact) — the GROSS per-trade move of the 3-session fade is itself negative. Win rate 49.8% with avg_loss ($116) > avg_win ($104) says the shock CONTINUES over the next three sessions — the same sign error the COIN overnight-residual abandon found, now on the intraday-made component the hypothesis expected to revert. Regime split is unhelpful: only the stressed tercile is positive (+2.45%) while calm (-0.55%) and normal (-3.70%) lose. Iteration 7 changed ONLY book scale and Sharpe is scale-invariant, so the full backtest should reproduce ~0.03, not improve. First checks at backtest review: per-name breakdown; whether relaxing gap_share_max toward 0.9 flips the sign (which would falsify the news filter directly); the long/short asymmetry (52.9% vs 46.4% win) given unmodeled borrow on the short leg.
Analysis
Backtest gate:
- metrics unreliable: Incoherent: Sharpe 0.03 disagrees in sign with total_return -3.29% — the Sharpe is computed from the mtm_equity_curve series while the return comes from the equity curve. Judge on the equity curve.
Outcome Summary
UseqIntradayLiquidityShockReversalTw-ce5b1ec2ea
Outcome Summary
Across seven iterations this strategy tried to be paid the liquidity-provision premium by fading large single-name daily moves on 12 USEQ large caps, using the overnight-gap share as a free proxy for an earnings calendar so it would skip news-driven (drifting) shocks and only fade flow-driven (reverting) ones. The backtest produced 1,696 trades over a multi-decade sample but essentially no edge: 49.2% win rate, profit factor 0.99, total return -1.01%, Sharpe ~0.0002, and an average per-trade return of 0.038% of notional against modeled impact costs of 197.3% of gross. Iteration 7 explicitly halved risk_per_trade and gross exposure to reconcile the sign disagreement between Sharpe and total return, and the strategy's own notes conceded that sizing is Sharpe-invariant. The pipeline abandoned the run at the backtest stage on unreliable/incoherent metrics, so backtest review, optimization, analyst and risk stages were never reached.
Outcome Summary
Halving book size to make a near-zero-edge equity curve internally coherent does not create edge — a Sharpe of ~0 and a per-trade return an order of magnitude below round-trip costs should end the line rather than trigger another sizing iteration.
Outcome Summary
The run was abandoned at the backtest stage with `backtest_no_trades: metrics unreliable` — the report flagged an incoherent Sharpe (0.00 disagreeing in sign with the -1.01% total return, metrics_reliable=false), so it never reached backtest review, optimization, analyst or risk review.
Outcome Summary
Fade a >=2.5-sigma close-to-close daily move in any of 12 sector-diverse USEQ large caps, long and short, but only when the overnight gap was under 50% of the move (so the shock was intraday flow rather than overnight news), exiting on a 3-day time stop.
Outcome Summary
Over a ~14,271-day multi-decade backtest it took 1,696 trades (783 long / 913 short) with a 49.2% win rate, profit factor 0.99, total return -1.01%, CAGR -2.99%, max drawdown 9.59%, and a Sharpe of essentially zero (0.0002). Average per-trade return was 0.038% of notional, well under the 0.15% viability floor, and modeled impact cost reached 197.3% of gross.
Iteration History
Backtest gate:
- metrics unreliable: Incoherent: Sharpe 0.00 disagrees in sign with total_return -1.01% — the Sharpe is computed from the mtm_equity_curve series while the return comes from the equity curve. Judge on the equity curve.
Backtest and paper results are hypothetical. Trading involves risk of loss.