Strategies
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)
Outcome: Abandoned
LtcWeekendLiquidityVacuumReversionLS1H
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.
Hypothesis
backtest_review_stuck_3_timeouts
Implementation
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.
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.
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.
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.
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.
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.
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.
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.
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.
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 Review
- Sharpe
- -0.52
- Total return
- -17.96%
- Max drawdown
- 21.53%
- Trades
- 74
- Win rate
- 50.0%
- Profit factor
- 0.67
Backtest and paper results are hypothetical. Trading involves risk of loss.