Skip to content
All strategies

Strategies

Daily Cross-Sectional Volume Attention Reversal: Long Lowest-Volume-Z + Short Highest-Volume-Z Across 6 Major Binance Perps

Outcome: Abandoned

BinanceDailyCrossSectionalVolumeAttentionReversalLS

Outcome Summary

This was the fifth strategy in a cross-sectional mean-reversion series on the 6-major Binance basket, betting that low-volume 'neglected' assets outperform high-volume 'FOMO' assets on a 24h re-rank. The code faithfully implemented the hypothesis — 3,205 balanced dollar-neutral trades — but the mechanism proved to be a dead premise, losing money in every year 2020–2026 with Sharpe -1.71, profit factor 0.70, and a -92.7% total return. The reviewer abandoned it before optimization since the anti-edge was consistent rather than noisy, while noting that the symmetric negativity hints the opposite sign (attention momentum) could hold and would be worth testing as the next axis.

Hypothesis

A dollar-neutral, cross-sectional mean-reversion strategy on 6 major Binance USD-M perpetuals (BTC, ETH, SOL, BNB, AVAX, LINK — all confirmed clean OHLCV data) that captures the ATTENTION ANOMALY documented in equity factor research and observable in every crypto cycle. Every 24 hours, the strategy computes each asset's volume z-score relative to its 30-day baseline (today's volume - mean_30d) / std_30d, ranks the 6 assets by this z-score, goes LONG the 2 assets with the LOWEST volume-z (most-neglected,……Show moreShow less

A dollar-neutral, cross-sectional mean-reversion strategy on 6 major Binance USD-M perpetuals (BTC, ETH, SOL, BNB, AVAX, LINK — all confirmed clean OHLCV data) that captures the ATTENTION ANOMALY documented in equity factor research and observable in every crypto cycle. Every 24 hours, the strategy computes each asset's volume z-score relative to its 30-day baseline (today's volume - mean_30d) / std_30d, ranks the 6 assets by this z-score, goes LONG the 2 assets with the LOWEST volume-z (most-neglected, under-attended) and SHORT the 2 assets with the HIGHEST volume-z (FOMO/attention-spiked, typically near local tops or panic peaks). Equal-weighted within each leg, dollar-neutral, hold 24h, re-rank. Middle 2 assets excluded. This is the FIFTH in the cross-sectional series on the same universe — covering five orthogonal signal axes: DailyCrossSectional7DReturnReversal (DIRECTION), DailyCrossSectionalLowVolAnomaly (MAGNITUDE), DailyCrossSectional60DayDrawdownReversal (POSITION VS PEAK), DailyCrossSectionalBTCCorrelationReversal (RELATIONSHIP), and this strategy (ATTENTION). Together they form a complete mean-reversion factor stack on the major-basket. The attention-reversal mechanism: low-volume assets have been forgotten by retail and arbitrageur capital, often trading at depressed levels due to neglect; high-volume assets are crowded with FOMO buyers (at tops) or panic sellers (at bottoms), creating overshoots in both directions. The cross-sectional ranking captures the EXTREMES regardless of direction. Hong-Lim-Stein (2000), Da-Engelberg-Gao (2011) documented this in equities; well-observed in crypto FOMO bull-runs and post-FTX-style attention shocks. Uses ONLY BINANCE USD-M perp DAILY bars — no supplementary data, no spot, no options. Avoids ALL confirmed failure modes. Fills FIVE under-represented buckets: long-short direction (14.5% → toward 45%), multi-instrument scope (8.2% → grow), cross-sectional mechanism class (confirmed winner), portfolio diversifier via 5th orthogonal axis, and OHLCV-only data dependency. Position sizing: 12% per leg × 4 legs = 48% gross exposure, dollar-neutral.

Iteration 3 fixes the Layer-2 synthetic failure: `_zscore_from` (and its sibling `_symbol_of`/`_quantize_qty` helpers) were `@staticmethod`s. The Layer-2 _StrategyProxy rebinds class functions as bound instance methods, which strips the staticmethod descriptor, so `self._zscore_from(base, current)` was passing `self` as a third positional arg into a 2-arg function -> TypeError on every scenario. Converting these three helpers to plain instance methods (adding `self`, dropping `@staticmethod`) makes the bound-call arity correct in both the proxy and real backtest paths. All call sites already used `self.`, so no call-site changes were needed and the previously-passing signal/rebalance/sizing logic is unchanged.

Volume-attention-reversal premise is empirically inverted on the 6-major Binance perp basket: the strategy loses money in EVERY calendar year 2020-2026 (Sharpe -1.71, CI entirely below 0, PF 0.70, -92.7% total return, negative per-trade expectancy). The code correctly implements the hypothesis (balanced 1,572 long / 1,633 short dollar-neutral), so this is not a fixable code or parameter issue — it is a dead premise with consistent anti-edge across all regimes, which no best-of-225 optimization can rescue. NOTE FOR RESEARCH LEAD: the monotone, near-symmetric negativity (not noise) suggests the OPPOSITE effect may hold on crypto majors — attention MOMENTUM (long highest-volume-z, short lowest-volume-z) rather than reversal. If the cross-sectional series is to add a sixth axis, test the inverted-sign variant rather than re-tuning this one; abandoning here loses no validated edge.

Implementation

Dollar-neutral cross-sectional volume-attention reversal on 6 major Binance USD-M perps (BTC, ETH, SOL, BNB, AVAX, LINK), daily bars, pure OHLCV. Each day computes each asset's volume z-score vs its prior 30-day baseline, ranks all 6, goes long the 2 lowest-z (neglected) and short the 2 highest-z (FOMO/panic attention-spiked), equal-weight, ~48% gross / ~0% net, holds 24h, re-ranks.

Verification Results

Verification failed (Layer 2 — synthetic scenarios): Parameters used: ['min_notional', 'rebalance_days', 'leg_capital_pct', 'n_legs_per_side', 'vol_baseline_days'] Check that __init__ sets all attributes from self.parameters.get(). - steady_uptrend: TypeError: BinanceDailyCrossSectionalVolumeAttentionReversalLS._zscore_from() takes 2 positional arguments but 3 were given (bar timestamp: 1735693260000) - steady_downtrend: TypeError: BinanceDailyCrossSectionalVolumeAttentionReversalLS._zscore_from() takes 2……Show moreShow less

Verification failed (Layer 2 — synthetic scenarios): Parameters used: ['min_notional', 'rebalance_days', 'leg_capital_pct', 'n_legs_per_side', 'vol_baseline_days'] Check that __init__ sets all attributes from self.parameters.get(). - steady_uptrend: TypeError: BinanceDailyCrossSectionalVolumeAttentionReversalLS._zscore_from() takes 2 positional arguments but 3 were given (bar timestamp: 1735693260000) - steady_downtrend: TypeError: BinanceDailyCrossSectionalVolumeAttentionReversalLS._zscore_from() takes 2 positional arguments but 3 were given (bar timestamp: 1735693260000) - flat_ranging: TypeError: BinanceDailyCrossSectionalVolumeAttentionReversalLS._zscore_from() takes 2 positional arguments but 3 were given (bar timestamp: 1735693260000) - volatility_spike: TypeError: BinanceDailyCrossSectionalVolumeAttentionReversalLS._zscore_from() takes 2 positional arguments but 3 were given (bar timestamp: 1735693260000) - zero_volume: TypeError: BinanceDailyCrossSectionalVolumeAttentionReversalLS._zscore_from() takes 2 positional arguments but 3 were given (bar timestamp: 1735693260000) - price_gap: TypeError: BinanceDailyCrossSectionalVolumeAttentionReversalLS._zscore_from() takes 2 positional arguments but 3 were given (bar timestamp: 1735693260000)

Backtest Review

Sharpe
-1.71
Total return
-92.72%
Max drawdown
92.72%
Trades
3205
Win rate
47.5%
Profit factor
0.70

Code functions correctly: 3,205 trades, balanced 1,572 long / 1,633 short, dollar-neutral as designed

Trades match the stated mechanism (long lowest-volume-z, short highest-volume-z) — this is not a bug

Consistent anti-edge: Sharpe -1.71 with CI [-2.32, -1.12] entirely below zero

Loses money in EVERY calendar year 2020-2026 (-17% to -68%); no regime works

profit_factor 0.70, negative expectancy (-$29.70/trade), -92.7% total return, 92.7% max drawdown

avg_trade_return is negative — edge is below trading costs and inverted, not marginal

Uniform negativity across all years means optimization has no positive parameter region to tune toward

all 7 years negative

Iteration History

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

Outcome Summary

The volume-attention-reversal premise is empirically inverted on crypto majors — the monotone, near-symmetric losses suggest attention MOMENTUM (long highest-volume-z, short lowest-volume-z) may be the real edge, so a future axis should test the inverted-sign variant rather than re-tune this one.

The backtest reviewer issued an 'abandon' verdict at the pre-optimization gate: the strategy failed every criterion (Sharpe, profit factor, avg trade return, all-years-positive) with uniform negativity across all regimes, so no parameter region existed to optimize toward and it never reached optimization or analyst review.

A dollar-neutral, cross-sectional daily mean-reversion strategy on 6 major Binance USD-M perps (BTC, ETH, SOL, BNB, AVAX, LINK) that ranked assets by 30-day volume z-score and went long the 2 lowest-volume-z (neglected) names while shorting the 2 highest-volume-z (attention-spiked) names, capturing the attention anomaly.

The code worked as designed — 3,205 trades, balanced 1,572 long / 1,633 short and dollar-neutral — but the edge was a consistent anti-edge: Sharpe -1.71 (CI [-2.32, -1.12] entirely below zero), profit factor 0.70, negative expectancy of -$29.70/trade, -92.7% total return and 92.7% max drawdown, losing money in every calendar year from 2020 to 2026.

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