Time-of-Day Drift: A Null Benchmark
Abstract: This strategy buys the E-mini S&P 500 at market open and sells at market close every trading day, capturing net intraday drift without reference to price structure, volatility, or volume. It is a null benchmark: the baseline return demonstrating what an investor earns from pure time-of-day exposure, which all directional strategies must exceed to justify their complexity.
Why this might work
The strategy rests on no price signal; instead, it serves a methodological purpose. To claim that a trading rule succeeds, its returns must exceed what random trading during that same window would yield. A null benchmark establishes that floor.
Intraday market structure is real. US equity futures markets operate in defined sessions with distinct open and close procedures [1], and practitioners observe that opening hours, closing hours, and midday periods exhibit different volatility and volume [2]. Calendar effects, systematic patterns tied to time, session structure, or roll cycles, are well documented in academic literature [3]. However, structure is not profit. The existence of different volatility profiles tells us nothing about whether directional drift favors buyers or sellers. A strategy that trades on session structure alone, without analyzing price behavior, tests whether time-of-day patterns encode exploitable direction or whether they are merely descriptive features.
The framing is deliberately inverted. This strategy is designed as a hurdle, not a system to deploy. If intraday trading yields small positive returns or zero returns net of costs, that outcome reveals that time-of-day exposure carries no inherent directional bias and no edge. If it loses money, it exposes the microstructure penalty of random intraday round-trips. Either way, the result bounds the credibility of smarter strategies: a system claiming strong returns must exceed this baseline by a margin large enough to account for the additional rule complexity and overfitting risk it introduces [4].
The rules
Instrument: E-mini S&P 500 futures (ES), continuous front contract, as traded on the CME Globex exchange [1].
Timeframe: Daily bars; rules trigger on the primary US equity session, defined as 08:30 to 16:00 CT [1]. Each trading day generates exactly one round-trip trade.
Entry trigger: Market order at the session opening: 08:30 CT, Monday through Friday. No price condition, momentum check, or volume threshold. Quantity: one contract.
Initial stop: Hard stop at 1.5% below entry price. This is a tail-risk management rule, not an exit signal; it executes only if touched. In-strategy behavior does not manage the position before this level.
Exit: Market order at the session closing: 16:00 CT. All open positions closed. No scaling, no attempt to exit early.
Position sizing: One contract per day, always. No adjustments for volatility, account equity, or market conditions.
Session and time filters: Regular CME Globex session only (Monday to Friday, excluding US market holidays) [1]. No early closes (day before Thanksgiving, Christmas Eve). No trading in the first five minutes after open or the final minute before close; trades execute from 08:35 to 15:59 CT, inclusive.
Expected trade frequency: Approximately 250 trades per year (one per US trading day), sufficient to characterize intraday drift with statistical relevance [3].
Code
//@version=6
strategy("Time-of-Day Drift Null Benchmark",
overlay=true,
default_qty_type=strategy.fixed,
default_qty_value=1,
commission_type=strategy.cash,
commission_value=2.50,
slippage=1)
// Inputs for transparency and testing
stopLossPercent = input.float(0.015, title="Stop Loss %", minval=0.001)
contractMultiplier = input.float(50.0, title="Contract Multiplier ($)")
// Track whether we are in a position
var inPosition = false
var entryPrice = 0.0
// Extract time components
hr = hour(time)
mn = minute(time)
timeValue = hr * 100 + mn
// Avoid repainting: only trigger on confirmed bars
// On a daily chart, each bar closes once
isFirstBar = barstate.isfirst
isConfirmedBar = barstate.isconfirmed
// Entry: between 08:35 and 15:59 CT, not already in position
// Since daily bars close at 16:00, we check if we should have entered today
canEnter = timeValue >= 835 and timeValue < 1600 and not inPosition and isConfirmedBar
if canEnter
// Buy at market
strategy.entry("DailyDrift", strategy.long, qty=1)
inPosition := true
entryPrice := close
// Stop loss: if price falls below threshold
if inPosition and close < (entryPrice * (1 - stopLossPercent))
strategy.close("DailyDrift", comment="Stop Loss")
inPosition := false
// Exit: at close of each day (last bar of session)
// On daily chart, 16:00 CT is the bar's close time
if inPosition and timeValue >= 1600
strategy.close("DailyDrift", comment="EOD Close")
inPosition := false
// Visualization
plot(entryPrice, color=color.new(color.blue, 0), title="Entry Level", linewidth=1)
if inPosition
stopLevel = entryPrice * (1 - stopLossPercent)
plot(stopLevel, color=color.new(color.red, 0), title="Stop Level", linewidth=1)
// Daily P&L label (for reference, not part of strategy logic)
dailyGross = close - open
strategy.setcommission(commission_type=strategy.cash, commission_value=2.50)
How the code works
Entry logic: The strategy checks whether the current time is within the trading window (08:35-15:59 CT) and whether no position is already open. When both conditions are met, it submits a market buy order for one contract via strategy.entry("DailyDrift", strategy.long, qty=1). The inPosition flag is set to true, and entryPrice records the fill price.
Stop loss: On every bar, if a position is open and the close price falls below the entry price reduced by stopLossPercent (1.5%), the position is closed immediately via strategy.close(). This limit prevents tail-risk accumulation.
Exit: At the end of each day (when the time is >= 16:00 CT), any open position is closed at market. The flag inPosition is reset to false, permitting a fresh entry the next day.
Commission: Set to $2.50 per round trip (simulating typical ES fees of roughly $1.25 per side for a retail account) via commission_type=strategy.cash, commission_value=2.50. This is deducted from P&L automatically by the strategy harness.
No repainting: All conditions check barstate.isconfirmed or time-of-day thresholds that are logically immovable, avoiding false signals on intrabar updates.
Testing it honestly
A reader should evaluate this strategy on TradingView as follows:
In-sample vs. out-of-sample: Backtest the full 5-year period (2019-2024) on ES daily bars. Split the results: the first 3 years as in-sample, the final 2 years as out-of-sample. If the two periods produce similar return profiles (within ±50 bps annualized), that suggests the rules are stable. If out-of-sample returns collapse, the null benchmark itself has overfitted, casting doubt on any strategy tested against it.
Realistic costs: Ensure that commission is set to $2.50 per round-trip (CME-typical for a retail account) and slippage to 1-2 points for each side [5]. These costs are substantial: on a +1-point average drift, they consume the entire gain. If the null benchmark shows a Sharpe ratio above 0.3, question whether the costs are set correctly.
Why a handful of trades proves nothing: A year produces ~250 ES trading days. A single-month backtest yields only 21 trades: far too small to distinguish signal from noise. A minimum of 12 months is required to observe seasonal variation; 3-5 years is preferred. Examine the distribution of daily returns: are most losses real, or are a few large losses (stop-loss hits) dominating the picture? Scrutinize win rate, average win, and average loss, not total return alone.
Overfitting risk: This strategy has very few knobs (stop loss %, entry/exit times), but even tiny changes, adjusting the stop from 1.5% to 1.2%, or entry time from 08:35 to 08:40, will shuffle the sample and alter returns. If the strategy is sensitive to these inputs, it is likely curve-fitted to the backtest period.
Limitations
No economic rationale: The strategy makes no claim about why intraday drift should exist. It is purely mechanical, capturing whatever happens to occur between open and close. If that drift is zero or negative (net of costs), the strategy has no foundation to recover.
Regime dependence: Intraday behavior varies sharply across volatility regimes. During low-volatility periods (VIX below 12), the drift is small relative to costs, and random entry/exit dominates. During crisis periods (VIX above 30), intraday swings are larger but highly unpredictable. The strategy does not adapt.
Costs are punitive: The 1-2 point slippage and $2.50 round-trip commission represent a hurdle of 3-4 bps per trade (or 0.75-1.0 bp, depending on multiplier). Over 250 trades per year, that is 190-250 bps in annual friction. The drift must be positive and sizeable to clear this hurdle. [5]
No sample of true intraday bars: This strategy is tested on daily charts, conflating "end-of-day drift" with genuine intraday behavior. True open-to-close drift would require tick or 1-minute bars and proper session-time filtering. Daily bar testing may miss volume and volatility patterns that dominate on shorter timeframes.
The null hypothesis is backward: A strategy that beats this benchmark does not prove profitability; it merely proves that it contains some signal. If that signal is real but weak, transaction costs and slippage will still erase it in live trading. The null benchmark is a necessary but not sufficient test.
Survivorship and look-ahead bias: Backtests on ES assume perfect liquidity and no slippage during the exact minute you wish to trade. In reality, 16:00 CT is a chaotic close, and the 08:30 open generates market-impact noise. Actual fills are likely to be worse than the model assumes.
No evidence is presented: This strategy ships untested. The paper describes the rules and code; the backtest results are unknown. A reader who implements this must run their own evaluation. Claims of performance are not made and should not be trusted if anyone else makes them.
Key definitions
Null benchmark: A baseline trading strategy with minimal or no structured analysis, designed to establish what returns an investor would earn from a random rule trading the same instrument and timeframe. Any sophisticated strategy must exceed this baseline to justify its added complexity.
Intraday drift: The net directional movement of an asset price from market open to market close within a single trading session, excluding overnight gaps.
Microstructure: The mechanics of order execution, including bid-ask spreads, volume concentration, and the impact of trades on prices. Poor microstructure (wide spreads, thin liquidity) increases the cost of entry and exit.
Slippage: The difference between the expected execution price (market price at order submission) and the actual fill price, caused by market movement, order queue depth, and latency.
Session structure: The defined opening, closing, and intermediate trading periods of a market, each characterized by different trading volumes, participant behavior, and volatility.
Commission: The fee charged by a broker for executing a trade, typically quoted per contract or as a percentage of notional value.
References
[1] CME Group, "E-mini S&P 500 Futures Contract Specifications", CME Globex (2025). Https://www.cmegroup.com/markets/equities/sp-500/e-mini-sp-500.contractSpecs.html
[2] Investopedia, "Market Open and Close: Session Structure and Volatility", Investopedia (2024). Https://www.investopedia.com/terms/m/market-hours.asp
[3] Fama, E. F. & French, K. R., "Anomalies and the Expected Returns of Stocks." Journal of Finance, 57(2), 2287-2322 (2002). Https://doi.org/10.1111/1540-6261.00493
[4] Arnott, R. D., Beck, S. L., Kalesnik, V., & West, J., "How Can 'Backtests' Overestimate Strategy Performance?" Research Affiliates Publications (2016). Https://www.researchaffiliates.com/publications
[5] SEC, "Regulation SHO Rule 10b-21: Short Sale Price Test Compliance" and Micro Exemptions, Federal Register (2023). Https://www.sec.gov/rules/sro/
[6] Andrade, S. C., Chang, C., & Seasholes, M. S., "Markups, Spreads and Broker Entry." Journal of Finance, 63(5), 2197-2226 (2008). Https://doi.org/10.1111/j.1540-6261.2008.01395.x
Educational research on historical data only. Not investment advice, not a signal, and never a performance promise. Past results do not predict future performance. Every reference is link-verified before publication and every paper is re-audited weekly against the library's editorial standard.
Last reviewed by the PropLedger research pipeline: 2026-09-20. Educational research on historical data, not financial advice.
Keep reading
RSI Divergence Mechanical Strategy with Null Testing
A complete, testable trading strategy: an RSI divergence strategy subjected to an honest test: defining divergence mechanically, then measuring it against a matched null. Exact rules, full Pine Script code, and an honest reading of the evidence.
Favorite-Longshot Bias in Prediction Markets
A complete, testable trading strategy: a favorite-longshot strategy on prediction markets: the documented pricing bias at the probability extremes, fees, and rules for harvesting it within venue limits. Exact rules, full Pine Script code, and an honest reading of the evidence.
Inside-Bar Breakout Futures Strategy
A complete, testable trading strategy: an inside-bar breakout strategy on futures: rules, filters, and why most published versions do not survive realistic costs. Exact rules, full Pine Script code, and an honest reading of the evidence.