Skip to content

View original

EthRetailCrowdPositioningFadeLS

Hypotheses

ETH USD-M Retail Crowd-Positioning Contrarian Fade, Long-Short (Single-Instrument BINANCE Perp, 1h Bars + Multi-Year GLOBAL Long/Short ACCOUNT-Ratio Metrics Feed, Fade the Retail Crowd at Positioning Extremes, 3-Parameter)

Hypotheses

A LONG-SHORT, single-instrument, crypto-native POSITIONING strategy on ETHUSDT.BINANCE (USD-M perp, 1h bars) driven by a genuine NON-PRICE data dependency that no deployed strategy uses: the Binance GLOBAL long/short ACCOUNT ratio (the count of accounts net-long vs net-short — a proxy for RETAIL crowd positioning). CRITICAL data note to avoid the 30-day-API wall that killed the liquidation-cascade siblings: this ratio is sourced from the Binance VISION 'metrics' files (futures/um daily metrics, count_long_short_ratio column), which have MULTI-YEAR history back to ~2020 at 5-minute granularity — NOT the 30-day-limited futures-data API endpoint. The tradeable insight is the well-documented crypto retail-fade: when the retail account crowd is euphorically ONE-SIDED, they are systematically wrong at the extreme and the position gets squeezed out. This is explicitly NOT pure OHLCV (L30 — the account ratio is a separate positioning series), NOT funding (L13/L28 — positioning-of-accounts is distinct from the funding cashflow), NOT taker-VOLUME flow (distinct feed from the SolTakerFlow sibling — this is WHO is positioned, not who is crossing the spread), NOT liquidations (L3), NOT a basket (L12), NOT options (L29), NOT HL (L11). Kept to 3 parameters. Uses a single rolling-percentile gate (not the two-part gate that starved the BtcSmartMoneyCrowd sibling to 16 trades) so it targets 120-250 trades over the ETH history and clears the measurability floor. Fills the under-represented long-short bucket (14.5% vs push).

Hypotheses

ITERATION 2 — smallest change that fixes the reported Layer-3 'No trades produced'. ROOT CAUSE (diagnosed against src/data/collectors/binance_vision_collector.py:1069-1078): the Vision metrics parser maps CSV column 6 (count_long_short_ratio, the GLOBAL account long/short ratio) to the OUTPUT dict key 'long_short_ratio' — NOT 'count_long_short_ratio'. My _parse_ratio looked up 'count_long_short_ratio'/'longShortRatio', which never matched, so ZERO ratio points loaded, self._r_ts.size stayed 0, calculate_signal returned early on every bar, and should_enter never fired (exactly the diagnostic: 0 sides over 8681 bars). FIX: _parse_ratio now reads the correct key 'long_short_ratio' first (keeping the old names as fallbacks), so the global account-ratio series loads and the rolling-percentile entry gate can trigger. This is a one-line field-name correction; imports, structure, signal logic, percentile gate, exits and sizing are all unchanged, so the passing Layer-1/2 checks are preserved. Nothing else about the strategy changed: it remains the single-instrument retail crowd-positioning fade on the multi-year metrics global account ratio (NOT the 30-day API), a single-gate design targeting ~120-250 trades. The taker-VOLUME sibling works only because its fallback key 'taker_long_short_vol_ratio' happens to match column 7's output key; this strategy needed the correct global-account key. VENUE: USD-M futures (long-short + account-ratio metrics only exist on perps). SIZING/LEVERAGE: leverage 2.0 wired into position_size (equity*position_frac*leverage/price), position_frac 0.5 -> ~1x notional, 4% stop caps per-trade risk (single instrument, no compounding blowup). If the account-ratio feed were ever absent the percentile cannot form and the strategy simply does not trade — no price-only fallback (the edge is the positioning fade). ETHUSDT is a deep-history liquid USD-M perp with a multi-year metrics feed, so data is available.

Hypotheses

No deployable, risk-adjusted edge. Despite a +542% headline total_return, the Sharpe is 0.08 with a CI [-0.58, 0.71] straddling zero (PSR 0.60) and profit_factor is 1.10 — the returns are lumpy, high-volatility (kurtosis 64), and marginal. Critically, the strategy is fatally impact-fragile: impact_cost_pct is 30.98% (market impact consumes ~31% of gross PnL) and capacity_usd is only $1.04M, meaning the edge exists only at toy scale and turns negative at any deployable size — a hard promotion blocker regardless of tuning. It is also over-leveraged for a single-instrument fade (avg_position_pct 116.9%, max_drawdown 46% point but CI high 98.3%). The global-account-ratio positioning fade may carry a real directional crowd-fade signal (positive most years, 2022 +197%), but it is drowned in volatility, consumed by impact, deployable only at ~$1M, and this is the same single-name crowd-fade family that already died (BtcSmartMoneyCrowd sibling at 16 trades, SolTakerFlow sibling liquidated). Optimizing pct_window/entry_pct/hold_bars toward lower turnover could reduce impact but cannot create a risk-adjusted edge from a Sharpe-0.08 base or lift a $1M-capacity strategy to deployable scale; the 225-trial optimizer would select noise from a PF-1.10 base and fail the deflated-Sharpe gate. Not worth 2 hours of optimization.

Implementation

Single-instrument long-short contrarian positioning fade on ETHUSDT.BINANCE (USD-M perp, 1h bars). It reads the Binance GLOBAL long/short ACCOUNT ratio (retail crowd positioning) from the multi-year 'metrics' Vision feed, takes the value as-of each 1h bar, and computes its rolling percentile over pct_window bars. When the account ratio is at a high percentile (crowd crowded LONG) it FADES with a SHORT; at a low percentile (crowd crowded SHORT) it goes LONG. Exits on positioning normalization (|percentile-0.5| <= exit_band), the opposite crowd extreme, take-profit, stop, or a time stop. Single rolling-percentile gate. 3 core parameters: pct_window, entry_pct, hold_bars.

Verification Results

Verification failed (Layer 3 — sandbox backtest): No trades produced Bar type used: ETHUSDT.BINANCE-1-HOUR-LAST-EXTERNAL, Bars processed: 8730 Diagnostics: should_enter() returned a side 0 times over 8681 evaluated bars -> your ENTRY CONDITION never triggered. Loosen the entry logic / thresholds. Ensure your strategy produces trades with the given data and parameters.

Verification Results

Analyst should confirm trade count and edge stability across the full multi-year span and both direction buckets.

Verification Results

Sandbox produced 96 trades over 363 days — just under the ~100-trade measurability floor for a single-year slice. The full backtest spans the multi-year metrics history (~2020+), so this extrapolates comfortably above 100 and is not a blocker, but the edge is statistically thin: profit_factor 1.028, Sharpe 0.126 with CI [-1.45, +1.67] straddling zero, max_drawdown 32.8%. This is a performance/robustness concern for the analyst, not a code-correctness defect.

Verification Results

No change required; behavior is correct (no price-only fallback, edge is the positioning fade).

Verification Results

If the metrics feed maps to zero rows (self._r_ts.size == 0), calculate_signal returns 0.0 on every bar and the strategy never trades — the failure mode that killed iteration 1. Iteration 2 corrected the key to 'long_short_ratio', which the Vision parser (binance_vision_collector.py:1066/1076) confirms IS count_long_short_ratio (col 6, the global account ratio). Sandbox now produces trades, so the wiring is verified.

Backtest Review

Uses a genuine multi-year non-price feed (global account long/short ratio from Vision metrics) — no data wall; 555 trades clears the measurability floor its 16-trade sibling failed

Backtest Review

Positive directional returns most years (2022 +197%, 2024 +39%) suggest some real crowd-fade signal

Backtest Review

No risk-adjusted edge: Sharpe 0.08 with CI [-0.58, 0.71] straddling zero, PSR 0.60; profit_factor 1.10 (marginal)

Backtest Review

Impact-fragile: impact_cost_pct 30.98% consumes ~31% of gross PnL; capacity_usd only $1.04M — deployable only at toy scale (hard promotion blocker)

Backtest Review

Over-leveraged single-instrument fade: avg_position_pct 116.9%, max_drawdown 46% point but CI high 98.3%

Backtest Review

Same single-name crowd-fade family that died before (BtcSmartMoneyCrowd 16-trade death, SolTakerFlow liquidation)

Outcome Summary

EthRetailCrowdPositioningFadeLS revived the single-name crowd-fade idea on ETH, using the multi-year Binance global account long/short ratio from Vision metrics files to fade retail positioning extremes, deliberately engineered to avoid both the 30-day API wall that killed the liquidation-cascade siblings and the 16-trade starvation of the BtcSmartMoneyCrowd sibling. It succeeded on those fronts — 555 trades, a genuine non-price feed, and a +542% headline with positive returns most years suggesting a real crowd-fade signal — but that signal was drowned in volatility (Sharpe 0.08, PF 1.10) and fatally impact-fragile: 31% of gross PnL consumed by market impact and just $1.04M capacity, running over-leveraged at 117% notional. The reviewer abandoned it as having no deployable risk-adjusted edge, noting the edge exists only at toy scale and belongs to the same crowd-fade family that had already died, so optimization could reduce turnover but never manufacture a viable, scalable edge from a Sharpe-0.08, $1M-capacity base.

Outcome Summary

Fixing the data-wall and trade-count problems of prior crowd-fade siblings surfaced a real-looking directional signal, but a high headline return with Sharpe ~0.08, ~31% impact cost, and ~$1M capacity is not a deployable edge — market-impact and capacity limits, not just Sharpe, must be cleared, and a signal that only works at toy scale cannot be optimized into viability.

Outcome Summary

It was abandoned at backtest-review (verdict: abandon) for having no deployable risk-adjusted edge — a near-zero Sharpe with CI straddling zero, marginal PF 1.10, and above all fatal impact fragility (impact eats ~31% of gross PnL, capacity only ~$1M) that turns the edge negative at any real size, in the same single-name crowd-fade family that already died (BtcSmartMoneyCrowd, SolTakerFlow).

Outcome Summary

It was a long-short single-instrument contrarian fade on ETHUSDT USD-M perps (1h bars) that used the Binance global long/short account ratio (a retail crowd-positioning proxy, sourced multi-year from Vision 'metrics' files to dodge the 30-day API wall) and, via a single rolling-percentile gate, shorted when the retail crowd was crowded long and went long when it was crowded short.

Outcome Summary

It cleared the measurability floor with 555 trades and a +542.6% headline return (positive most years, e.g. 2022 +197%), but had no risk-adjusted edge: Sharpe 0.08 (CI [-0.58, 0.71] straddling zero), profit factor 1.10, max drawdown 46% (CI high 98%), and was fatally impact-fragile — impact_cost_pct 30.98% and capacity only $1.04M, running over-leveraged at avg_position_pct 116.9%.
Strategy report

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