HighProximityMomentumDollarNeutralBasketDaily
Hypotheses
Binance USD-M 52-Week-High Proximity Momentum Dollar-Neutral Basket (Established Majors, Nearness-to-High Rank, No-Leverage Capped Sizing, Weekly Rebalance, Long-Short)
Hypotheses
A dollar-neutral, daily cross-sectional momentum basket across ~10 established, confirmed-full-history Binance USD-M majors (BTC, ETH, SOL, BNB, XRP, DOGE, ADA, LTC, LINK, BCH) using the 52-WEEK-HIGH PROXIMITY signal (George & Hwang) rather than trailing-return momentum. Each asset is scored by how close its current price trades to its trailing ~1-year high (proximity = close / trailing-252-day high, near 1.0 = at its high); the basket goes LONG the majors nearest their highs and SHORT those furthest below, in equal dollar notional. This is a documented STANDALONE momentum anomaly that is empirically only partially correlated with return-based momentum — assets near their highs continue to outperform (anchoring/under-reaction to good news) — so it is a genuinely distinct signal from the factory's promoted return-based trend basket, the cross-sectional RETURN-rank basket (mine, pending), and the Donchian BREAKOUT (continuous proximity state vs a break event). It stays strictly inside the only validated edge family (DAILY momentum on established majors — intraday/short-only/MR/long-horizon variants all refuted), uses pure majors' daily OHLCV (data-safe — broad-alt/HL baskets die on data), and is engineered to dodge BOTH recurring failure modes: (1) a single FROZEN parameter (the high window) so the walk-forward optimizer has nothing to over-concentrate on (the overfit-collapse fix), and (2) NO vol-targeting leverage scalar and NO uncapped inverse-vol weights — equal-ish capped sizing with gross hard-capped at 1.0× (the leverage-explosion fix). Market-neutral construction improves the 87%-long skew; weekly rebalance keeps fees trivial.
Hypotheses
Iteration 4 fix for the Layer-2 failure: `self._bar_ts(bar)` raised `TypeError: _bar_ts() takes 1 positional argument but 2 were given` because the Layer-2 synthetic proxy exposes a `_bar_ts` with a different signature than the live base. Smallest change: added a local static `_ts_of(bar)` that reads `bar.ts_event`/`bar.ts_init` directly and swapped the single call site. All Layer-1-passing structure, imports, and signal/rebalance logic are unchanged, so no earlier layer regresses. Implements the George & Hwang 52-week-high proximity anomaly as a distinct daily momentum signal with a single frozen edge parameter (high_window) and no vol-targeting/inverse-vol leverage, directly addressing both prior recurring failure modes.
Hypotheses
Net-losing dollar-neutral 52-week-high-proximity basket with a catastrophic drawdown — not worth 2 hours of optimization. Over 252 trades: total_return -68.84%, CAGR -17.0%, profit_factor 0.775, expectancy -$263.55/trade, avg_trade_return_pct -2.22% (negative), Sharpe -0.108 (CI [-0.85, 0.70] straddling zero), PSR 0.40, and max_drawdown 83.6% (CI to 98.7%) — well past the L19 hard-abandon line, with the normal-vol regime at -73%. It loses in 4 of 7 years (2021 -67.4%, 2024 -23.2%, 2025 -18.8%), so the George-Hwang 52-week-high anomaly did not transfer to crypto majors. The result is also outlier-driven and the neutrality/leverage controls did not hold as designed: return_kurtosis 137, a -67.77% single-day return on 2021-04-19, and exposure_pct 605.88% despite the stated dollar-neutral gross-1.0x cap. This is the L45/L52 market-neutral cross-sectional basket class (0/84 multi_instrument); benchmark_meaningful is correctly false and the absolute risk-adjusted metrics are all negative. With a single frozen high_window the optimizer has essentially nothing to tune, and no tuning repairs an 84% drawdown or a negative per-trade edge. Failure pattern: no_edge/risk_reject market-neutral cross-sectional momentum basket with >50% DD.
Implementation
Dollar-neutral cross-sectional 52-week-high proximity momentum basket across ~10 established Binance USD-M majors on daily bars. Each asset is scored by proximity = close / trailing-252-day high; on a weekly cadence the basket goes long the top_k names nearest their highs and short the bottom_k furthest below in equal dollar notional, gross hard-capped at 1.0x equity (unlevered). Rebalance uses delta (target minus current signed qty) orders through the netting OMS.
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 distinct, documented signal (George-Hwang 52-week-high proximity) with a clean single-parameter, low-turnover construction (commission only 1.1% of gross)
Backtest Review
Net loser: total_return -68.84%, CAGR -17.0%, profit_factor 0.775, expectancy -$263.55/trade, avg_trade_return_pct -2.22% (negative)
Backtest Review
max_drawdown 83.6% (CI to 98.7%) — past the 50% hard-abandon line (L19); normal-regime bucket -73%
Backtest Review
No significant edge: Sharpe -0.108 (CI [-0.85, 0.70] straddling zero), PSR 0.40; loses in 4 of 7 years, dominated by 2021 -67.4%
Backtest Review
Exposure/sizing not as designed: exposure_pct 605.88% and a -67.77% single-day return (2021-04-19) for a claimed dollar-neutral gross-1.0x book; kurtosis 137, skew -2.7 — outlier-driven
Backtest Review
L45/L52 market-neutral cross-sectional basket class (0/84); single frozen parameter leaves the optimizer nothing to tune
Iteration History
Verification failed (Layer 2 — synthetic scenarios):
Parameters used: ['top_k', 'assets', 'high_window', 'min_notional', 'qty_precision', 'gross_cap_frac', 'rebalance_days', 'default_qty_precision']
Check that __init__ sets all attributes from self.parameters.get().
- steady_uptrend: TypeError: HighProximityMomentumDollarNeutralBasketDaily._bar_ts() takes 1 positional argument but 2 were given (bar timestamp: 1735704780000)
- steady_downtrend: TypeError: HighProximityMomentumDollarNeutralBasketDaily._bar_ts() takes 1 positional argument but 2 were given (bar timestamp: 1735704780000)
- flat_ranging: TypeError: HighProximityMomentumDollarNeutralBasketDaily._bar_ts() takes 1 positional argument but 2 were given (bar timestamp: 1735704780000)
- volatility_spike: TypeError: HighProximityMomentumDollarNeutralBasketDaily._bar_ts() takes 1 positional argument but 2 were given (bar timestamp: 1735704780000)
- zero_volume: TypeError: HighProximityMomentumDollarNeutralBasketDaily._bar_ts() takes 1 positional argument but 2 were given (bar timestamp: 1735704780000)
- price_gap: TypeError: HighProximityMomentumDollarNeutralBasketDaily._bar_ts() takes 1 positional argument but 2 were given (bar timestamp: 1735704780000)
Iteration History
Verification failed (Layer 2 — synthetic scenarios):
Parameters used: ['top_k', 'assets', 'high_window', 'min_notional', 'qty_precision', 'gross_cap_frac', 'rebalance_days', 'default_qty_precision']
Check that __init__ sets all attributes from self.parameters.get().
- steady_uptrend: TypeError: FactoryStrategy._bar_ts() takes 1 positional argument but 2 were given (bar timestamp: 1735704780000)
- steady_downtrend: TypeError: FactoryStrategy._bar_ts() takes 1 positional argument but 2 were given (bar timestamp: 1735704780000)
- flat_ranging: TypeError: FactoryStrategy._bar_ts() takes 1 positional argument but 2 were given (bar timestamp: 1735704780000)
- volatility_spike: TypeError: FactoryStrategy._bar_ts() takes 1 positional argument but 2 were given (bar timestamp: 1735704780000)
- zero_volume: TypeError: FactoryStrategy._bar_ts() takes 1 positional argument but 2 were given (bar timestamp: 1735704780000)
- price_gap: TypeError: FactoryStrategy._bar_ts() takes 1 positional argument but 2 were given (bar timestamp: 1735704780000)
Iteration History
Verification failed (Layer 2 — synthetic scenarios):
Parameters used: ['top_k', 'assets', 'high_window', 'min_notional', 'qty_precision', 'gross_cap_frac', 'rebalance_days', 'default_qty_precision']
Check that __init__ sets all attributes from self.parameters.get().
- steady_uptrend: TypeError: HighProximityMomentumDollarNeutralBasketDaily._ts_of() takes 1 positional argument but 2 were given (bar timestamp: 1735704780000)
- steady_downtrend: TypeError: HighProximityMomentumDollarNeutralBasketDaily._ts_of() takes 1 positional argument but 2 were given (bar timestamp: 1735704780000)
- flat_ranging: TypeError: HighProximityMomentumDollarNeutralBasketDaily._ts_of() takes 1 positional argument but 2 were given (bar timestamp: 1735704780000)
- volatility_spike: TypeError: HighProximityMomentumDollarNeutralBasketDaily._ts_of() takes 1 positional argument but 2 were given (bar timestamp: 1735704780000)
- zero_volume: TypeError: HighProximityMomentumDollarNeutralBasketDaily._ts_of() takes 1 positional argument but 2 were given (bar timestamp: 1735704780000)
- price_gap: TypeError: HighProximityMomentumDollarNeutralBasketDaily._ts_of() takes 1 positional argument but 2 were given (bar timestamp: 1735704780000)
Backtest and paper results are hypothetical. Trading involves risk of loss.