Case study · Backtest
🗓 Backtest period: 2018-01-01..2023-01-01
Spec ID: spec-hybrid-overnight-intraday-us-stocks-1782341488 · Generated: 2026-09-07 18:40 UTC
Cluster: Momentum · Sub Cluster: Overnight Momentum With Intraday Fade
Each close, the strategy buys liquid stocks with persistent positive overnight returns and shorts stocks with weak overnight behavior after strong intraday extension. It ranks signals cross-sectionally, applies volatility-adjusted sizing, and holds positions close to close.
Overnight returns can persist because information released outside trading hours is incorporated gradually, while institutional opening flows and investor attention may reinforce recent overnight direction. A high overnight hit rate combined with positive rolling overnight returns seeks to distinguish persistent behavior from isolated gaps.
Strong positive intraday moves can represent short-lived extension rather than durable information. Penalizing such moves on the long side and requiring them for short candidates combines overnight momentum with an intraday mean-reversion filter. Daily cross-sectional ranking concentrates exposure in the strongest qualifying signals while long-short construction reduces broad market dependence.
[code omitted from public view]
| Param | Value | Notes |
|---|---|---|
| Universe | 100 US stocks | Specified list drawn from names sorted by 1-year dollar volume |
| Backtest window | 2018-01-01 to 2023-01-01 | Daily bars; no walk-forward analysis |
| Rebalance / holding | Daily at close / close-to-close | Market-on-close execution convention |
| Liquidity threshold | 20-day ADV >= $10M | Dollar volume; failed observations are skipped |
| Overnight windows | 5d and 20d | Composite weights 0.35 and 0.45 |
| Overnight hit-rate window | 20d | Composite weight 0.20 |
| Intraday extension | 20d z-score | Positive extension penalty weight 0.50 |
| Long entry | Hit rate >= 0.55; overnight 20d > 0; intraday z <= 1.25 | Select top 20 by composite score |
| Short entry | Hit rate <= 0.45; rolling overnight return <= 0; intraday z >= 1.50 | Select bottom 20 by composite score; shorts enabled |
| Long exits | Rank < 40; intraday z >= 2.0; or overnight 20d <= 0 | Evaluated daily |
| Short exits | Rank > 60; intraday z <= 0.25; or overnight 20d >= 0 | Evaluated daily |
| Gross targets | 50% long / 50% short | Equal weight with volatility adjustment |
| Position cap | 10% | Per security |
| Volatility control | 20d realized volatility; maximum 60% | High-volatility names are skipped |
| Maximum leverage | 4.0x | Upper constraint; target gross exposure is 1.0x |
| Costs | Not specified | No explicit commissions, spread, slippage, borrow fees, or financing model supplied |
| # | Concern | Status |
|---|---|---|
| 1 | Close-derived signals executed at the close | Consistent with the platform's market-on-close convention |
| 2 | Rolling features include only information available by the rebalance close | Required; verify rolling calculations do not contain forward shifts |
| 3 | Universe membership and 1-year dollar-volume ranking are point-in-time | Unresolved from the supplied specification; fixed ex-post membership could create survivorship bias |
| 4 | Open, close, volume, splits, and dividends are historically adjusted without future leakage | Data-vendor treatment is not documented and requires verification |
| 5 | Cross-sectional z-scores and ranks use only the contemporaneously eligible universe | Required; verify excluded or missing names do not enter normalization |
| 6 | Final close-to-close returns are aligned with positions established at each close | Required; confirm day-t signals receive returns from close t onward, not earlier returns |
From 2018 through the start of 2023, the backtest generated a 44.81% total return with a 1.01 Sharpe ratio, 8.88% volatility, and a -10.48% maximum drawdown. Beta versus SPY was 0.17, consistent with limited but nonzero market exposure. The 53.50% win rate and 1.18 profit factor indicate a modest statistical edge across 28,233 trades rather than a large payoff advantage; absent an explicit cost model, these results should be interpreted as pre-cost.
Recomputed here from the run's stored daily returns, because every annualized figure in the table above is derived from the LENGTH of that array (years = n / 252). Only total return and max drawdown do not depend on the row count, so when the recomputed and stored values differ by a common factor, those two are the numbers to trust.
| Check | From the run's own returns | Note |
|---|---|---|
| Daily-return rows | 1,259 | 1.00x the 1,260 trading days in 2018-01-01..2023-01-01 |
| Distinct dates | 1,259 | one row per date |
| Date span | 2018-01-02 .. 2022-12-30 | |
| Sum of daily returns | 44.81% | matches the reported total return |
| Sharpe from these rows | 1.01 | stored 1.01 |
| Volatility from these rows | 8.88% | stored 8.88% |
| Max drawdown from these rows | -10.48% | stored -10.48% |
| CAGR from these rows | 7.69% | stored 7.69% |
| Metric | Value |
|---|---|
| Total Return | 44.81% |
| Sharpe | 1.01 |
| Sortino | 1.40 |
| Calmar | 0.73 |
| Max Drawdown | -10.48% |
| Volatility | 8.88% |
| Beta vs SPY | 0.17 |
| Win Rate | 53.50% |
| Profit Factor | 1.18 |
| Total Trades | 28233 |
| Symbols | 100 (AAPL, ABBV, ABT, ACN, ADBE, ADI, AMAT, AMD, AMGN, AMZN, +90 more) |