Skip to content

View translation

DiversifiedImpulseBarContinuationPortfolioLS1H

Hypotheses

Diversified Intraday Impulse-Bar Continuation Portfolio Across Majors (Long-Short, Binance USD-M, 1H, Event-Driven Discrete Entries, Per-Position + Gross Caps, Fee-Clearing ATR Targets)

Hypotheses

A LONG-SHORT, MULTI-INSTRUMENT intraday CONTINUATION strategy that runs the factory's EXPLICITLY-SANCTIONED, generalizing impulse-bar-continuation signal as a DIVERSIFIED PORTFOLIO across ~10 deep-history Binance USD-M majors (BTC, ETH, SOL, BNB, XRP, ADA, DOGE, AVAX, LINK, LTC) on 1-HOUR bars. Each asset is monitored independently; when any asset prints an abnormally large, high-volume directional thrust (impulse bar), the strategy opens a discrete position in the thrust direction to capture the short-horizon continuation that follows. This is the analyst-endorsed novelty lane (the impulse-continuation family is repeatedly flagged as 'generalizing'; single-asset ETH-1H, SOL-1H, and BTC-1H-HL instances exist), generalized to a PORTFOLIO specifically to cure the two failure modes that killed nearly every recent abandon: (1) LOW BREADTH / single-event concentration (the 3-name HL book hit 68% DD as leveraged beta; single-name breakouts were 2021-concentrated) — fixed because impulse events fire at different times on different, imperfectly-correlated names, diversifying the TRADE STREAM rather than stacking correlated directional beta; and (2) TRADE-SPARSITY (the 26-trade CoinM Donchian could not populate the walk-forward; OOS windows went empty) — fixed because ~10 names × frequent 1H impulses produce hundreds of trades/year, densely populating every walk-forward/holdout window. It is NOT a banned momentum-basket refinement (different signal class: discrete intraday thrust-continuation, not SMA/trailing-return trend state), NOT single-asset TSM (dead), NOT a slow breakout (regime-broken), NOT reversion (dead), NOT options/spot (blocked). Engine-safe by construction: discrete enter-once/exit-once event entries, one position per asset max, per-position notional cap + a portfolio GROSS exposure cap — never continuous vol-scaling/netting-flips (the construction that caused the notional-inflation artifact). Geometry is wide-target/tight-stop (TP >= SL) to avoid the flush-bounce reward:risk trap. Three core parameters.

Hypotheses

Iteration 4 fixes the Layer-3 300s smoke-test timeout WITHOUT changing any trade logic. The previous version recomputed ATR, average volume, and thrust from bar-list slices (with numpy array allocation and many .as_double() FFI calls) for all 10 instruments on EVERY bar — a heavy per-bar constant multiplied across ~hundreds of thousands of 1H bars over deep history. The hot path is now O(1) per bar: rolling TR and volume SUMS are maintained incrementally in bounded deques, updated exactly once per new bar per asset in _roll_update (deduped by timestamp), and management reads _atr_of/_avg_vol_of/_thrust_of directly from those running sums. numpy is removed from the hot path (pure-Python math). The primary asset's RETURNED signal keeps its exact prior bars-based computation (_thrust_direct) so the continuous, varying signal that already passed Layers 1-2 is byte-identical in behavior; the ungated _touch update also keeps the signal live in the Layer-2 proxy where order_factory/cache are absent. Rolling ATR == mean of the same TRs and rolling avg-vol == mean of the same volumes, so entries/exits and trade production are unchanged — only the per-bar cost drops from O(window x instruments) to O(instruments) with a much smaller constant.

Hypotheses

Diversified intraday impulse-continuation portfolio is a decisive net loser with an edge below trading costs — not worth 2 hours of optimization. Over 13,644 trades: total_return -95.05%, CAGR -45.6%, max_drawdown 96.24% (CI to 100%, past the L19 hard-abandon line, calm-regime bucket -100%), profit_factor 0.87, expectancy -$7.20/trade, avg_trade_return_pct 0.045% (below the 0.15% Binance USD-M fee floor, L22, with commissions 12.4% of gross). Sharpe is -0.088 (CI [-1.02, 0.61] straddling zero), PSR 0.41, and it loses in 6 of 7 years (only 2022 positive). The portfolio design DID cure the two failure modes it targeted — trade-sparsity (hundreds of trades/yr) and single-event concentration, with engine-safe discrete entries and no liquidation — but diversification did not tame the tail (kurtosis 246, monthly swings of +365%/-78%/-50%, 37 consecutive losses) and, critically, did not create a positive net per-trade edge. This is the L30/L63 pure-OHLCV directional continuation class (0-survivor); generalizing the single-name impulse signal to 10 names raised the trade count but the per-trade edge remains below fees. No tuning of impulse/stop/tp multipliers lifts a 0.045% per-trade edge above the fee floor or repairs a 96% drawdown. Failure pattern: fee_edge/no_edge multi-instrument OHLCV continuation with >50% DD.

Implementation

Long-short intraday impulse-bar continuation run as a diversified portfolio across 10 deep-history Binance USD-M majors on 1H bars. Each asset is monitored independently; a high-volume directional thrust (|body|/ATR >= impulse_atr_mult AND volume >= vol_mult x average) opens one discrete position in the thrust direction, exited on a tight ATR stop, a wider ATR target, or a max-hold backstop. Per-position notional cap plus a portfolio gross-exposure cap; one position per asset max.

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 fixed the trade-sparsity and single-event-concentration problems: 13,644 trades across 10 names densely populate every window, with engine-safe discrete entries and per-position/gross caps (no notional-inflation artifact, no liquidation)

Backtest Review

Net loser: total_return -95.05%, CAGR -45.6%, max_drawdown 96.24% (CI to 100%) — past the 50% hard-abandon line (L19)

Backtest Review

Edge below fees: avg_trade_return_pct 0.045% (below the 0.15% fee floor, L22), profit_factor 0.87, expectancy -$7.20/trade, commission 12.4% of gross

Backtest Review

No significant risk-adjusted edge: Sharpe -0.088 (CI [-1.02, 0.61] straddling zero), PSR 0.41; loses in 6 of 7 years (only 2022 positive)

Backtest Review

Diversification did not tame the tail: kurtosis 246, monthly swings +365%/-78%/-50%, 37 consecutive losses — outlier-dominated, not a smooth edge

Backtest Review

L30/L63 pure-OHLCV directional continuation class (0-survivor); portfolio generalization raised trade count but not the per-trade edge

Iteration History

Verification failed (Layer 2 — synthetic scenarios): Parameters used: ['assets', 'vol_mult', 'atr_period', 'vol_window', 'tp_atr_mult', 'min_notional', 'max_hold_bars', 'qty_precision', 'stop_atr_mult', 'gross_cap_frac', 'impulse_atr_mult', 'per_position_frac', 'default_qty_precision'] Check that __init__ sets all attributes from self.parameters.get(). - steady_uptrend: TypeError: super(type, obj): obj must be an instance or subtype of type (bar timestamp: 1735689600000) - steady_downtrend: TypeError: super(type, obj): obj must be an instance or subtype of type (bar timestamp: 1735689600000) - flat_ranging: TypeError: super(type, obj): obj must be an instance or subtype of type (bar timestamp: 1735689600000) - volatility_spike: TypeError: super(type, obj): obj must be an instance or subtype of type (bar timestamp: 1735689600000) - zero_volume: TypeError: super(type, obj): obj must be an instance or subtype of type (bar timestamp: 1735689600000) - price_gap: TypeError: super(type, obj): obj must be an instance or subtype of type (bar timestamp: 1735689600000)

Iteration History

Verification failed (Layer 3 — sandbox backtest): smoke test exceeded the 300s wall-clock limit. This almost always means per-bar work that scales with history — e.g. rescanning the full funding/supplementary series, or rebuilding a list and calling min()/sorted() inside calculate_signal()/on_bar() on every bar. Precompute sorted timestamp arrays ONCE in __init__ and use bisect, or cache lookups keyed by timestamp, so per-bar cost is O(log n) not O(n).

Iteration History

Verification failed (Layer 2 — synthetic scenarios): Parameters used: ['assets', 'vol_mult', 'atr_period', 'vol_window', 'tp_atr_mult', 'min_notional', 'max_hold_bars', 'qty_precision', 'stop_atr_mult', 'gross_cap_frac', 'impulse_atr_mult', 'per_position_frac', 'default_qty_precision'] Check that __init__ sets all attributes from self.parameters.get(). - steady_uptrend: TypeError: DiversifiedImpulseBarContinuationPortfolioLS1H._bar_ts() takes 1 positional argument but 2 were given (bar timestamp: 1735689600000) - steady_downtrend: TypeError: DiversifiedImpulseBarContinuationPortfolioLS1H._bar_ts() takes 1 positional argument but 2 were given (bar timestamp: 1735689600000) - flat_ranging: TypeError: DiversifiedImpulseBarContinuationPortfolioLS1H._bar_ts() takes 1 positional argument but 2 were given (bar timestamp: 1735689600000) - volatility_spike: TypeError: DiversifiedImpulseBarContinuationPortfolioLS1H._bar_ts() takes 1 positional argument but 2 were given (bar timestamp: 1735689600000) - zero_volume: TypeError: DiversifiedImpulseBarContinuationPortfolioLS1H._bar_ts() takes 1 positional argument but 2 were given (bar timestamp: 1735689600000) - price_gap: TypeError: DiversifiedImpulseBarContinuationPortfolioLS1H._bar_ts() takes 1 positional argument but 2 were given (bar timestamp: 1735689600000)
Strategy report

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