← Back to archive

1. Time-of-Day Effects

Financial markets are not uniformly active throughout the trading day. Decades of microstructure research, beginning with Admati and Pfleiderer (1988), have documented U-shaped patterns in volatility, volume, and spreads: activity is highest at the open and close and lowest in the middle of the day. Less well-studied is whether these activity patterns generate directional biases — systematic tendencies for prices to move in a particular direction during specific time windows.

For systematic traders, exploitable intraday patterns are attractive because they have short holding periods (reducing overnight risk exposure), high trade frequency (improving statistical power), and potential independence from the longer-term signals that most strategies rely on.

2. Data and Methodology

We analyse 30-minute bar data for four liquid futures contracts: E-mini S&P 500 (ES), Nasdaq 100 (NQ), WTI Crude (CL), and Gold (GC) from January 2019 to December 2024 — approximately 1,260 trading days per contract. For each 30-minute window, We compute the average return, the t-statistic for difference from zero, and the Sharpe ratio assuming a strategy that is long during positive-bias windows and flat otherwise.

import pandas as pd
import numpy as np
from scipy import stats

def intraday_seasonality(bars_df, time_col='time', return_col='return'):
    """
    Compute intraday seasonality statistics by 30-min window.
    bars_df must have a time-of-day column and return column.
    """
    grouped = bars_df.groupby(time_col)[return_col]
    results = pd.DataFrame({
        'mean_return': grouped.mean(),
        'std': grouped.std(),
        'count': grouped.count(),
        't_stat': grouped.apply(
            lambda x: stats.ttest_1samp(x, 0).statistic),
        'p_value': grouped.apply(
            lambda x: stats.ttest_1samp(x, 0).pvalue),
        'pct_positive': grouped.apply(lambda x: np.mean(x > 0)),
        'sharpe': grouped.apply(
            lambda x: x.mean()/x.std()*np.sqrt(252*13))
    })
    return results.sort_index()

3. Key Findings

Window (ET)ES Mean (bp)ES t-statNQ Mean (bp)CL Mean (bp)GC Mean (bp)
09:30–10:00+1.82.14*+2.4−1.1+0.3
10:00–10:30−1.2−1.87−1.6+0.8−0.2
10:30–11:00+0.40.61+0.7+2.1*+0.1
11:00–13:00−0.1−0.18−0.3−0.4+0.4
13:00–13:30+0.91.42+1.1−0.6−0.8
14:30–15:00+0.60.92+0.8+1.4*+0.5
15:30–16:00+2.12.78**+2.8**+0.9+1.1

Table 1: Average 30-minute returns by time window. * p < 0.05, ** p < 0.01. The 11:00–13:00 midday period is aggregated due to uniformly insignificant results.

Two windows stand out across equity index futures: the opening 30 minutes (09:30–10:00, +1.8bp for ES) and the closing 30 minutes (15:30–16:00, +2.1bp for ES). Both are statistically significant at conventional levels and have persisted across sub-periods. The opening effect is consistent with overnight information being incorporated through a systematic upward bias — likely driven by institutional buy-on-open orders. The closing effect is consistent with portfolio rebalancing and index tracking flows that create predictable buying pressure.

4. Commodity-Specific Patterns

Crude oil shows a different pattern: the strongest positive bias occurs at 10:30 ET, coinciding with the weekly EIA inventory report release (Wednesdays) and the daily influx of physical hedger orders that cluster around the mid-morning NYMEX settlement window. The CL 10:30 effect is +2.1bp on report days and +1.4bp on non-report days, suggesting a blend of information-driven and flow-driven seasonality.

5. After Transaction Costs

At a round-trip cost of 2bp (achievable for a retail trader with direct market access in ES), only the opening and closing windows in equity index futures survive cost adjustment. The net edge is approximately +0.5bp per trade for the opening window and +0.7bp for the closing window. This is marginal but positive, and compounds to an annualised return of approximately 3–4% with a Sharpe of 0.4–0.5 at realistic position sizes. The CL 10:30 window also survives at higher transaction costs (3bp round-trip) due to its larger amplitude.

6. Robustness

We test robustness across three dimensions: sub-period stability (2019–2021 vs. 2022–2024), day-of-week interaction (the effects are strongest on Mondays and Fridays, weakest on Wednesdays), and volatility conditioning (the effects are larger during low-VIX regimes and diminish during high-VIX periods, consistent with flow-driven patterns being overwhelmed by information-driven volatility during stress).

7. Conclusion

Statistically significant intraday seasonality exists in liquid futures markets, concentrated in the opening and closing 30-minute windows for equity indices and the mid-morning window for crude oil. These effects are consistent with institutional flow patterns and survive realistic transaction costs, though the edge is narrow. They represent a genuine but capacity-constrained alpha source that is best used as a timing overlay for existing strategies rather than as a standalone approach.

References

  1. Admati, A.R. and Pfleiderer, P. (1988). "A Theory of Intraday Patterns." Review of Financial Studies, 1(1), 3–40.
  2. Heston, S.L., Korajczyk, R.A. and Sadka, R. (2010). "Intraday Patterns in the Cross-Section of Stock Returns." Journal of Finance, 65(4), 1369–1407.
  3. Andersen, T.G. and Bollerslev, T. (1997). "Intraday Periodicity and Volatility Persistence." J. Empirical Finance, 4, 115–158.
  4. Lou, D., Polk, C. and Skouras, S. (2019). "A Tug of War: Overnight Versus Intraday Expected Returns." J. Financial Economics, 134(1), 192–213.