Skip to content

View original

AdaFourHourReturnsAutocorrSignFlipLong

Hypotheses

ADA 4H Returns-Autocorrelation Sign-Flip Long (Chop-to-Trend Regime Transition)

Hypotheses

A long-only, single-instrument, single-timeframe strategy on ADAUSDT.BINANCE 4H bars (the most-reliably-fresh bar type per the persistent audit_stale pattern). Implements a NEW MECHANISM CLASS not yet tried in the portfolio: RETURNS-AUTOCORRELATION SIGN-FLIP as the primary regime-transition signal. The mechanism: compute the lag-1 autocorrelation of log returns over the last 30 bars. When this autocorrelation FLIPS from negative (mean-reverting/chop regime) to positive (trending regime) AND the current bar closes bullishly AND price is above the long-term trend filter, enter long. The signal captures the precise moment when the market transitions out of chop and into trend — earlier than any moving-average crossover (which lags by half the SMA period) and structurally distinct from any breakout strategy (which requires price-level breach). Critically distinct from every existing pipeline mechanism on ADA 4H: (a) NOT a Donchian breakout (uses statistical autocorrelation, not channel breach); (b) NOT a volume signal (uses return correlation, not transaction volume); (c) NOT bar-shape geometry (uses return-sequence statistics across 30 bars); (d) NOT a Z-score (uses CORRELATION, not standardized magnitude); (e) NOT channel-width expansion (uses temporal dependence of returns, not range geometry). Mechanism is academically grounded in financial econometrics: positive return autocorrelation indicates trending regimes (LeBaron 1992 'Persistence of the Dow Jones index'; Lo-MacKinlay 1988 variance-ratio tests); applied to crypto by Urquhart 2016 'The inefficiency of Bitcoin' which documents alternating autocorrelation regimes in crypto markets.

Hypotheses

Iteration 2 fix for the Layer-2 TypeError: '_lag1_autocorr() takes 1 positional argument but 2 were given'. Root cause: the helper was a @staticmethod with signature (logrets), but the Layer-2 verifier's strategy proxy invokes it bound to the instance, passing self as an extra positional argument. Fix: converted _lag1_autocorr into a normal instance method (def _lag1_autocorr(self, logrets)), which matches the existing call site self._lag1_autocorr(logrets) under both the verifier proxy and the real engine. Nothing else changed — the autocorrelation math, the sign-flip entry logic, exits, sizing, and imports (numpy only, no banned imports) are byte-identical, so the Layer-1 pass is preserved and the signal/trade behavior for Layer 3 is unchanged.

Hypotheses

The returns-autocorrelation sign-flip premise is falsified on ADA 4H. Over a decisive 149-trade sample the strategy has a genuinely negative edge: profit_factor 0.81 (gross losses exceed gross wins), Sharpe -1.31, sortino -1.94, negative expectancy -$204/trade, alpha -0.039, total_return -27.3%, and losses in 4 of 7 years (probabilistic_sharpe 0.164). The signal is correctly implemented (proper lag-1 autocorrelation, upward zero-crossing, bullish-bar + SMA gating), so this is a mechanism failure, not a code bug: a lag-1 returns-autocorrelation zero-crossing is a noisy high-frequency event that does not mark profitable trend onset, and gating it with a bullish bar + SMA filter produces a late, edgeless momentum entry (avg_win ≈ avg_loss, 45% win rate). This is NOT the iterate-the-sizing case seen in the BTC/ETH/SOL trend-continuation siblings: those had positive PF and alpha distorted by stacking, whereas here profit_factor 0.81 < 1 is a near-leverage-invariant ratio, so the avg_position_pct 137% stacking (same missing flat-check) only amplifies losses — correcting it would reveal a still-losing strategy with no edge to preserve. Heavy fee drag (12.8% of gross) compounds an already-negative gross edge. No parameter region is likely to lift a PF-0.81/negative-alpha signal into a promotable edge, so optimization is not worth the 2 hours — abandon. (Note for the developer family: the missing open-position guard in should_enter recurs across these strategies and should be fixed in any future variant, but it is not the reason for this abandonment.)

Implementation

Long-only chop-to-trend regime-transition strategy on ADAUSDT.BINANCE USD-M perp, 4H bars, pure OHLCV. Each bar computes the lag-1 autocorrelation of log returns over the last 30 bars; enters long on an upward zero-crossing of that autocorrelation (negative->non-negative, chop->trend) confirmed by a bullish bar and price above the 50-bar SMA. Exits when autocorrelation reverts negative, price breaks below the SMA, stop-loss, or a max-hold time stop. Leverage 2.0 (~1.2x equity notional).

Verification Results

Verification failed (Layer 2 — synthetic scenarios): Parameters used: ['ac_window', 'min_notional', 'position_pct', 'trend_period', 'max_hold_bars', 'stop_loss_pct'] Check that __init__ sets all attributes from self.parameters.get(). - steady_uptrend: TypeError: AdaFourHourReturnsAutocorrSignFlipLong._lag1_autocorr() takes 1 positional argument but 2 were given (bar timestamp: 1735692840000) - steady_downtrend: TypeError: AdaFourHourReturnsAutocorrSignFlipLong._lag1_autocorr() takes 1 positional argument but 2 were given (bar timestamp: 1735692840000) - flat_ranging: TypeError: AdaFourHourReturnsAutocorrSignFlipLong._lag1_autocorr() takes 1 positional argument but 2 were given (bar timestamp: 1735692840000) - volatility_spike: TypeError: AdaFourHourReturnsAutocorrSignFlipLong._lag1_autocorr() takes 1 positional argument but 2 were given (bar timestamp: 1735692840000) - zero_volume: TypeError: AdaFourHourReturnsAutocorrSignFlipLong._lag1_autocorr() takes 1 positional argument but 2 were given (bar timestamp: 1735692840000) - price_gap: TypeError: AdaFourHourReturnsAutocorrSignFlipLong._lag1_autocorr() takes 1 positional argument but 2 were given (bar timestamp: 1735692840000)

Backtest Review

Novel, academically-grounded mechanism, correctly implemented: proper lag-1 autocorrelation, upward zero-crossing detection, bullish-bar + SMA gating, non-frozen signal; 149 clean entries.

Backtest Review

Single-instrument simplicity, no data artifacts (metrics_reliable=true, end_unrealized ~3%).

Backtest Review

Genuinely negative edge: profit_factor 0.81, Sharpe -1.31, sortino -1.94, negative expectancy -$204/trade, alpha -0.039, total_return -27.3% over 149 trades — decisive, not noise.

Backtest Review

Negative in 4 of 7 years (2020 -19%, 2021 -6%, 2024 -7%, 2025 -18%); probabilistic_sharpe 0.164.

Backtest Review

PF 0.81 < 1 is largely leverage-invariant, so the signal loses regardless of sizing — fixing the stacking (avg_position_pct 137% vs intended 120%) only reveals a still-losing strategy.

Backtest Review

Heavy fee drag (commission 12.8% of gross) from 4h–2-day churn, deepening an already-negative gross edge.

Backtest Review

The autocorrelation zero-crossing is a noisy high-frequency event; the gated entry is a late, edgeless momentum buy.

Outcome Summary

This strategy introduced a genuinely new mechanism class for the portfolio: entering ADA long the moment 30-bar return autocorrelation flips from negative to positive, reading it as a chop-to-trend transition grounded in financial econometrics. It was correctly implemented over 149 clean entries but had a genuinely negative edge — profit factor 0.81, Sharpe -1.31, expectancy -$204/trade, -27.3% total return, and losses in four of seven years. The analyst abandoned it at the backtest-review gate on its second iteration, distinguishing it from sibling trend-continuation strategies (whose positive PF was merely distorted by a leverage-stacking artifact) because here the sub-1 profit factor is leverage-invariant and the autocorrelation flip is simply a noisy, edgeless entry; it never advanced to optimization or risk review.

Outcome Summary

An academically-grounded, novel signal (returns-autocorrelation regime detection) can be implemented faithfully and still have no edge — a noisy lag-1 autocorrelation flip gated by a bullish bar and SMA yields a late momentum buy whose profit factor below 1 is leverage-invariant, so fixing the sizing artifact would only reveal a still-losing strategy.

Outcome Summary

The backtest-review analyst issued an 'abandon' verdict: the academically-grounded signal was correctly implemented, so the failure is the mechanism — a lag-1 autocorrelation zero-crossing is a noisy high-frequency event that does not mark profitable trend onset, producing a late, edgeless momentum entry whose PF 0.81 (<1, near-leverage-invariant) loses regardless of sizing, so no parameter region or stacking fix could rescue it.

Outcome Summary

A long-only, single-instrument regime-transition strategy on ADAUSDT 4H Binance futures (2.0x leverage) implementing a new mechanism class — entering long when the lag-1 autocorrelation of 30-bar log returns flips from negative (chop) to non-negative (trend), confirmed by a bullish bar and price above a 50-bar SMA, to catch trend onset earlier than a moving-average crossover.

Outcome Summary

Across a decisive 149-trade sample it returned -27.3% with profit factor 0.81, Sharpe -1.31, Sortino -1.94, win rate 45%, expectancy -$204/trade, alpha -0.039 and a 38.4% max drawdown, with average win ≈ average loss, losses in 4 of 7 years, and a 12.8%-of-gross commission drag.
Strategy report

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