Strategies
ETH OKX 4H Positive-Skew Trend Anomaly (Lemperiere et al. 2014): Vol-Normalised EMA-Distance Trend With a Flat Deadband, Long-Short, Scored on Skew as Well as Return (ETHUSDT.OKX 4H, pure OHLCV, single leg)
Outcome: Abandoned
EthOkxVolNormEmaDistanceTrendLS
Outcome Summary
This hypothesis pre-registered a volatility-normalised EMA-distance trend rule on ETHUSDT.OKX 4H, predicting positive return together with positive skew, a low win rate and a right tail of large winners. The code went through 3 iterations. The last one only changed performance: the EMA and rolling volatility became O(1) running updates, and the trading rules stayed the same. The Layer 3 sandbox backtest still ran past its 300s limit on the ~20k-bar window, and the run was abandoned in the verification loop. No backtest, optimization, analyst or risk review was ever reached, so the pre-registered skew claim remains untested in the pipeline.
Hypothesis
Iteration 3 fixes only the Layer-3 sandbox_timeout, and the trading rules are unchanged. Per-bar work is now strictly O(1). The EMA is a recursive scalar. Sigma comes from running scalar sums of r and r^2 over the vol_window returns: each bar adds the newest return and drops the one leaving the window, both read by index from the bar buffer. That replaces the per-bar numpy rebuild of 101 closes. The state is re-seeded from the buffer only when the timestamp chain breaks, or every 2000 bars to guard against float drift. All state is plain scalars on self, so it survives restarts. Projected per-bar cost is about 10 float ops, independent of the span. Note that the previous code was already O(window) with a bounded buffer, so part of the timeout may have come from host load.
verification_loop: sandbox_timeout: Verification failed (Layer 3 — sandbox backtest): smoke test exceeded the 300s wall-clock limit on a ~20000-bar window (2400 days of ETHUSDT.OKX-4-HOUR-LAST-EXTERNAL). 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).
Implementation
Lemperiere et al. (2014) vol-normalised EMA-distance trend on ETHUSDT.OKX 4H: s=(close-EMA100)/(close*sigma100 of 4H log returns). Long when s>+2, short when s<-2, flat otherwise; exit when s crosses zero. 50% equity notional at 1x.
Verification Results
sandbox_timeout: Verification failed (Layer 3 — sandbox backtest): smoke test exceeded the 300s wall-clock limit on a ~20000-bar window (2400 days of ETHUSDT.OKX-4-HOUR-LAST-EXTERNAL). 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).
Outcome Summary
A simple rule still has to fit the ~20k-bar sandbox budget, so per-bar cost should be designed to stay flat as history grows before the first submission. Iteration 3 rewrote the EMA/volatility state as O(1) running sums, but the rewrite was not confirmed to pass Layer 3 in time.
It was abandoned in a verification loop after 3 iterations. The Layer 3 sandbox smoke test went past the 300s wall-clock limit on a ~20,000-bar (2,400-day) ETHUSDT.OKX 4H window, so backtest review, analyst review and risk review never ran.
A long-short trend rule on ETHUSDT.OKX 4H bars (Lemperiere et al. 2014): it entered when the close's distance from EMA_100, measured in units of 100-bar return volatility, crossed ±2, and exited when that distance crossed zero, with a flat deadband in between. The test was whether the strategy earned positive return with positive trade-return skew.
No pipeline backtest or optimization metrics exist, because the strategy never passed verification. The only numbers are from the hypothesis's own pre-study, done before any code: 259 trades, +2.17% mean net per trade, t = 2.8, skew +2.9, 32% win rate and 7 of 7 years positive. The pipeline never confirmed them.
Analysis
Risk Premia: Asymmetric Tail Risks and Excess Returns
Backtest and paper results are hypothetical. Trading involves risk of loss.