Strategies
Volatility-Managed QQQ Exposure with Trend Filter — Long-Only Timing of Nasdaq-100 ETF, Scale Exposure Inversely to Realized Volatility While Above the 200-Day Trend, Threshold-Rebalanced (USEQ, Daily Bars, 2-Parameter)
Outcome: Abandoned
QqqVolatilityManagedTrendExposure
Outcome Summary
This iteration-2 strategy managed QQQ exposure by scaling position size inversely to realized volatility while above a rising 200-day trend, having fixed a prior drift-rebalance defect that had made per-trade edge negative. The backtest review approved optimization: per-trade return was now well above the USEQ fee floor, profit factor was strong (5.36) and drawdown modest, though it already underperformed buy-and-hold on a risk-adjusted basis. Optimization exposed the fatal problems — walk-forward overfitting (IS 0.617 vs OOS 0.376), PBO 0.73, a 9-trade holdout, a deflated Sharpe below significance, and a negative information ratio showing no alpha over the benchmark. The analyst abandoned it as an overfit / not-statistically-significant death (not a fee-edge death), noting the strategy is structurally unvalidatable at 57 trades over 27 years and that sibling vol-managed strategies had already failed.
Hypothesis
Implementation
Long-only QQQ (USEQ, daily bars) held while price is above its 200-day SMA, sized inversely to 20-day realized volatility (target_vol/realized_vol, capped at 100% of equity). Entries additionally require the 200-day SMA to be rising over the last 20 sessions. An open position is resized ONLY when the volatility-implied target weight moves more than rebalance_band (50%) in relative terms from the weight last traded — i.e. on a genuine vol-regime change, not on price/equity drift. Exit is a close back below the 200-day SMA.
Verification Results
Verify the base FactoryStrategy invokes the subclass min_bars_required(); the override's larger warm-up requirement is intentional and correct, so no change needed if the base honors it.
min_bars_required(self) overrides/shadows the base framework method (flagged by static analysis). The override deliberately extends the warm-up to cover sma_days + slope_days, which is correct and needed, but confirm the base template actually calls this override to gate signal evaluation rather than relying on its own implementation.
Sandbox underperforms buy-and-hold on a risk-adjusted-vs-benchmark basis (information_ratio -0.42, beta 0.27, alpha 0.034) and the stressed vol tercile is slightly negative (-1.5%, Sharpe -0.04). This is expected for a vol-targeting sleeve whose value is risk-adjusted (lower drawdown, Sharpe 0.91, max DD 12.4%) rather than absolute outperformance. Analyst should judge the full-history backtest on Sharpe/drawdown vs buy-and-hold, not on beating buy-hold total return. Trade count is low (8 round trips in the sandbox window) because entries are gated on the 200-day cross + rising slope; over full 25-year daily QQQ history this should produce enough regime cycles, but sample-size adequacy is worth confirming.
Backtest Review
- Sharpe
- 0.59
- Total return
- 432.34%
- Max drawdown
- 22.48%
- Trades
- 58
- Win rate
- 36.2%
- Profit factor
- 5.36
Iteration-2 fix worked: avg_trade_return_pct is now +4.088% of notional (was -1.67%), far above the USEQ 0.05% fee floor. The drift-rebalance defect that was destroying per-trade edge is resolved by anchoring the resize band to the vol-implied target weight instead of MTM drift.
Decisive, reliable sample: 27 years of QQQ daily bars (1999-2026), 58 discrete position episodes + 131 fills, metrics_reliable=true. Plenty of regime cycles to make 2 hours of optimization meaningful.
Clear gross edge above costs: profit_factor 5.36, positive Sharpe 0.586 (mtm_equity_curve basis, the correct measure), max drawdown 22.5% (< 60%), commissions/impact only 0.43% of gross.
Trades implement the hypothesis: 58 long / 0 short, entries gated on the 200-day cross + rising-slope filter, single-name QQQ weight <= 1.0 (per-trade return is not a leverage/compounding artifact). Mechanism (volatility-managed exposure + trend filter) is well-documented and sound.
Only two free parameters (target_vol_annual, rebalance_band) with structural settings fixed — a clean, low-overfitting search space.
Underperforms buy-and-hold on a risk-adjusted-vs-benchmark basis (information_ratio -0.25, beta 0.28, alpha 0.022, CAGR 6.36%). This is expected for a vol-targeting sleeve whose value is drawdown control, not absolute outperformance, and USEQ PnL excludes QQQ dividends (~1-2%/yr) so absolute return is understated — but it means the promotion Sharpe bar will be hard to clear.
Sharpe 0.586 sits below the promotion tier; the stressed vol tercile is barely positive (Sharpe 0.073). Optimization may lift risk-adjusted return but is unlikely to reach a 1.5-Sharpe promotion.
end_unrealized_pct 39.9 (~9% of the 432% headline) — modest, but the final open position carries some unrealized MTM; judge realized/risk-adjusted metrics at the promotion stage.
Analysis
Iteration-2 fix held: avg_trade_return_pct is now +0.289% of notional (optimized) / +4.09% (default), comfortably above the USEQ 0.05% fee floor. This is NOT a fee-edge death.
Clean, non-fee-fragile mechanics: zero commissions, impact only 0.71% of gross, profit_factor 4.81, low max drawdown 8.56%, sensitivity surface flat with 0 cliff parameters.
The vol-managed-exposure mechanism (Moreira-Muir) is a documented effect and the code correctly implements a long-only, reduce-only, band-rebalanced sleeve above a rising 200-day SMA.
Three UNWAIVABLE hard gates fail: walk-forward is_overfitted=TRUE (avg IS Sharpe 0.617 -> avg OOS 0.376, with one OOS window at 0.0), PBO 0.7328 > 0.5 (selection more likely than not overfitting), and the holdout has only 9 trades (< 10 min).
Statistically not distinguishable from noise: deflated_sharpe 0.851 < 0.95, is_significant=false, Sharpe CI [0.273, 1.014], and it does NOT survive programme-level FDR (BH q=0.10 keeps 4 of 245; candidate_survives=false).
No alpha over the benchmark: information_ratio is NEGATIVE (-0.36 optimized / -0.25 default), beta 0.11-0.28, benchmark_correlation ~0.57 — this is essentially closet-long QQQ beta, not an active edge, and it does not beat buy-and-hold risk-adjusted.
The optimizer's 'best' config drives target_vol_annual to the 0.05 floor, cutting avg_position_pct from 73% to 38% and CAGR from 6.36% to 3.25% — the search says the way to raise Sharpe is to be barely invested, a tell that there is no scalable edge.
Structurally unvalidatable: 57 trades over 27 years; the OOS vault is flagged UNDERPOWERED (~16 expected trades vs 100 needed) — 'no slice of history short enough to leave training data is long enough to validate a strategy this slow.'
Sibling failures confirm the class: QQQ vol-regime long-short abandoned (fee_edge), BTC trend-gated vol-managed long/flat abandoned (overfit x2), majors vol-managed basket abandoned.
Per-trade edge below costs: avg_trade_return_pct -1.666% vs the 0.05% fee floor over 77 trades. Optimization cannot fix this; change the mechanism, holding period or timeframe so the per-trade return clears the floor, or recommend abandoning.
Benjamini-Hochberg at q=0.10 over 245 programme candidates keeps 4. A candidate that does not survive here is not distinguishable from the programme's own noise, however good its individual statistics look.
Outcome Summary
A vol-managed trend overlay on a single index is essentially closet-long beta (negative information ratio) and, at ~57 trades over 27 years, is structurally too slow to validate out-of-sample — cadence and genuine alpha must be checked before pursuing this class.
The analyst abandoned it after optimization: three unwaivable hard gates failed (walk-forward is_overfitted=TRUE with avg IS Sharpe 0.617 collapsing to OOS 0.376, PBO 0.7328 > 0.5, and only 9 holdout trades < 10 min), and it was statistically indistinguishable from noise (deflated Sharpe 0.851 < 0.95, not FDR-significant).
A long-only QQQ sleeve that scales exposure inversely to recent realized volatility while price sits above a rising 200-day SMA, resizing only when the vol-implied target weight changes materially.
Over 27 years of QQQ daily bars (1999-2026) the default config returned 432% (CAGR 6.36%) with Sharpe 0.586, profit factor 5.36, 22.5% max drawdown and 58 trades; the optimized config cut this to Sharpe 0.644, CAGR 3.25% and 57 trades, but information ratio was negative (-0.36) versus buy-and-hold.
Backtest and paper results are hypothetical. Trading involves risk of loss.