Case study · Backtest
🗓 Backtest period: 2018-01-01..2023-01-01
Spec ID: spec-hybrid-overnight-intraday-us-stocks-1782341488 · Generated: 2026-09-25 00:10 UTC
Cluster: Hybrid Momentum · Sub Cluster: Overnight Momentum With Intraday Extension Fade
Daily close-to-close long–short strategy that favors stocks with persistent overnight gains and limited intraday extension, while shorting weak overnight names with strong intraday extension.
Persistent overnight returns may reflect information incorporated across trading sessions, while unusually strong intraday moves may be prone to reversal. The strategy combines these effects cross-sectionally: it rewards overnight persistence, penalizes positive intraday extension in its score, and uses separate eligibility rules for long and short candidates. Neither effect is guaranteed to persist after trading costs or across market regimes.
[code omitted from public view]
| Param | Value | Notes |
|---|---|---|
| Universe | 100 US stocks | Specified symbols; selected by one-year dollar volume. |
| Backtest window / bars | 2018-01-01..2023-01-01 / daily | Daily close-to-close holdings; daily MOC rebalance. |
| Price data / returns | daily_prices; open, close, prior close |
Overnight = open/prior close − 1; intraday = close/open − 1. |
| Feature windows | Overnight returns: 5d and 20d; hit rate: 20d; intraday z-score: 20d; realized volatility: 20d | Cross-sectional composite-score ranking. |
| Composite score | 0.35*z(overnight_5d) + 0.45*z(overnight_20d) + 0.20*z(hit_rate_20d) - 0.50*max(intraday_z_20d, 0) |
Positive intraday extension is penalized. |
| Long entry | Hit rate ≥0.55; overnight return 20d ≥0; intraday z-score ≤1.25; top 20 | Apply eligibility before selection. |
| Short entry | Hit rate ≤0.45; overnight return 20d ≤0; intraday z-score ≥1.50; bottom 20 | Shorts enabled. |
| Exit rules | Long: rank <40, intraday z-score ≥2.0, or overnight return 20d ≤0. Short: rank >60, intraday z-score ≤0.25, or overnight return 20d ≥0 | Daily close rebalance. |
| Sizing / exposure | Equal-weight with volatility adjustment; maximum 10% per position; target 50% long and 50% short gross | Maximum leverage 4.0. |
| Liquidity / risk | 20-day average dollar volume ≥$10,000,000; maximum 20-day realized volatility 0.6 | Skip failed liquidity checks or missing open, close, or prior close. |
| Commissions | $0.0040 per share, minimum $1.00 per order, capped at 1.00% of trade value | Charged per fill by the results module; all metrics are net of them |
| Slippage | 0 bps — not applied | Not an omission — MOC (market-on-close) fills at the auction print the backtest uses |
| Costs not modelled | short borrow fees / rebate, margin financing on leverage, market impact, exchange/regulatory/clearing pass-through fees, taxes | Excluded deliberately, not unknown |
| # | Concern | Status |
|---|---|---|
| 1 | Close-derived signals versus execution | ✓ Rebalances at the same day's close via MOC, not at that day's open; verify implementation retains this convention. |
| 2 | Rolling features and data completeness | Check that windows use only observations available through the rebalance close and that missing-price exclusions are enforced. |
| 3 | Universe construction | Check whether the fixed symbol list and one-year volume ranking were available historically; otherwise survivorship or selection bias may remain. |
| 4 | Corporate actions and price continuity | Check adjustment and symbol-history handling for overnight and close-to-close returns. |
| 5 | Trading costs | ✓ commissions $0.0040/share (min $1.00/order); slippage 0 bps — not applied |
From 2018-01-01 to 2023-01-01, the backtest returned 46.11% with a 1.04 Sharpe ratio and a −10.44% maximum drawdown. Beta versus SPY was 0.17. These metrics are net of the commissions charged on fills, but the modest 1.18 profit factor and substantial trade count warrant caution about robustness.
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 | 46.11% | matches the reported total return |
| Sharpe from these rows | 1.04 | stored 1.04 |
| Volatility from these rows | 8.85% | stored 8.85% |
| Max drawdown from these rows | -10.44% | stored -10.44% |
| Lowest the book stood | -1.59% | low-water mark, in units of starting capital |
| CAGR from these rows | 7.89% | stored 7.89% |
| Metric | Value |
|---|---|
| Total Return | 46.11% |
| Sharpe | 1.04 |
| Sortino | 1.44 |
| Calmar | 0.75 |
| Max Drawdown | -10.44% |
| Volatility | 8.85% |
| Beta vs SPY | 0.17 |
| Win Rate | 53.77% |
| Profit Factor | 1.18 |
| Total Trades | 28253 |
| Symbols | 100 (AAPL, ABBV, ABT, ACN, ADBE, ADI, AMAT, AMD, AMGN, AMZN, +90 more) |