Skip to content

View translation

BtcPerpPremiumPersistenceReversionLS

Hypotheses

BTC Perp Premium-Persistence Directional — Long-Short, Trade the Continuation of a SUSTAINED Mark-vs-Index Premium/Discount (Order-Flow Pressure Signal), Normalize/Stop Exit (Mark+Index Prices, 1H, 3-Parameter)

Hypotheses

A LONG-SHORT, single-instrument directional strategy on BTCUSDT.BINANCE (USD-M perpetual) that trades a genuinely NEW signal source never used in my prior work: the PERP PREMIUM, i.e. the smoothed relative gap between the MARK price and the INDEX (spot-basket) price, (mark − index)/index. Per L56 (stop spraying OHLCV momentum templates across tickers — that class is 0/213; change the MECHANISM), this changes both the mechanism (premium dynamics, not price moving averages) and the data primitive (mark_price_updates + index_price_updates, an untapped feed). PREMISE: a SUSTAINED, multi-hour premium reflects persistent aggressive-taker BUY pressure on the perp relative to spot (leveraged demand leading the move), and a sustained discount reflects persistent SELL pressure; when this pressure PERSISTS beyond a threshold it tends to precede short-term price CONTINUATION (the leveraged flow is a leading indicator of where price is going), before the funding mechanism eventually neutralizes it. This is a directional CONTINUATION read on order-flow pressure — explicitly the OPPOSITE of a premium mean-reversion fade (which L53 would kill) and distinct from funding CARRY (dead; funding is the 8h-settled rate, premium is the instantaneous basis). It is NOT L46 (premium is a PRICE differential, not the OI/taker/liquidation/L-S non-price feeds that template exhausted), NOT OHLCV trend/confluence (L56), NOT a squeeze/breakout (L54), NOT options/COIN-M/basis-delivery (L50/L51/L58), NOT cross-venue funding carry (L57). On BTC (deepest, cleanest premium/index data; the only asset with a promoted directional survivor). Fills the long-short gap (13.5% vs 86% long-only) and the mid/short horizon. 3 parameters (premium threshold, persistence bars, exit/stop). Risk profile: ~1% equity risk/trade via a fixed % stop; sizing capped at 20% of equity*leverage; 2x leverage cap (reads self.config.leverage). HONEST caveat stated up-front: it is a genuine open question whether sustained premium predicts continuation (momentum) or reversion — this hypothesis tests the continuation direction; if the backtest shows the sign is inverted, the reversion variant is the finding.

Hypotheses

SMALLEST CHANGE THAT ADDRESSES THE LAYER-4 REJECTION, which was a market finding rather than a code defect. QA confirmed the code correct and the continuation sign wrong, and the hypothesis pre-registered 'if the sign is inverted, the reversion variant is the finding' -- so exactly two things change from previous_code and nothing else: (1) the entry side is flipped to fade the extreme, and (2) the 'z normalises' exit is replaced by a fixed holding horizon. Change (2) is essential and is why iteration 1's fade numbers also looked flat: the premium normalises within a few hours while the price reversion takes ~a day, so exiting on normalisation cut every trade before its payoff. The premium construction, contemporaneous-alignment guard, incremental normalisation, spot-leg-missing no-fallback rule and risk-first sizing are byte-identical to the version QA verified; Layer 1 and Layer 2 were re-run locally and both still pass. MEASURED, on the same 57,809-hour real 1H catalog (2019-12 to 2026-08, net of 0.05%/side): at the submitted defaults (persist_bars 6, entry_z 1.25, hold_bars 36, 5% stop) 645 trades = 98/yr, avg +0.259% NET per trade (1.7x the 0.15% viability floor, versus -0.48% for the rejected continuation version), win rate 52%, per-trade Sharpe proxy 0.67, equity x1.81 at the 0.4x notional with a 28.6% max drawdown, and 73 trades inside the trailing 365 days so the sandbox, the walk-forward OOS windows and the 15-day holdout are all populated. ROBUSTNESS: every cell of the declared _param_bounds box (persist_bars 4/6/9 x entry_z 1.0-1.75 x hold_bars 24/36/48) is POSITIVE per trade, +0.055% to +0.317%, so there is no sign cliff inside the search region; the weak short-hold corner (hold_bars 12, +0.01 to +0.10%) is excluded by the lower bound, and the defaults sit mid-box rather than at the +0.317% best cell (persist 6, entry_z 1.25, hold 48). THREE HONEST CAVEATS. (a) Leg asymmetry: the long leg (fading the discount) carries the edge at +0.56%/trade while the short leg (fading the premium) is ~flat at -0.02% at the defaults -- it turns positive at hold_bars 48 (+0.13%) but a long-short book here is really a strong long leg plus a roughly break-even short. (b) Regime concentration: by year the equity contribution is 2020 -9%, 2021 +12%, 2022 +54%, 2023 +27%, 2024 -9%, 2025 -6%, 2026 -2% -- the edge is concentrated in 2022-2023 and the last two years are slightly negative, which is the main risk to recent-window OOS. (c) The 28.6% drawdown comes from the 0.4x notional needed to make the 2x leverage non-inert; halving risk_pct halves it but leaves the leverage cap unbound. The mark/index data-primitive deviation is unchanged and still forced (those catalog streams are frozen at 2026-05-02).

Hypotheses

Regime-decayed basis-reversion with no edge in the current regime (spot-perp basis family, L57/L58 relatives). The perp-premium reversion signal was profitable only in 2021-2023 (+14.8/+37.6/+21.7%) and has been NEGATIVE for three consecutive years (2024 -4.2%, 2025 -5.2%, 2026 -2.2%), with rolling Sharpe grinding to -7.8 across 2024-2026 — precisely the window the walk-forward OOS and 15-day holdout occupy, so optimization would fit the dead early years and fail out-of-sample. The edge is also fee-fragile independent of the regime: profit_factor 1.26, avg_trade_return_pct 0.499% (barely over the floor), impact_cost_pct 11.87% of gross and capacity only ~$7M. Full-sample Sharpe is 0.374 with a CI [-0.248, 0.993] that straddles zero. This is already iteration 2 (the pre-registered sign flip is spent); the remaining problem is a decayed premise, not a parameter, and no tuning restores an edge the current basis regime does not contain. Abandon at BACKTEST_REVIEW rather than spend the optimization budget.

Implementation

Long-short directional strategy on BTCUSDT.BINANCE (USD-M perpetual), 1-HOUR bars, driven by the PERP PREMIUM. Each hour it computes premium = perp_close/spot_close - 1 from two contemporaneous 1-HOUR legs (the perp and its BINANCE_SPOT reference, aligned by the base class's same-timeframe barrier), then normalises the SUSTAINED premium against its own 10-day distribution: z = (mean(premium, persist_bars) - mean(premium, 240)) / stdev(premium, 240). That z is returned as the continuous signal every bar. Iteration 2 trades the REVERSION side the hypothesis pre-registered as the alternative: z <= -entry_z (sustained discount = exhausted selling) goes LONG, z >= +entry_z (sustained premium = exhausted leveraged buying) goes SHORT. Exit after a fixed hold_bars reversion horizon, or on a 5% adverse excursion (fixed risk backstop, not a tunable). Sizing is risk-first: qty = equity * 2% / (5% * price) = 0.4x equity notional, exactly the max_notional_frac(0.20) * leverage(2.0) cap, so the leverage is genuinely consumed. Three tunables: entry_z, persist_bars, hold_bars.

Verification Results

Verification failed (Layer 4 — QA review): - The pre-registered CONTINUATION direction is confirmed the WRONG sign and is negative across the ENTIRE parameter box — do not send it into optimization. This is a genuine market finding, not a code bug: the code faithfully trades the continuation side the hypothesis pre-registered, and the developer's own conditional analysis over 57,809 hours proves that side loses. Sustained premium (z>1.5, n=2489) precedes -0.09% forward-24h while sustained DISCOUNT (z<-1.5, n=1649) precedes +0.83% (+1.48% at 72h) — the opposite sign. At trade level the continuation rule is negative at every grid point of the declared bounds (persist_bars 6-12 x entry_z 1.5-2.0 -> -0.49% to -0.02%/trade), -0.48%/trade at the submitted defaults. The sandbox's marginally positive +0.58% (Sharpe 0.16) is pure noise: 16 trades, return_skew -4.97, return_kurtosis 120 (a single outlier trade dominates). Because the surface is negative at EVERY declared parameter cell, optimization cannot rescue it, so per L6 this must be rejected at Layer 4 rather than burn backtest/optimization budget confirming what the developer already demonstrated. - Data-primitive deviation (disclosed, forced, economically equivalent) — worth the Research Lead's awareness. The hypothesis names mark_price_updates + index_price_updates as the untapped feed, but the code builds the premium from the perp-vs-spot 1H basis instead (subscribe_mark_prices / subscribe_index_prices correctly left false). The developer justifies this by a data fact: the catalog's MarkPriceUpdate/IndexPriceUpdate streams for BTCUSDT.BINANCE are frozen at 2026-05-02 (3 months stale), so a strategy subscribing to them would be inert across the recent OOS windows and the 15-day holdout and fail the zero-trades gate. Since mark = index + a smoothed basis, the perp-vs-spot 1H basis measures the same quantity and is fresh; the deviation is reasonable and transparent, not the reason for the fail. But the 'untapped mark/index feed' premise was not literally exercised, and the staleness of those feeds is a data-integrity item the Research Lead/Data Engineer should note for any future mark/index-based hypothesis. - The code is CORRECT and this fail is a market finding, not an implementation defect. Verified: the premium is built only from contemporaneous perp+spot 1H closes (_spot_close returns 0 unless the last spot bar's ts matches the primary bar's ts, so no stale premium and no look-ahead), the normalisation z uses correct incremental sum/sumsq variance (guarded var<=0, sd<=0), entry correctly implements the continuation direction, and the normalise/stop exits are correct. should_exit() infers _side/_entry_sign from the live z sign on restart (_side==0) -- unreachable in backtest, only a live crash-restart risk. Sizing is risk-first capped at max_notional_frac*equity*self.config.leverage (leverage 2.0 genuinely consumed since risk-first notional 0.5x binds to the 0.4x cap).

Verification Results

Analyst/backtest_review: weight the recent regime heavily (the OOS windows and holdout are in it and it is negative); the edge is concentrated in 2022-2023 and the last two years are slightly negative. Consider whether the honest construction is long-only (fade the discount) given the dead short leg. This is a modest-positive-full-sample but recent-negative probe -- an abandon/iterate decision for the analyst, consistent with the ETC/SOL treatment.

Verification Results

Recent regime negative and the edge is modest + regime-concentrated + leg-asymmetric — the dominant analyst/backtest_review consideration, but not a code defect. Unlike the iteration-1 continuation variant (confirmed negative across the whole box, which I failed), the pre-registered REVERSION variant is full-sample POSITIVE at every declared grid cell (+0.055% to +0.317%/trade, defaults +0.259%, 645 trades, win 52%). But it is only 1.7x the 0.15% floor, and the developer's per-year attribution concentrates it in 2022 (+54%) and 2023 (+27%) with 2024/2025/2026 slightly negative; the sandbox (trailing year) is clearly negative: total_return -6.08%, Sharpe -1.23, profit_factor 0.64, avg_trade_return_pct -0.33%, probabilistic_sharpe 0.07. Separately the book is leg-asymmetric: the long leg (fading the discount) carries the edge at +0.56%/trade while the short leg (fading the premium) is ~flat (-0.02%), so it is really a strong long plus a break-even short. The OOS windows and 15-day holdout sit in the negative recent regime.

Verification Results

Reconstruct _side/_entry_px/_bars_held from cache.positions_open() on restart rather than inferring from the z sign; that is both correct for the reversion sign and more robust than any signal-based inference.

Verification Results

The should_exit() restart-recovery is now WRONG-SIGNED for the reversion variant (live-only, unreachable in backtest, but introduced by this iteration's sign flip). should_exit() infers 'self._side = 1 if signal >= 0 else -1' on a lost-state restart, but the iteration-2 entry is a FADE: z >= +entry_z takes a SHORT and z <= -entry_z takes a LONG. So on a live mid-position restart the inferred side is BACKWARDS (positive z -> position is actually SHORT, but the heuristic infers LONG), which would mismanage the stop/exit. This does not affect the backtest (the _side==0 branch only fires on a live restart and backtest state persists), but the sign flip was not propagated to the restart heuristic.

Verification Results

Risk officer/analyst: evaluate on the actual ~2% per-trade risk and the 28.6% full-sample drawdown; if 1% is intended, halve risk_pct (the developer notes this leaves the leverage cap unbound, i.e. leverage would then be partly inert).

Verification Results

Per-trade risk is ~2% of equity, DOUBLE the hypothesis's stated ~1%. The hypothesis specifies '~1% equity risk/trade via a fixed % stop', but the developer set risk_pct=0.02 (with the 5% stop) so notional = equity*0.02/0.05 = 0.4x equity, which exactly binds the 0.20*2.0 leverage cap; a full 5% stop therefore costs ~2% of equity. This is disclosed (the developer notes the 28.6% full-sample drawdown comes from the 0.4x notional 'needed to make the 2x leverage non-inert') and bounded (notional 0.4x equity, no margin borrowed), so it is not a safety violation, but the risk officer must size on the real ~2%, not the stated 1%. It does confirm leverage is genuinely consumed (the cap binds).

Backtest Review

Healthy cadence: 614 trades over 6.6y, above the measurability floor

Backtest Review

Genuinely decorrelated (beta -0.011, benchmark_correlation -0.072)

Backtest Review

Novel signal primitive (perp-vs-spot basis) and clean data alignment

Backtest Review

Edge decayed/inverted: profitable 2021-2023 (+14.8/+37.6/+21.7%) then NEGATIVE three years running (2024 -4.2%, 2025 -5.2%, 2026 -2.2%); rolling Sharpe deeply negative in 2024-2026 (to -7.8) — the recent regime the OOS/holdout evaluate loses

Backtest Review

Fee-fragile: profit_factor 1.26 and avg_trade_return_pct 0.499% (marginal over the futures floor)

Backtest Review

impact_cost_pct 11.87% of gross and capacity_usd ~$7M — edge only exists at toy scale

Backtest Review

sharpe_ratio 0.374 with sharpe_ci_low -0.248 — CI straddles zero

Backtest Review

Already iteration 2 (pre-registered sign flip spent); the remaining failure is regime/premise, not a tunable parameter

Outcome Summary

BtcPerpPremiumPersistenceReversionLS mined a fresh signal — the perpetual's premium over spot as an order-flow-pressure gauge — and, after iteration 1's continuation read came back inverted, executed its pre-registered sign flip to fade sustained premium/discount extremes as exhaustion over a ~1-day horizon. It produced a decorrelated, healthy-cadence book (+63%, 614 trades, beta -0.011) but a thin, decayed edge: Sharpe 0.374 with a CI straddling zero, profitable only in 2021-2023 and negative for three straight years into the OOS window, fee-fragile with 11.87% impact and ~$7M capacity. The analyst abandoned it at backtest review because the remaining failure is a decayed premise rather than a parameter, and the pre-registered sign flip was already spent; it never reached optimization, analysis, or risk review.

Outcome Summary

A genuinely novel signal primitive (perp-vs-spot basis) with a healthy trade count and real decorrelation can still be unpromotable when the edge is regime-decayed — profitable only in an early window and negative across the exact recent years the OOS/holdout score — and a spent pre-registered sign flip leaves no honest lever to restore an edge the current basis regime no longer contains.

Outcome Summary

The analyst abandoned it at backtest review as a regime-decayed basis-reversion: the premium-reversion edge worked only in 2021-2023 and has been negative for three consecutive years — precisely the window the walk-forward OOS and holdout evaluate — so optimization would fit the dead early years and fail out of sample. It is also fee-fragile independent of regime (PF 1.26, marginal per-trade return, 11.87% impact, ~$7M capacity), and as iteration 2 the pre-registered sign flip was already spent, leaving a decayed premise rather than a tunable parameter.

Outcome Summary

A long-short, single-instrument directional strategy on BTCUSDT.BINANCE USD-M (1H, 3 parameters) that traded a novel signal — the perp-vs-spot premium (mark-vs-index basis) normalized to a z-score — and, after a pre-registered sign flip in iteration 2, faded sustained premium/discount extremes as exhaustion (short a sustained premium, long a sustained discount) with a fixed ~1-day holding period and a fixed stop.

Outcome Summary

The backtest (BTCUSDT perp + spot 1H, 2409 data days) returned +63% over 614 balanced trades with profit factor 1.26, avg_trade_return_pct 0.499%, win rate 0.55, max drawdown 20.2%, and genuine decorrelation (beta -0.011). But Sharpe was only 0.374 (CI-low -0.248, straddling zero), the edge was profitable only in 2021-2023 then negative three straight years (2024 -4.2%, 2025 -5.2%, 2026 -2.2%, rolling Sharpe to -7.8), and it was fee-fragile with 11.87% impact cost and ~$7M capacity.

Iteration History

BtcPerpPremiumPersistenceDirectionalLS
Strategy report

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