LtcWeekendLiquidityVacuumReversionLS1H
Hypotheses
Weekend Liquidity-Vacuum Reversion on LTCUSDT.BINANCE Perp — Long-Short Fade of the Outsized Friday-Close-to-Sunday-Reopen Move, Entered at the 22:00 UTC Sunday Bar and Exited on a Fixed Monday-Session Clock (1H bars, calendar-gated, 3-parameter)
Hypotheses
A LONG-SHORT, single-instrument, pure-OHLCV, CALENDAR-GATED strategy on LTCUSDT.BINANCE USD-M perpetual, 1-HOUR bars (catalog verified: 2020-01-09 -> 2026-09-10, ~58,500 hourly bars, ~348 weekends). The mechanism is NOT an indicator-based mean reversion and NOT a momentum re-skin: it is a liquidity-calendar effect. Crypto perps trade 24/7, but the institutional/market-making liquidity that backs them does not — CME BTC futures are closed, US/EU trading desks, ETF authorised participants, treasury/OTC desks and most algorithmic liquidity providers are flat or size-reduced from Friday ~21:00 UTC until Monday. Order book depth on Binance USD-M mid-caps like LTC measurably thins over that window. In a thinned book, a given amount of order flow (a forced liquidation, a single large discretionary ticket, a headline reaction with no arbitrage counterparty) moves price further than the same flow would on a Tuesday. Part of that displacement is pure price-impact, not information, and it is given back when deep liquidity returns at the start of the Monday global session. The strategy measures the weekend displacement, requires it to be large relative to that instrument's own recent weekend-return distribution, and takes the OTHER side at the Sunday 22:00 UTC bar close, exiting on a fixed clock inside the Monday session. Deliberately only THREE tunable parameters (sigma_mult, hold_hours, stop_atr_mult) — every other element (the Friday 21:00 UTC reference stamp, the Sunday 22:00 UTC entry stamp, the 26-week rolling sigma window) is a FIXED calendar/structural constant, not a fitted knob, because the recurring cause of death in this factory is best-of-N parameter selection. Implementation note for the developer (a sibling hypothesis just died on a Layer-3 sandbox timeout): all per-bar work must be O(1) — maintain the Friday-21:00 reference close and a fixed-length deque of the last 26 weekend returns incrementally in on_bar via the bar's UTC weekday/hour, never rescan history inside calculate_signal.
Hypotheses
Direct implementation of the hypothesis. Friday 21:00 UTC reference stamp, Sunday 22:00 UTC entry stamp and the 26-week sigma window are hard-coded constants (not knobs), exactly as specified, so the optimizer can only touch sigma_mult, hold_hours and stop_atr_mult (plus risk sizing) - minimising best-of-N selection. The sibling's Layer-3 timeout is addressed structurally: the Friday reference close, the TR ring (running sum, deque maxlen 168) and the weekend-return ring (maxlen 26) are all updated incrementally from the bar's own UTC weekday/hour computed by integer arithmetic; nothing rescans history inside calculate_signal, and sigma is recomputed at most once per weekend over <= 26 floats. The weekday/hour helper is module-level (not a staticmethod) so the Layer-2 proxy cannot inject self. Entry frequency on the sandbox window: ~119 weekends, ~13 consumed by the sigma warm-up, |z| >= 1.0 fires on roughly a third -> ~30 trades, comfortably above the >= 1 trade requirement. ONE HONEST CAVEAT the analyst should weigh: an offline check of the raw mechanism over the full 348-weekend history (sigma_mult 1.0, hold 20h, no stop) gives ~74 trades at +0.19% gross per trade, i.e. only ~+0.09% net of the 0.10% round-trip taker cost - below the 0.15% futures floor - and the yearly PnL alternates sign (2020/21 positive, 2022 and 2024/25 negative), so the liquidity-vacuum reversion may have decayed as weekend crypto liquidity professionalised. I implemented what was asked; hold_hours 20 and a wide 3.5-ATR tail stop are the defaults that keep the mechanism intact (a tight stop cuts the reversion before it completes).
Hypotheses
backtest_review_stuck_3_timeouts
Implementation
Calendar-gated long-short weekend liquidity-vacuum reversion on LTCUSDT.BINANCE USD-M perp, 1-HOUR bars, pure OHLCV. Reference = the Friday 21:00 UTC close (fixed stamp). The weekend displacement r = close(Sun 22:00 UTC)/close(Fri 21:00 UTC) - 1 is standardised by the stdev of the instrument's own last 26 weekend displacements (fixed window, measured strictly before the current weekend). calculate_signal returns the continuous fade z-score z = -displacement/sigma on EVERY bar (displacement measured against the most recent Friday reference, so the variable moves bar to bar all week); the entry decision is gated in should_enter to the Sunday 22:00 UTC bar with |z| >= sigma_mult, taking the OTHER side of the weekend move (sold-off weekend -> BUY, ripped weekend -> SELL). Exit is a fixed Monday-session clock: hold_hours after the fill, anchored on the position's own ts_opened (calendar time, restart-safe), with a wide stop_atr_mult x ATR(168h) tail stop checked at bar close. Sizing is capital-relative: risk_pct of equity against the ATR stop distance, capped at max_notional_frac x equity x leverage; leverage 1.0 (futures venue is required only because the strategy goes short). Three tunable knobs (sigma_mult, hold_hours, stop_atr_mult) plus sizing; every calendar/structural element is a fixed constant. All per-bar work is O(1): a 168-slot TR ring with a running sum and a 26-slot weekend-return ring whose sigma is recomputed only when a weekend closes.
Verification Results
When `_pos_key` changes and `_pending_stop_pct` is 0.0, rebuild the stop from live state instead of disabling it, e.g. `self._active_stop_pct = self._pending_stop_pct or (self.stop_atr_mult * self._atr / self._price if self._atr > 0 and self._price > 0 else 0.0)`. The ATR ring rewarms in 168 bars, so this is available shortly after restart.
Verification Results
The ATR tail stop is not restart-safe, unlike the time exit. `_pending_stop_pct` / `_active_stop_pct` live only in memory. After a live/paper node restart with a position still open, `should_exit` sees a new `ts_opened` (_pos_key == -1) and copies `_pending_stop_pct`, which is still its 0.0 initial value — so `_active_stop_pct` is 0.0 and the `if self._active_stop_pct > 0.0` guard silently disables the tail stop for the rest of that position's life. The position is then protected only by the hold_hours clock (<=24h). The docstring claims the exit is 'restart-safe', which is true of the clock anchor (position.ts_opened) but not of the stop.
Verification Results
Clamp the stop distance, e.g. `stop_pct = min(self.stop_atr_mult * self._atr / self._price, 0.10)`, so the ATR stop stays a real tail stop in stressed regimes rather than degenerating into 'time exit only', and so risk_pct means what it says.
Verification Results
The 'wide ATR tail stop' is close to inoperative in high-volatility regimes, so `risk_pct` overstates the actual risk control. Measured over the full LTC 1H history, stop_pct = stop_atr_mult * ATR(168) / price spans 2.28% to 26.14% (mean 5.52%). At the wide end the stop can never be hit inside a 20h hold, so the real exit is always the clock, and the realized worst trade was -14.37% of notional (-4.18% of equity) against a nominal 1.5% risk budget. The sizing math is internally consistent (notional shrinks as the stop widens, notional_frac ranged 0.057-0.658), so this is not a sizing bug — but the sandbox's largest_loss of -4,241 USD is explained by this, not by a stop that failed to fire.
Verification Results
Either require the full `_SIGMA_WINDOW` before trading (`len(self._wk) < _SIGMA_WINDOW -> sigma = 0.0`), which costs ~13 extra warm-up weekends, or leave as-is and note it in the analyst brief; the hypothesis names 26 as a fixed structural constant, so matching it exactly also removes a de facto free knob.
Verification Results
Sigma warm-up half-width: `_MIN_SIGMA_OBS = 13` lets trading start on a 13-weekend sigma estimate while the hypothesis specifies a 26-week rolling window. During the ramp the z denominator is materially noisier, so the |z| >= sigma_mult gate is not comparable between the first ~13 trading weekends and the rest of the sample. This is a small, one-off sample-quality effect (about 13 of ~348 weekends), not a look-ahead.
Verification Results
Fee viability is the real risk here, and it is structural across the WHOLE declared parameter space, not just the sandbox draw. I re-implemented the strategy's exact mechanics offline on the catalog's LTCUSDT.BINANCE 1H history (58,454 bars, 2020-01-09 -> 2026-09-10) and reproduced the sandbox to 3 decimals (23 trades, gross -1.145%/trade vs the sandbox's reported avg_trade_return_pct -1.151%) — so the numbers below are the mechanism, not an execution artifact. Over the full history at the shipped defaults (sigma_mult 1.0, hold 20h, stop 3.5xATR): 74 trades, GROSS -0.217%/trade, i.e. -0.317% net of the ~0.10% BINANCE round-trip. I then swept the full in-bounds 4x4x3 grid (sigma_mult 0.7-1.6, hold 12-24h, stop 2.0-5.0): the BEST cell in 48 is +0.118% gross = +0.018% net per trade (sm=1.0, hold=16, stop=2.0, n=74) — and that is already a best-of-48 selection, so the optimizer's ceiling sits ~8x below the 0.15% futures floor, with every other corner negative. Yearly PnL alternates sign exactly as the developer warned (2020 +5.9%, 2021 +28.5%, 2022 -18.8%, 2023 +2.4%, 2024 -14.2%, 2025 -20.8%), consistent with the liquidity-vacuum effect decaying as weekend crypto market-making professionalised; the sandbox's regime split (calm +1.66%, normal -5.82%, stressed -7.59%) points the same way. Sample size is also thin: 74 trades at defaults, 110 at the most permissive in-bounds setting (sigma_mult 0.7) over 6.5 years — below the ~100-trade bar for distinguishing edge from noise except at one corner, and the entry cadence is hard-capped at ~348 weekends by construction. Flipping to momentum does NOT rescue it (-0.203% gross), so this is an absent edge rather than an inverted one. First thing I would check at backtest review: whether the 2020-21 positive years carry the entire result, since the post-2022 subsample is uniformly negative.
Outcome Summary
LtcWeekendLiquidityVacuumReversionLS-ac0564c114
Outcome Summary
The strategy proposed a calendar-driven edge rather than an indicator one: measure the Friday-close-to-Sunday-reopen displacement on LTCUSDT perp, require it to be large relative to the instrument's own 26-weekend return distribution, and fade it at the Sunday 22:00 UTC bar with a fixed Monday-session exit, holding to just three tunable parameters to resist best-of-N fitting. The backtest ran cleanly over six-plus years and 58,454 bars, signaling and submitting 74 entries with no sizing or notional drops, but the result was a -17.96% total return, -0.52 Sharpe, 0.67 profit factor and a -0.222% average per-trade return — a 50% win rate paired with losses materially larger than wins. Performance was negative across calm, normal and stressed volatility regimes and in most stress windows, with only the 2021 China-ban window positive. No verdict was ever recorded: the pre-optimization backtest-review stage timed out three times and the run was abandoned as "backtest_review_stuck_3_timeouts", so optimization, analyst and risk review never ran.
Outcome Summary
The weekend liquidity-vacuum fade produced a negative per-trade edge well below round-trip costs on LTC despite a coin-flip win rate, and a 74-trade sample accumulated over six years gives the review stage little to work with — thin-sample calendar effects should be pre-screened for payoff asymmetry before entering the review queue.
Outcome Summary
The run never received a backtest-review verdict: it was abandoned with reason "backtest_review_stuck_3_timeouts" after the pre-optimization review stage timed out three times, so optimization, analyst review and risk review were never reached.
Outcome Summary
Fade an outsized Friday-21:00-UTC-to-Sunday-22:00-UTC move on LTCUSDT.BINANCE perp 1H bars, on the thesis that thin weekend liquidity causes price impact that is handed back when institutional depth returns in the Monday session, entered long-short at the Sunday 22:00 bar with a fixed Monday-clock exit and an ATR tail stop.
Outcome Summary
Over 2,436 days (58,454 hourly bars) the backtest produced 74 trades for a total return of -17.96% (CAGR -2.90%), Sharpe -0.52, Sortino -0.18, profit factor 0.67 and max drawdown 21.53%. Win rate was exactly 50% but average trade return was -0.222% of notional (expectancy -$229.61), with losses (avg $1,371) larger than wins (avg $912) and negative Sharpe in all three volatility regimes.
Backtest and paper results are hypothetical. Trading involves risk of loss.