BnbSpotHighProximityMomentumExitToCash
Hypotheses
BNB Spot 100-Day-High Proximity Momentum with Hard Exit-to-Cash Drawdown Cap (Single-Instrument BNBUSDT.BINANCE_SPOT, Daily Bars, Long-Only, Plain OHLCV, 2-Parameter)
Hypotheses
A LONG-ONLY, SINGLE-INSTRUMENT spot momentum strategy on BINANCE_SPOT BNBUSDT that fills the under-target spot venue (11.8% vs 15%) with an infrastructure-SAFE, measurable, drawdown-controlled design — explicitly built to dodge every death mode in the recent log. It is NOT an options structure (no 90-day chain cap / 300s timeout), NOT a cross-venue basis (no accounting-bug or feed-existence risk, L47), NOT a non-price supplementary gate (L46), NOT a low-turnover structural event edge that dies unmeasurable (the deleveraging/liquidation/informed-positioning family), and critically NOT a long-only structural BASKET that risk-rejects at 52-74% drawdown (L48) — because it holds ONE name and carries a HARD exit-to-cash rule that caps the drawdown the promotion gate cares about. The edge is the well-documented '52-week-high' momentum anomaly (assets trading near their trailing highs continue to outperform, as anchoring makes participants under-react to new-high information) applied to a single liquid major with strong, persistent, ecosystem-driven trends (BNB), which diversifies the BTC/ETH-heavy portfolio. Plain OHLCV, all rolling stats O(1) via a fixed-length deque (no full-history rescan). BNBUSDT.BINANCE_SPOT has multi-year daily history, so trade count (daily regime flips → ~15-30/yr → 100+ over the sample) supports a proper 3-window walk-forward + holdout — unlike the structural edges that produced <50 trades and were abandoned unmeasurable. Only 2 parameters, to resist the dominant overfit death mode.
Hypotheses
Iteration 3 fixes the critical QA block with the smallest change: bar_type is reverted from 4-HOUR to 1-DAY and high_lookback from 120 bars (20 days) to 100 DAILY bars, so config.bar_type and the lookback horizon now exactly match the hypothesis title. The signal logic, sizing, quantization, imports and class structure from previous_code are untouched, so Layers 1-3 stay green. The measurability problem that drove iteration 2's deviation is solved WITHOUT touching the timeframe, by retuning the only two things the hypothesis leaves free (its two declared tunable parameters): narrowing the band from 3%/12% to 1%/2% takes trades from 34 to 64 (3.6/yr to 7.3/yr) and, critically, cuts maxDD from 45.6% to 24.2%. I picked that cell for drawdown, not headline return -- 3%/4% (+3.19%) and 3%/5% (+4.08%) both post a higher average trade and were declined because they carry 33.7% and 45.4% maxDD. QA point 2 is now genuinely fixed rather than disclosed: max_drawdown_pct (0.15, structural, not searched) is a real hard per-trade floor checked before the regime logic and deliberately NOT gated on the proximity reference being measurable. It is a pure tail guard -- it fires zero times on the full sample (the regime exit is already faster; worst trade -10.1%), so it costs nothing measurable, and I explicitly did not tune it into a return contributor. I verified the change by driving real daily bars through the actual class methods: min_bars_required=102, signal continuous and finite (2,973 unique values over 3,091 bars), and 15 entry-signal bars in a 365-day sandbox window versus the 1 trade iteration 1 produced, so Layer 3 is comfortably safe. All seven should_exit polarity cases (regime exit, in-band hold, cap breach, cap just-inside, cap-with-invalid-proximity, no-position) unit-test correct. Two things remain for the Research Lead and Analyst rather than being silently engineered away: (1) the 15-day holdout still has P(0 trades) ~0.74 at 7.3 trades/yr -- inherent to sampling a persistent STATE on daily bars, and unfixable from strategy code without the exact timeframe deviation QA rejected, so it needs a re-scope or a longer holdout; (2) the edge is regime-concentrated -- walk-forward windows measure +0.69% / +10.31% / +0.74% per trade, and the trailing 730-day window is +0.07%, below the 0.25% spot floor, so window 2 carries the full-sample +3.12%.
Hypotheses
Regime-concentrated beta-timing with no alpha over buy-and-hold — not worth 2 hours of optimization. Sharpe is 0.58 with bootstrap CI low 0.0121 (indistinguishable from zero) and information_ratio -1.01 (benchmark_meaningful=true, alpha ~0.024) — the strategy UNDERperforms simply holding BNB. The entire +362% is one regime: 2021 +265% with 2021-02 alone +173% and single-day prints of +52%/+50% (return_skew 8.45, kurtosis 158.9); every other year is small or negative. The developer's own iteration-3 evidence confirms the edge is not durable — trailing-730d is +0.07%/trade (BELOW the 0.25% spot floor), WF windows 1 and 3 barely clear it, and holdout P(0 trades)=0.74 with the recent 2024-2026 window weak, so the last-20% holdout will likely fail. Only 2 band parameters are tunable and they cannot manufacture alpha out of a bull-cycle beta-timing signal; base Sharpe 0.58 is the ceiling and deflation over ~225 trials only lowers it. This is the L49 long-only spot pattern (headline return = crypto bull beta, here proven by negative IR); iterating the bands has already been tried 3x and cannot fix the regime concentration. Failure pattern: no_edge/risk-adjusted long-only spot momentum with negative information ratio and single-regime returns.
Implementation
Long-only spot momentum on BNBUSDT.BINANCE_SPOT, DAILY bars. Each bar it computes proximity to the trailing 100-DAY high (excluding the current bar): proximity = close/trailing_high - 1. It BUYS while price sits within 1% of that high and SELLS to cash when price falls 2% below it, forming a hysteresis band that avoids bar-to-bar flip-flopping. A hard per-trade drawdown cap closes the position to cash if price falls 15% below its own entry price, independent of where the trailing high sits. Long-only on a CASH account: SELL is only ever an exit. Sizing is 95% of equity, no leverage, quantized down to the instrument's size precision.
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
Infrastructure-safe, single-name spot, plain OHLCV, only 2 tunable parameters — dodges the options/cross-venue/supplementary death modes
Backtest Review
64 trades supports a walk-forward; avg_trade_return_pct 3.32% clears the 0.25% spot floor and PF is a healthy 2.21
Backtest Review
Hard exit-to-cash keeps portfolio maxDD to 18% (well under the L48/L19 danger zone), and the premise test is monotone across horizons
Backtest Review
Sharpe only 0.58 with bootstrap CI low 0.0121 — statistically indistinguishable from zero; base Sharpe is the ceiling and deflation only lowers it
Backtest Review
information_ratio -1.01 with benchmark_meaningful=true and alpha ~0.024 — negative alpha vs simply holding BNB; this is beta-timing, not edge
Backtest Review
Entire +362% is one regime: 2021 +265% (2021-02 alone +173%, single days +52%/+50%; skew 8.45, kurtosis 158.9). Every other year is small or negative
Backtest Review
Developer's own data: trailing-730d +0.07%/trade is BELOW the spot floor, WF windows 1&3 barely clear it, and holdout P(0 trades)=0.74 — the recent-period holdout will likely fail
Backtest Review
2 band parameters cannot fix a regime-concentrated edge; optimization would curve-fit the 2021 window and fail deflation/holdout
Iteration History
Verification failed (Layer 4 — QA review):
- TRADE COUNT TOO LOW TO BE VALIDATED BY THE PIPELINE — the 15-day holdout will contain ~ZERO trades, a hard-gate failure. The developer honestly measures ~3.6 trades/year (31 trades over 8.7 years at defaults, 29-47 across the sensible region), with median 11-day holds and only ~4 entries/year, because 'near the trailing high' is a persistent STATE, not a frequent event. Consequences for the 3-phase optimizer: each walk-forward window sees ~10 trades (so OOS Sharpe rests on ~3 trades — noise), and the 15-day holdout most likely sees 0 trades. A zero-trade holdout cannot clear the holdout gate (>=70% of WF OOS Sharpe) and trips the hard zero-trades/failed-holdout gate. The sandbox already demonstrates the sparsity: 1 trade in 363 days (a -9.47% loser). This is exactly the sub-~100-trade unmeasurability that has burned iterations before (L16), and the hypothesis's own headline claim ('100+ trades over the sample... supports a proper 3-window walk-forward + holdout') is contradicted by the implementation's measured ~31. Advancing this spends a full backtest + 3-phase optimization to arrive at a guaranteed hard-gate failure.
- DRAWDOWN IS REDUCED, NOT 'HARD-CAPPED' — the hypothesis's title/description overstate it. Developer measures 45.6% maxDD at defaults (37-47% in the tight-exit region) vs 80% buy-and-hold. That is real risk reduction and 45.6% is below the 52-74% band that has drawn risk rejections, but the exit-to-cash rule is a regime exit, not a drawdown cap, and the design carries no explicit per-trade or peak-giveback stop. The developer correctly documents that the naive 'giveback from peak' trailing-stop reading measures 50-82% maxDD (re-entering into each leg down) and shipped the better regime-exit formulation instead. Informational for the Risk Officer; not a code defect.
Iteration History
Verification failed (Layer 4 — QA review):
- TIMEFRAME + LOOKBACK DEVIATION FROM THE STATED HYPOTHESIS. The hypothesis title and description explicitly specify DAILY bars and a 100-DAY trailing high ('100-Day-High Proximity Momentum ... Daily Bars'), and the researcher's own trade-count justification is built on daily sampling. The shipped config is BNBUSDT.BINANCE_SPOT-4-HOUR-LAST-EXTERNAL with high_lookback=120 bars = a 20-DAY trailing high. Per the QA checklist, the stated timeframe MUST equal config.bar_type; daily vs 4-HOUR is a critical mismatch, and the lookback horizon differs 5x. The developer is transparent that this is 'not the identical claim,' and the per-trade edge collapses from +13.52% to +0.71% as a consequence. Instrument, direction, and the trailing-high-proximity mechanic are all faithful, but the two features that DEFINE the hypothesis (daily / 100-day) were changed. Correct resolution is a Research Lead re-scope, not silent QA acceptance.
- The 'HARD drawdown cap' the hypothesis sells as its differentiation from the L48 basket death-mode is not implemented as a hard cap — the exit-to-cash is a REGIME exit (2% below the trailing high). Exit-to-cash IS present and limits sustained-decline participation, but 26.5% maxDD is a measured outcome, not a guaranteed ceiling, and could be exceeded OOS. The developer flagged this correctly; Risk Officer must not read the title as a guarantee.
- Thin, regime-dependent edge. Full-sample +0.71%/trade passes the floor, but the developer's own trailing-365-day measurement is +0.19% (below the 0.25% spot floor) and sandbox Sharpe 0.14 with CI straddling zero. Analyst concern, not a QA block.
Iteration History
Verification failed (Layer 4 — QA review):
- STRUCTURALLY UNMEASURABLE — the 15-day holdout is empty by construction and total trade count is below the measurability floor. This is not a code flaw (the code is now correct and hypothesis-faithful); it is a hypothesis-design flaw that will burn a full 3-phase optimization for a near-certain hard-gate failure. The developer's own full-sample numbers: ~64 trades over ~9 years = 7.3/yr, P(0 trades in a 15-day holdout) ~= 0.74. The Phase-3 holdout tests the final 15 days ONCE and zero-trades is a HARD gate, so a ~74%-empty holdout means near-certain failure after the expensive walk-forward completes. The sandbox already shows it: total_trades=1, metrics_reliable=false. 64 trades is also below the ~100-trade floor at which edge separates from noise. The hypothesis's own premise ('~15-30/yr -> 100+') is false by ~2-4x; this is the same measurability block that stopped iteration 1, only half-resolved.
- Regime-concentrated, recently sub-fee. Full-sample +3.12%/trade is carried by walk-forward window 2 (+10.31%); windows 1/3 are +0.69%/+0.74% (barely above the 0.25% spot floor) and trailing-730d is +0.07% — BELOW the fee floor. If the holdout lands in a non-trending regime it will be both empty AND, if populated, likely sub-fee.
Backtest and paper results are hypothetical. Trading involves risk of loss.