Skip to content

COT Positioning Extremes (H3)

The COT positioning z-scores (cot_asset_mgr_net_z, cot_lev_money_net_z) were built in Phase 2b and never consumed by a strategy. H3 asks whether a positioning extreme carries edge, in the pre-registered primary orientation: leveraged-money crowded long is a contrarian signal — veto new H1 pullback longs when the crowd is already max-long. Code path: cot_pullback in registry.py (H1 pullback + a COT veto gate; no new strategy module).

Pre-registration. The orientation (contrarian veto, not momentum confirmation), the z-window (52 weeks), and the threshold (±2) were fixed before the run. Only Results were filled afterward.

Hypothesis and rule

When leveraged money (the trend-following speculative cohort in the CFTC TFF report) is crowded net-long, the marginal buyer is exhausted and forward returns are worse — so a new long entered into that crowding carries poorly.

Rule. H1 pullback exactly, with its entry gate tightened to trend filter AND not crowded (combined_entry_gate): veto a new long on any day cot_lev_money_net_z ≥ 2. Exits are never gated.

  • Fitted (H1's grid): N ∈ {3,5,7}, M ∈ {3,5}.
  • Fixed priors: 200-day trend filter, 10-bar time stop, z-window 52 weeks, crowding threshold +2.

COT joins with its real publication lag (Tuesday reference → Friday release) through vibe_trader.features, so the veto only sees reports actually published by each bar's close.

Pass bar

The campaign bar: beat both buy-and-hold and the re-fit swing_breakout baseline on OOS Sharpe, on both MES and MNQ, bootstrap 90% CI excluding 0, drawdown no worse than buy-and-hold.

Results

Real-data walk-forward, 2019-05-06 → 2026-07-12 (stitched OOS 2020-12 → 2026-03), US$100k, 1 contract.

MESMNQ
swing_breakout (baseline)−0.07−0.01
buy_and_hold0.550.37
H1 pullback (reference)0.850.86
cot_pullback0.77 (CI [0.27, 1.40])0.88 (CI [0.32, 1.46])

Supporting OOS detail (cot_pullback): MES total return +9.4%, drawdown −2.8%, win rate 69.1%, exposure 28.5%, 68 trades; MNQ +19.7%, −4.8%, 75.0%, 26.0%, 64 trades.

Margin headroom: 1 contract, so peak initial-margin utilization is ~2.8% (MES) / ~4.3% (MNQ) of a US$100k account — see the margin constants.

Reading

cot_pullback clears the bar on both symbols — but the COT signal adds no edge. It beats both benchmarks with CIs excluding 0, so mechanically it passes. Yet against the H1 base it gates (0.85 / 0.86), the crowding veto is negative on MES (0.77) and negligibly positive on MNQ (0.88) — no consistent improvement, both differences within the bootstrap noise.

The mechanism is why: cot_lev_money_net_z ≥ 2 occurs on only 3.2% of MES / 3.8% of MNQ sessions over the span, so the veto fires a handful of times and blocks ~3 of H1's ~70 OOS entries. Those few vetoes happened to remove net winners on MES and net losers on MNQ — a coin flip, not a signal. Like H2 variant 2, the pass is inherited from H1; the COT positioning extreme is not a source of edge on MES/MNQ daily bars.

Caveats

  • Publication-calendar tightening required before any graduation. The feature layer approximates the COT release with a fixed 3-day lag; on holiday weeks publication slips to Monday, a ~1-day look-ahead a few times a year on a 52-week z-score (documented in features.py). Because cot_pullback passes the bar, this must be tightened to the real CFTC publication calendar before the candidate could ever graduate — though, per the reading above, there is no COT edge to graduate here regardless.
  • The pass is H1 carrying a near-inert filter; it would be strictly simpler to ship H1 without the COT gate.
  • Only the primary (contrarian-veto) orientation was tested. A momentum- confirmation orientation was pre-registered as an optional secondary and not run — given the veto's null result, it is deprioritized.