BtcSmartMoneyRetailLsDivergenceLS
Hypotheses
BTC Smart-Money vs Retail Long/Short Account Ratio Divergence Long/Short (Top-Trader vs Global Positioning, Daily, BINANCE USD-M)
Hypotheses
A long/short, single-instrument, single-venue, daily-cadence strategy on BTCUSDT.BINANCE that uses the factory's L/S RATIOS supplementary data — specifically the DIVERGENCE between TOP-TRADER long/short account ratio and GLOBAL long/short account ratio — as the primary signal. STAYS ON RELIABLE BINANCE USD-M DATA PATHS per analyst's hard constraint: 'Until data infrastructure is fixed, hypotheses promising under-represented venues will pivot to Binance USD-M and fail.' BTCUSDT.BINANCE daily bars + Binance L/S ratios are in factory.yaml supplementary_data and collected by BinanceFuturesDataCollector (per data infrastructure docs). Mechanism: TOP TRADERS are large accounts with systematically better information (capital, faster execution, structural alpha). GLOBAL traders are retail-dominated noise. When the top-trader L/S ratio diverges meaningfully from the global L/S ratio in a consistent direction, the divergence itself is the signal — smart money positioned MORE LONG than retail (top_ls / global_ls high) means informed positioning is bullish vs the crowd; conversely smart money MORE SHORT than retail signals bearish. This is the classic INFORMED-VS-UNINFORMED divergence signal (Hong-Stein 1999 'speed-of-information-diffusion' applied to crypto positioning by Cong et al 2021 'Decoding Decentralized Finance: A Theoretical Treatment'). UNTOUCHED MECHANISM CLASS: the only signal in the factory's supplementary_data list NEVER yet used as primary signal across 680 experiments (funding_rates×3, liquidations×1, open_interest×1, taker_ratio×1 all now covered; L/S ratios = 0/680). COMPLEMENTARY to my prior strategies — BtcLiquidationCascadeReversal trades realized forced flow, BtcOiSpikeDirectionalReversal trades pre-liquidation crowded positioning at AGGREGATE level; THIS strategy disaggregates positioning into smart-vs-dumb cohorts which is structurally different from any aggregate signal. ADDRESSES QUOTA GAPS: long_short direction (11.8% → ≥45% target; gap of ~33% — largest active gap); simple BTC daily bars (small Optuna search space, addresses 7-for-7 ADA 4H WF collapse meta-issue). FIVE PARAMETERS ONLY: divergence_percentile_threshold, profit_target_pct, stop_atr_mult, max_hold_days, position_size_risk_pct — radically simpler than failed strategies. AVOIDS EVERY KNOWN FAILURE PATTERN: (a) NO venue-pivot risk (BINANCE USD-M target); (b) NO microstructure tick-data dependency (daily account-ratio snapshots, not order book); (c) NO single-trade-dependency (bounded P&L per trade, ~30-50 trades/year); (d) REGIME-INDEPENDENT (long_short balanced — works in both rallies and selloffs); (e) UNTOUCHED MECHANISM (no prior experiment uses L/S ratios as primary signal).
Hypotheses
Iteration 2 fixes the Layer-2 (synthetic) failure 'BtcSmartMoneyRetailLsDivergenceLS._to_ns() takes 1 positional argument but 2 were given'. Root cause: _to_ns was a @staticmethod but is invoked as self._to_ns(...); the Layer-2 verification proxy rebinds strategy helpers as instance methods and passes self, so the 1-arg staticmethod received 2 args. The minimal fix converts _to_ns from a staticmethod to an instance method (drop @staticmethod, add self); I also converted _at the same way because it is likewise a @staticmethod called as self._at(...) and would raise the identical TypeError on the next layer pass once _to_ns is fixed. Both call sites already use the self. form, so no other change is needed. Every other line -- the L/S-ratio series build, causal lookups, divergence/percentile signal, ATR computation, entry/exit gates, and risk-based sizing -- is byte-identical to the previous iteration, preserving all Layer-1 checks (clean imports, subclass, methods) and the passing signal logic. This is the same recurring synthetic-proxy gotcha where @staticmethod helpers invoked through self break only under verification.
Hypotheses
BTC smart-money-vs-retail L/S-divergence fired only 6 trades in 4,712 bars, all clustered in 2026-04-13 to 2026-05-23 — untestable. Root cause is the same supplementary-data-coverage gap that already sank three OI strategies this session: the divergence signal requires MIN_PCT_SAMPLES (15 daily samples of BOTH top_account_ratio and global_account_ratio) before activating, and only 6 valid entries occurred across six years, all in a recent ~2-month window, meaning the Binance L/S-ratio feeds have no usable historical coverage and _at() returns None for nearly every earlier bar. The hypothesis's claim that L/S ratios are 'reliably-populated per factory.yaml' is contradicted by the result, exactly as the OI hypotheses were. The headline metrics are noise on n=6 (Sharpe 2.85 with sharpe_ci_low -3.36 / ci_high +7.65, the entire record a 30-day window). Not optimize: a 3-phase optimization (walk-forward 3 windows + 15-day holdout) is impossible on 6 trades. Not iterate: the implementation is correct (dual-cohort causal lookups, key-format fallbacks, percentile gating) and the blocker is structural historical coverage of the L/S-ratio feed — a data-engineering backfill task no parameter or code change can fix. FAILURE PATTERN: all Binance positioning-derived supplementary feeds (open_interest, top/global account L/S ratios) currently lack multi-year history (only a recent ~2-month window is populated), so ANY strategy gating on them fires a handful of times in 2026 and zero before — the identical recent-only signature now seen across FOUR strategies this session (OI-surge, OI-spike, OI-percentile, L/S-divergence). These mechanism classes must be shelved until BinanceFuturesDataCollector backfills historical OI and L/S-ratio data; the analyst's reliable-data-path guidance should explicitly exclude open_interest AND the account-ratio feeds for historical strategies, and the Research Lead should stop proposing positioning-data-primary hypotheses until the data engineer confirms multi-year coverage.
Implementation
Long/short single-instrument BTCUSDT.BINANCE daily strategy on the divergence between the top-trader and global long/short account ratios. Each daily bar it reads the most-recent (causal) top-trader and global L/S ratios and computes divergence = top_ls/global_ls - 1; gated by its 30-bar rolling percentile, it goes long when divergence is high-percentile and positive (smart money more long than the crowd) and short when low-percentile and negative. Exits on the earliest of a 3% profit target, a 2x-ATR(14) stop, or a 5-day max hold. Risk-based sizing (2% equity risk over the ATR stop, capped at 1x equity notional). Five tunable parameters. Uses Binance L/S-ratio supplementary data only.
Verification Results
Verification failed (Layer 2 — synthetic scenarios):
Parameters used: ['max_hold_days', 'stop_atr_mult', 'profit_target_pct', 'position_size_risk_pct', 'divergence_percentile_threshold']
Check that __init__ sets all attributes from self.parameters.get().
- steady_uptrend: TypeError: BtcSmartMoneyRetailLsDivergenceLS._to_ns() takes 1 positional argument but 2 were given (bar timestamp: 1735690440000)
- steady_downtrend: TypeError: BtcSmartMoneyRetailLsDivergenceLS._to_ns() takes 1 positional argument but 2 were given (bar timestamp: 1735690440000)
- flat_ranging: TypeError: BtcSmartMoneyRetailLsDivergenceLS._to_ns() takes 1 positional argument but 2 were given (bar timestamp: 1735690440000)
- volatility_spike: TypeError: BtcSmartMoneyRetailLsDivergenceLS._to_ns() takes 1 positional argument but 2 were given (bar timestamp: 1735690440000)
- zero_volume: TypeError: BtcSmartMoneyRetailLsDivergenceLS._to_ns() takes 1 positional argument but 2 were given (bar timestamp: 1735690440000)
- price_gap: TypeError: BtcSmartMoneyRetailLsDivergenceLS._to_ns() takes 1 positional argument but 2 were given (bar timestamp: 1735690440000)
Backtest Review
Clean, correct implementation: dual-cohort causal O(log n) lookups, rolling-percentile gating, sane ATR-risk sizing; genuinely novel signal (smart-vs-retail divergence), 0/680 prior use
Backtest Review
Sound economic thesis (informed-vs-uninformed positioning divergence)
Backtest Review
DECISIVE: only 6 trades in 4,712 bars, all in 2026-04-13 to 2026-05-23 — the top/global L/S-ratio feeds have no historical coverage, so the signal never activates pre-2026
Backtest Review
Headline metrics meaningless on n=6: Sharpe 2.85 with CI -3.36 to +7.65, entire record a 30-day window; cannot support walk-forward + holdout optimization
Backtest Review
FOURTH Binance-positioning-data strategy this session blocked by the identical recent-only coverage gap (OI-surge, OI-spike, OI-percentile all abandoned) — confirms a structural data-engineering blocker
Outcome Summary
BtcSmartMoneyRetailLsDivergenceLS introduced a genuinely novel, economically grounded mechanism — the informed-vs-uninformed divergence between top-trader and global long/short account ratios, the one supplementary feed untouched across 680 experiments — with a clean dual-cohort causal implementation and a percentile gate. But it fired only 6 trades, all in a recent ~6-week window, because the L/S-ratio feeds have no usable historical coverage, leaving the metrics meaningless on n=6. This was the fourth positioning-data strategy of the session blocked by the identical recent-only coverage gap after the three OI hypotheses, confirming a structural blocker. The analyst abandoned it on its second iteration as a data-engineering backfill task no code change can fix, recommending the Research Lead stop proposing positioning-data-primary hypotheses until multi-year coverage is confirmed.
Outcome Summary
All Binance positioning-derived supplementary feeds (open interest and top/global account L/S ratios) currently lack multi-year history — only a recent ~2-month window is populated — so any strategy gating on them fires a handful of times in 2026 and never before; these mechanism classes must be shelved until the data is backfilled, and 'reliable-data-path' guidance should explicitly exclude them for historical strategies.
Outcome Summary
The analyst abandoned it at the backtest-review gate before optimization because of the same supplementary-data-coverage gap that had already sunk three OI strategies this session: the divergence signal needs ≥15 daily samples of both the top and global account-ratio feeds to activate, but those feeds have no usable historical coverage, so the lookup returned nothing before 2026 — a structural data-engineering blocker, not a strategy flaw.
Outcome Summary
A long/short, single-instrument BTCUSDT daily strategy using the divergence between the top-trader and global long/short account ratios as its primary signal — going long when smart money was positioned more long than the retail-dominated crowd (top/global ratio high) and short when more bearish, gated by a rolling percentile so only historically-extreme informed-vs-uninformed dislocations traded, with ATR-based exits and 5 parameters, as the only supplementary feed (L/S ratios) never used as a primary signal across 680 experiments.
Outcome Summary
It was effectively untestable: the signal fired only 6 trades across 4,712 bars, all clustered in a ~6-week window (2026-04-13 to 2026-05-23), making the headline metrics noise on n=6 (Sharpe 2.85 with a CI of -3.36 to +7.65, win rate 66.7%, total return 2.3% over a 30-day record).
Backtest and paper results are hypothetical. Trading involves risk of loss.