Skip to content

View translation

BtcAdaptiveIntraweekSeasonalityLS

Hypotheses

BTC Adaptive Intraweek Seasonality Harvest, Long-Short (Single-Instrument BTCUSDT.BINANCE Perp — Trade the Persistent Day-of-Week / Session Drift Using a Rolling Adaptive Estimate, Pure OHLCV, 3-Parameter)

Hypotheses

A LONG-SHORT strategy on the BTCUSDT.BINANCE USD-M perpetual that harvests CALENDAR SEASONALITY — the persistent, documented tendency for crypto to drift differently across days-of-week and intraweek sessions (weekend low-liquidity drift, weekday institutional flows, Monday/Friday effects). It is a genuinely DIFFERENT FAMILY from everything in my book and the flagged/dead ones: not momentum, not fade/reversion, not breakout, not a leverage/positioning/options/flow signal — it is a time-based drift edge that keys on WHEN, not on price or leverage state. The mechanism is a ROLLING ADAPTIVE estimate (not a static hard-coded calendar): it continuously estimates each day-of-week bucket's mean return over a trailing window and positions long the buckets whose recent drift is reliably positive, short those reliably negative, standing flat where the drift is insignificant. This adaptivity avoids the static-seasonality overfit trap (a fixed 'always long Mondays' curve-fit) by letting the seasonal pattern update and only trading buckets with a currently-significant, sign-stable drift. It stays on BTC (the one tradable instrument, deepest/cleanest calendar data), single perp execution (dev-safe), pure OHLCV (well-covered, no supplementary coverage/no-trades risk), long-short (fills the 13.4% bucket vs 86.6% long-only), and daily cadence with a naturally measurable sample (a decision every day → hundreds of position-days over multi-year history). 3 parameters kept low to resist overfit.

Hypotheses

MECHANISM. The hypothesis asks for a time-based drift edge that keys on WHEN rather than on price or leverage state, estimated adaptively so it is not a static calendar curve-fit. The implementation is literally that: seven rolling buckets, each re-estimated every day from its own trailing window, and a position taken only where the current estimate is meaningful. No named weekday appears anywhere in the logic -- if the Monday effect decays and a Thursday effect appears, the estimator follows it with no code change, and if no bucket is drifting every t-statistic sits near zero and the strategy simply does not trade. WHY A t-STATISTIC AND NOT A RAW MEAN. A raw 'bucket mean > X%' rule is a fitted constant that means different things in different volatility regimes (+0.4%/day is strong at 1.5% vol and noise at 5% vol). Standardizing by the standard error makes one threshold mean the same thing across regimes AND does the fee arithmetic for free: at ~2.5% daily vol with n~52 the standard error is ~0.35%/day, so |t| >= 1.2 implicitly demands an estimated drift of ~0.42%/day against a ~0.10% round trip -- a four-to-one margin over costs. Any raw threshold low enough to fire often would have sat below the fee floor, which is how this family usually dies. SIGN STABILITY WITHOUT A COMPOUND GATE. The hypothesis asks to trade only sign-stable buckets. Implementing that as a second ANDed entry condition is the classic way to build a strategy that fires zero times and burns its verification budget, so stability is folded into the SIGNAL as a 0.35x multiplicative damping instead: an unstable bucket keeps its direction and still varies bar to bar but needs |t| >= 3.4 rather than 1.2 to trade. One threshold still governs entry. Stability is measured on the two half-window MEANS, not on individual daily signs -- at a 0.4%/day drift against 2.5% vol only ~55% of single days share the drift's sign, so a per-day agreement measure would have damped every genuine bucket to zero. MEASURED, NOT ASSUMED. I ran the estimator over the real BTCUSDT.BINANCE 1-DAY catalog (2,402 bars, 2019-12-31 to 2026-07-28) before submitting. Full history: 2,290 ready bars, an entry signal on 20.5% of them, ~376 round trips (~59/yr, ~450 position-days, ~20% time in market), signal range [-2.57, +4.31] with 2,181 distinct values -- continuous and varying every bar, not a gated constant. Restricted to a trailing 365-bar window (the Layer-3 sandbox proxy): 253 ready bars and 61 round trips, so the >=1-trade requirement is met with a wide margin and there is no zero-trade verification loop. Sample size is decisive rather than anecdotal. CALENDAR ANCHORING AND THE OFF-BY-ONE THAT ISN'T. Every bucket label is a pure function of the bar's own timestamp ((ts_ns - 1) // 86400e9, mod 7), never a process-relative bar counter, so the weekly grid is identical across restarts, backtests and paper replay. The 1ns subtraction makes the label correct whether a daily bar is stamped at 23:59:59.999 or at the following midnight -- and in any case the ABSOLUTE label is irrelevant by construction, because bar t+1's label is always bar t's + 1, so a constant offset in the naming cancels out of a label-agnostic estimator. I verified the catalog's daily stamping while checking the data. NO LOOK-AHEAD. Bar t's own return is filed into bucket day_index(t) mod 7 while the decision reads bucket (day_index(t) + 1) mod 7 -- a different bucket by construction, so today's outcome can never inform today's decision. Bucket state is ingested by timestamp catch-up over the bar buffer rather than accumulated inside calculate_signal, because the base class does not call calculate_signal during the min_bars_required warmup; accumulating there would have left every bucket empty exactly when the strategy first became eligible to trade. I also caught and fixed an ordering bug on review: the exit test now runs AFTER the signal is assigned, so the bucket-support exit reads THIS bar's score rather than yesterday's stale, unrelated bucket. FEE VIABILITY AND RISK. The hysteresis exit is the fee-viability mechanism: when tomorrow's bucket also supports the position it is held rather than closed and reopened, so a multi-day run costs one round trip instead of one per day. Sizing is anchored to a 2-ATR gap floor rather than to the stop itself, so a tight stop cannot produce the largest position exactly where the stop is least enforceable -- the pattern behind the 90%+ drawdown blow-ups in this book -- and gross notional is capped at 0.5x equity independently of the equity path. risk_frac is locked so an optimizer cannot buy Sharpe with notional instead of with edge. VENUE. Futures (BINANCE USD-M MARGIN) is required rather than preferred: a negatively-drifting bucket is traded SHORT, which a CASH spot account cannot do. leverage is left at 1.0 and no sizing path reads it, so there is no leverage-set-but-unused mismatch. Pure OHLCV, single instrument, no supplementary feeds -- so none of the supplementary-coverage failure modes that have dominated recent verification loops apply here.

Hypotheses

The intraweek seasonality edge does not exist net of costs on BTC — decisively falsified. Across 378 trades the strategy nets profit_factor 0.791 (< 1.0), total_return -15.2%, avg_trade_return_pct -0.050% (negative), expectancy -$43.7/trade, Sharpe -0.153, and alpha -0.023, and it loses money in every single year 2020-2026 with rolling Sharpe below zero for almost the entire history. avg_win $359 ≈ avg_loss $387 at a 46% win rate shows the day-of-week buckets carry no directional information — the adaptive t-stat estimator (which correctly avoids the static-calendar overfit trap) simply reports that no bucket has a persistent, tradeable drift, so the book bleeds fees and adverse noise. This is not a tuning problem: there is no parameter region to optimize toward when the edge is absent and negative across a large sample and every regime, and the rejected quantity is the mechanism itself (calendar drift), not a mis-chosen target. Optimizing best-of-225 trials would only overfit noise. Abandon per the PF < 1.0 / negative-return / negative-avg_trade_return_pct rules rather than spend 2 hours optimizing.

Implementation

Long/short BTCUSDT.BINANCE USD-M perpetual on 1-DAY bars that harvests intraweek calendar seasonality with a rolling adaptive estimator rather than a hard-coded weekday rule. It keeps seven day-of-week buckets of realized log returns, each holding the trailing lookback_weeks observations. At every daily close it scores the bucket the NEXT bar falls in with that bucket's t-statistic (mean / standard error), multiplied by a sign-stability weight that damps the score to 0.35x when the older and recent halves of the window disagree in sign. It goes LONG when that score reaches +entry_t, SHORT at -entry_t, and stands flat otherwise. Exits: the next day's bucket no longer supports the position at half the entry level (hysteresis, so a run of favourable buckets is HELD rather than churned), an ATR stop at stop_atr_mult ATRs adverse from entry detected intrabar and booked at the close, and a 10-day max hold. Sizing is risk-first and gap-aware: 1.5% of equity over a max(stop_atr_mult, 2.0)-ATR excursion, capped at 0.5x equity notional, leverage 1.0. Three tunable parameters: lookback_weeks, entry_t, stop_atr_mult.

Verification Results

Pure-OHLCV day-of-week seasonality — weak/zero-survivor class; sandbox thin & short-biased; OOS persistence is the real test

Verification Results

ATR stop distance recomputed each bar (not frozen at entry) — minor risk drift vs sizing

Verification Results

Warm-branch clipping flattens on loss of confidence — verified intentional and safe

Backtest Review

Genuinely different family (calendar drift, not price/leverage) and a careful adaptive t-stat design that avoids the static-seasonality overfit trap

Backtest Review

Decisive sample (378 trades) with clean, look-ahead-safe construction — the result is trustworthy

Backtest Review

profit_factor 0.791 (< 1.0, net loser) and total_return -15.2%

Backtest Review

avg_trade_return_pct -0.050% and expectancy -$43.7/trade — negative per-trade edge

Backtest Review

Negative in ALL 7 years (2020 through 2026); Sharpe -0.153, alpha -0.023, information_ratio -0.761

Backtest Review

avg_win $359 ≈ avg_loss $387 at 46% win rate — the day-of-week buckets carry no directional information; the strategy just bleeds fees and adverse drift

Outcome Summary

BtcAdaptiveIntraweekSeasonalityLS pursued a genuinely different family — calendar drift rather than price, leverage, or flow — by maintaining seven rolling day-of-week buckets and trading only those whose recent drift was statistically significant and sign-stable, using an adaptive t-statistic explicitly built to dodge the 'always long Mondays' curve-fit. The construction was clean and look-ahead-safe, which is what made its verdict trustworthy: over 378 trades it lost money outright (profit factor 0.791, -15.2% total return, negative per-trade edge) and was negative in every single year with rolling Sharpe below zero for almost the whole history. The reviewer abandoned it at backtest-review under the PF<1.0 / negative-return rules, concluding the day-of-week buckets carry no directional information and that the rejected quantity was the mechanism itself, not a mis-chosen parameter. The honest outcome was a decisive falsification: intraweek seasonality is not a tradeable edge on BTC net of costs.

Outcome Summary

A careful adaptive design that correctly avoids the static-calendar overfit trap is valuable precisely because it delivers a trustworthy negative result — the adaptive t-stat estimator simply reported that no day-of-week bucket has a persistent, tradeable drift on BTC net of costs, so the intraweek seasonality edge does not exist.

Outcome Summary

It was abandoned at the pre-optimization BACKTEST_REVIEW gate as a decisively falsified premise: across a large, look-ahead-safe sample the day-of-week buckets carried no directional information, so the strategy bled fees and adverse drift in every regime — a missing edge no parameter tuning could recover.

Outcome Summary

Harvest intraweek calendar seasonality on the BTCUSDT.BINANCE perp long/short — using a rolling adaptive t-statistic to estimate each day-of-week bucket's recent drift and position long buckets reliably positive, short buckets reliably negative, flat where insignificant.

Outcome Summary

Over a decisive 378-trade sample (287 long / 91 short) the strategy was a net loser: profit factor 0.791, total return -15.2%, avg per-trade return -0.050%, expectancy -$43.7/trade, Sharpe -0.153, information ratio -0.761, max drawdown 18.5% — with avg win ($359) ≈ avg loss ($387) at a 46% win rate and losses in all seven years (2020-2026).
Strategy report

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