Skip to content

View original

BtcSmartMoneyCrowdDivergencePriceConfirmedLS

Hypotheses

BTC Smart-Money vs Crowd Positioning Divergence, Long-Short (Single-Instrument BINANCE USD-M Perp, 4h Bars, Trade WITH Top Traders and AGAINST an Over-Extended Retail Crowd Using the Top/Global Long-Short Account-Ratio Spread — Novel Positioning Signal, Price-Confirmed, 3-Parameter)

Hypotheses

A LONG-SHORT, single-instrument strategy on BTCUSDT.BINANCE (USD-M perp, 4h bars) driven by a POSITIONING signal no deployed strategy uses: the divergence between Binance's top-trader long/short account ratio (larger, better-informed accounts) and the global long/short account ratio (the broad retail crowd). Both series are already collected by the factory's data infrastructure (BinanceFuturesDataCollector → top/global L/S ratios in data/supplementary), which de-risks the data-availability wall that abandoned the liquidation-feed siblings. Thesis (documented 'smart money vs dumb money' effect): when the retail crowd becomes extremely one-sided (global L/S ratio at a positioning extreme) WHILE top traders lean the other way, the crowd is offside and a reversal/normalization follows — so trade WITH the top traders and AGAINST the crowd. Mechanism per 4h bar: compute divergence = z-score of (top_trader_LS_ratio − global_LS_ratio) over a rolling lookback; when top traders are net-long relative to a crowd that is extremely short, go LONG; when top traders are net-short relative to a crowd that is extremely long, go SHORT — each entry additionally confirmed by a price trigger (close reclaiming/breaking a short EMA in the signal direction) so we do not catch a falling knife. This is deliberately a DIFFERENT family from everything dying this session: NOT trend-following (the 209-death single-regime graveyard — it is contrarian-to-crowd and regime-distributed), NOT funding carry (the saturated fee-dying basket family), NOT an N-leg basket (single-instrument, 2 fills/round-trip, sidesteps L12's 2N×10bps fee wall that just killed the ETH/BTC pairs trade at −0.63%/trade), NOT options (no trade-count wall), and NOT COIN-M (the venue-mismatch/margining graveyard). 3 low parameters (divergence lookback, entry z-threshold, exit) keep it overfit-resistant.

Hypotheses

Iteration 3 addresses the Layer-4 verdict with the single actionable lever the QA identified (point 3): the prior bare spread z-score was trading 'spread noise' — a large top-minus-global spread can occur while the crowd is near neutral, which is NOT the 'crowd offside' condition the hypothesis is built on. Rather than loosen further (which the QA explicitly warned dilutes rather than concentrates edge), I implement the full two-part thesis: entries now require BOTH the crowd to be at its OWN positioning extreme (crowd_z on the global L/S ratio) AND the top cohort to lean the opposite way (spread_z), plus the existing soft price knife-guard. This is a targeted quality filter that removes the low-conviction 'top moved, crowd neutral' trades most likely responsible for the sub-fee average. Critically it is not a re-starving change: a crowd short-extreme mechanically depresses global_LS, which raises the (top-global) spread, so the LONG conditions (crowd_z <= -ze, spread_z >= +ze) are self-consistent and co-occur — the joint gate concentrates the signal without collapsing count the way independent ANDed gates would (z_entry lowered to 0.7 to keep both conditions attainable together). Everything that already passed Layers 1-3 is untouched: causal ratio lookup, streaming O(1) z-windows (no per-bar rescans, no timeout risk), exit/stop/hold logic, capital-relative sizing, correct BTCUSDT min-notional (100 USDT, cleared comfortably by the ~$50k position), and leverage left at 1.0 (unused in sizing, avoids leverage_set_but_unused). Only a second streaming z-window (crowd_z) and the tightened entry conditions were added — the smallest change that makes the strategy actually test the smart-money-vs-over-extended-crowd hypothesis instead of spread noise.

Hypotheses

Structurally unmeasurable on the available data — not worth 2 hours of optimization, and not a code defect. The iteration-3 crowd-offside filter is sound and the mechanism is genuinely novel, but Binance's top/global long-short account-ratio feed is short-history: despite 14,628 bars of BTC (2019-2026), every trade falls in 2026 (daily_returns begin 2026-03-27, annual_returns only {2026}, effective_daily_obs 91), so the signal is computable over just ~6 months of one regime. That yields only 49 trades with Sharpe 0.238, bootstrap CI [-0.619, 0.912] straddling zero and PSR 0.547 — no statistical content — and the 3-window walk-forward plus 20% holdout would each contain a handful of trades (all stress windows are null for lack of pre-2026 data), so any optimized Sharpe would be best-of-N noise. This is the same census/positioning-feed data-span wall that abandoned the liquidation-feed siblings, crossed with the L73 single-perp supplementary-gated family. avg_trade_return_pct 0.38% clears fees and DD is low, but on a toy single-regime sample. No parameter change buys the multi-year account-ratio history the feed lacks; recommend factory-gate/manual review if a long account-ratio series becomes available. Failure pattern: data_unavailable/unmeasurable single-regime positioning-feed sample (49 trades, CI straddles zero).

Implementation

Long/short single-instrument BTCUSDT.BINANCE USD-M perp (4H bars) trading the true smart-money-vs-offside-crowd setup. Each bar it computes two rolling z-scores: spread_z = z(top-trader L/S ratio minus global/retail L/S ratio) — is the top cohort leaning opposite the crowd — and crowd_z = z(global L/S ratio) — is the crowd at its own positioning extreme. It goes LONG only when the crowd is extremely SHORT (crowd_z <= -z_entry) while top traders lean relatively long (spread_z >= +z_entry), and SHORT only in the mirror case, each with a soft EMA price knife-guard. Exits when the divergence normalizes (spread_z reverts through z_exit), on a catastrophic stop, or a short max-hold cap. Three tunables (div_lookback, z_entry applied to both z-scores, z_exit); EMA period, confirm band, stop, hold cap and sizing fixed.

Verification Results

CLEAN RESTART 2026-09-04 — this run's verdict history and learning records were removed and it was restarted from verification. Its previous abandonment came from the pipeline, not from the market: the Layer-2 harness mis-bound @staticmethod helpers (fixed), QA issued terminal performance verdicts on an unoptimized smoke test (removed — QA now judges correctness only), and sandbox timeouts came from backtest-slot starvation (fixed). The hypothesis and the strategy code are unchanged. Verify the code on its merits; performance is decided later by the full backtest and the optimizer.

Backtest Review

Genuinely novel positioning signal (top vs global account-ratio divergence) with a sound two-part crowd-offside + top-opposing construction and price knife-guard

Backtest Review

Clean 3-parameter single-instrument build; point-in-time causal feed lookups; low drawdown (6%), no blow-up

Backtest Review

Structurally unmeasurable: the account-ratio feed spans only ~6 months (all trades in 2026), so despite 6 years of bars the effective sample is one recent regime; effective_daily_obs 91

Backtest Review

Only 49 trades; Sharpe 0.238 with CI [-0.619, 0.912] straddling zero, PSR 0.547 — indistinguishable from no-skill

Backtest Review

3-window walk-forward + 20% holdout cannot populate (a few trades per fold); all stress windows null (no pre-2026 data)

Backtest Review

Census/positioning-feed data-span wall (same failure that killed the liquidation-feed siblings); L73 single-perp supplementary-gated directional family

Iteration History

Verification failed (Layer 4 — QA review): - The entry gate fires far too rarely to be measurable. The sandbox produced only 6 trades over 363 days (~6/yr) -- an order of magnitude below the ~100-trade floor needed to distinguish edge from noise (L16). The compound gate requires simultaneously (a) a divergence z-extreme (|z| >= z_entry=1.5), (b) a price-EMA confirmation (close above/below the 10-bar EMA in the signal direction), and (c) the strategy to be flat. This is the identical starvation that killed the BTC taker-flow-exhaustion sibling this session (6 then 26 trades) and the aggressor-imbalance attempts (16 trades). Every metric here is noise-dominated: Sharpe -0.73 with CI [-2.26, +0.87], skew -1.28 / kurtosis 46.5 on 6 samples, and all 6 trades were SHORT (long_trades=0) so the signal did not even exercise both directions. - Insofar as the 6 trades can be read at all, the edge is negative and below fees: avg_trade_return_pct -0.841% (the hypothesis claims a reversal/normalization move that should clear the 0.10% round-trip cost), profit_factor 0.389, win_rate 0.333, avg_loss $1197 vs avg_win $931 (inverted reward/risk), total_return -2.92%. This is a tiny sample so it is not conclusive on its own, but combined with the starvation above it fits the sibling pattern exactly (selective compound gate -> unmeasurable; loosened -> unprofitable), which is the signature of a positioning signal with no exploitable reversal alpha net of costs at these thresholds. - The signal collapses the hypothesis's two-part setup ('crowd at a positioning EXTREME while top traders lean the OTHER way') into a single spread z-score of (top_LS - global_LS). A large spread z can occur without the crowd itself being at an extreme (e.g. top traders moving while the crowd is near neutral). This is a defensible simplification and not a crash, but it is a looser reading of the thesis than 'crowd extreme AND top opposite'.

Iteration History

Verification failed (Layer 4 — QA review): - No edge net of fees. avg_trade_return_pct is +0.023% -- technically positive but an order of magnitude below the 0.15% futures viability floor and below the ~0.10% round-trip taker cost, so it does not clear trading costs. profit_factor 0.843 (<1, a net loser), total_return -1.20%, win_rate 0.476 with avg_loss $695 > avg_win $644, and the outcome is dominated by fat-tail losses (skew -2.05, kurtosis 42.8, largest_loss -$2,633 = 2.6% of notional vs largest_win $1,673). The barely-positive average percentage is noise; the dollar-weighted result loses. Across two iterations the per-trade edge moved from -0.84% (iter 1, 6 trades) to +0.02% (iter 2, 21 trades) as the gate loosened -- rising toward breakeven but never above fees. That trajectory is the signature of a signal with no exploitable reversal alpha net of costs: loosening further to reach measurability will dilute the edge, not concentrate it. - Still below the measurability floor. iter-2 raised trades from 6 to 21 over 363 days (~21/yr), but that remains well under the ~100-trade floor needed to distinguish edge from noise (L16). Sharpe -0.25 with CI [-1.85, +1.50] spans zero widely and skew -2.05 / kurtosis 42.8 show the P&L is carried by a few tail events. 21 trades cannot support any edge conclusion. - The signal is still a bare spread z-score of (top_LS - global_LS), which the iter-2 rationale deliberately did not tighten (to avoid re-starving the gate). As noted last review, a large spread z can occur without the crowd being at its own extreme, so entries are not specifically the 'crowd offside' setup the thesis describes. This is a defensible simplification, not a defect, but it means the strategy may be trading spread noise rather than the intended smart-money-vs-over-extended-crowd condition -- consistent with the absence of a measurable edge.

Iteration History

Verification failed (Layer 4 — QA review): - Trade count is decisively below the measurability floor, and the positive edge rests on too few samples to be credible. total_trades is 16 over 363 days (~16/yr) -- the exact L16 failure the sibling attempts died to (16-trade aggressor/taker cases). Over a realistic multi-year backtest span this reaches only ~50-80 trades, and walk-forward optimization would split that into OOS windows of single-digit trades, making the 3-phase optimization and holdout validation statistically meaningless. The attractive per-trade metrics (avg_trade_return_pct +0.445%, profit_factor 1.47) are computed on 16 trades with Sharpe CI [-1.25, +1.90] straddling zero and skew +2.36 / kurtosis 37.6 -- i.e. the +2.49% total is carried by one or two large wins (largest_win $1,679), not a stable edge. Because this iteration lowered z_entry to 0.7 and added the crowd_z gate to make this specific 363-day window profitable, the positive result is also exposed to in-sample overfitting on a tiny sample. Per L16, a sub-100-trade result cannot distinguish edge from noise no matter how good the point estimates look. - Across three iterations the mechanism has shown an irreducible tension: loose gate -> ~21 trades but no edge (+0.02%/trade, PF 0.84); tight two-part gate -> real edge (+0.445%/trade, PF 1.47) but only 16 trades. This suggests the exploitable signal genuinely lives in a narrow tail of joint crowd-extreme + top-opposite events, which may be too infrequent to support statistical validation regardless of tuning. Flagging so the developer/research lead weighs whether to keep iterating frequency or accept the signal is inherently low-frequency.
Strategy report

Backtest and paper results are hypothetical. Trading involves risk of loss.