4.61 Intraday Session Momentum: London Trends, NY Extends and Reverses

London opens the trend, New York extends it, then the New York afternoon hands it back. A real intraday bias, measured as sign-conditioned session returns, but easy to fake with bid/ask bounce.

4.61 Intraday Session Momentum: London Trends, NY Extends and Reverses

The London open at 07:00 GMT is a reflection point. Through the Asia session the market drifts on thin flow, and then the largest risk-takers and market-makers sit down at their London desks and price in everything that has accumulated since the previous daily close: the overnight headlines, the Asian data, the positioning that built up while the deep book was asleep. That repricing is not gentle. It often kicks off an aggressive trending move in the first hour or two of London, because a lot of decisions get made at once and shoved through a book that has just gotten deep enough to absorb them.

New York opens around 12:00 GMT into whatever London has already built. If London printed a clean directional move, New York desks tend to hop on it and extend it through the start of the overlap. The pattern Donnelly's source material describes, and that you can see on enough days to take seriously, is a three-act structure: London initiates the trend, New York extends it into the overlap, and then later in the New York afternoon the move runs out of fresh participants and reverses as London books square up and the day's flow exhausts itself. A session-based intraday bias, not a chart pattern.

This is a claim about conditional behavior tied to the wall clock, and it lives or dies on the timeframe you measure it at. The old article "How to Choose the Right Timeframe for a Strategy" made the point that noise is a function of timeframe and that the right resolution is upstream of the trend-versus-reversion choice. Session momentum is exactly that idea applied to the time-of-day axis: the continuation edge is a London-into-overlap phenomenon, and the reversal edge is a late-New-York phenomenon, and if you measure on a timeframe or a window that smears the two together you will conclude there is nothing there.

Decomposing the day into session returns

Stop thinking of the day as one return and split it into the pieces the clock actually produces. Define the London session return as the move from the London open to the New York open, and the New York session return as the move from the New York open to the New York close. The bias claim is that these two are not independent: the sign of the London move carries information about what New York does next.

$$ r_{\text{LDN}} = \frac{P_{\text{NY open}}}{P_{\text{LDN open}}} - 1 \qquad r_{\text{NY}} = \frac{P_{\text{NY close}}}{P_{\text{NY open}}} - 1 $$

Both are just simple percentage moves over a fixed slice of the clock: r_LDN is the London-session return measured from the 07:00 GMT open to the 12:00 GMT New York open, and r_NY is the New-York-session return from the 12:00 open to the New York close. The continuation hypothesis says that when r_LDN is positive, the early part of r_NY is positive too, because New York extends the London trend. The reversal hypothesis says the late part of r_NY tends to fade back against r_LDN. To test either, you condition the New York move on the sign of the London move and look at the average.

$$ \text{continuation edge} = E\!\left[\, r_{\text{NY}} \cdot \operatorname{sign}(r_{\text{LDN}}) \,\right] $$

This single number is the whole test. You take each day's New York return, flip its sign so that an up-London day and a down-London day both count "in the direction London was going," and average across all days. If the average is reliably positive, New York extends London on balance. If it is negative, New York fades London on balance. Split the New York session into an early window and a late window and compute the same number for each, and you can see the extend-then-reverse shape directly: positive in the early window, negative in the late one. No chart-reading, no eyeballing, one conditional expectation per window.

The honest version of this test reports the hit rate alongside the average, because one or two violent trend days can manufacture a positive expectation that almost never repeats. A session bias that is real shows up as a modest edge on a majority of days, not a huge edge on a handful. That is the same discipline the rest of this work keeps returning to: a few outlier sessions are not a strategy.

Why the edge is fragile and easy to fake

The seductive part of a session bias is that it backtests cleanly on a naive engine, and that is exactly where it lies to you. The old article "Why Bid/Ask Bounce Matters for Intraday FX Systems" is the trap here. If you measure the London and New York session returns off last-trade prices, the bid/ask bounce contaminates both endpoints, and worse, it injects negative autocorrelation between consecutive measurements that a session-momentum test can misread as a real reversal signal. The "New York reverses London" finding can be partly manufactured by the spread oscillation at the session boundaries rather than by any flow. Compute the session returns on mid-price, sample at the open and close marks rather than the noisiest ticks, and require the conditional edge to clear a multiple of the spread before you believe it.

The session boundaries also sit near the fixes. The New York reversal window overlaps the 16:00 GMT WMR fix and the late-overlap option expiries, so part of what looks like a clean session reversal is forced fixing flow that mean-reverts on its own schedule. That is not a reason to discard the bias, but it means the reversal you are trading may be a fix artifact wearing a session costume, and a fresh entry into the late New York window can collide with that flow.

Then there is the obvious problem: this is a static time-of-day rule, and time-of-day rules decay as the structure that produced them changes. The London-trends, New-York-extends pattern came out of a particular era of who traded when. Algorithmic execution has flattened a lot of intraday seasonality since, so the edge is almost certainly smaller now than the description implies, and you should expect it to keep shrinking. Treat the magnitude as a thing to re-measure on recent data, not a constant.

Building it without fooling yourself

The construction is a per-session conditional bias estimator with the windows pinned to GMT and the prices taken at mid. Tag every bar with its session, collapse each day into the London and New York session returns, and accumulate the sign-conditioned New York return separately for an early and a late window. Report the average and the hit rate for each, and only then decide whether either window clears costs.

import numpy as np
import pandas as pd


def session_bias(mid: pd.Series, tz_gmt_index: bool = True) -> dict:
    # mid: minute-bar mid-price series, DatetimeIndex in GMT
    g = mid.groupby(mid.index.normalize())
    rows = []
    for day, s in g:
        def at(hour):
            w = s.between_time(f"{hour:02d}:00", f"{hour:02d}:05")
            return w.iloc[0] if len(w) else np.nan
        ldn_open, ny_open = at(7), at(12)
        ny_mid, ny_close = at(16), s.iloc[-1]
        if np.isnan([ldn_open, ny_open, ny_mid]).any():
            continue
        r_ldn = ny_open / ldn_open - 1.0
        r_ny_early = ny_mid / ny_open - 1.0
        r_ny_late = ny_close / ny_mid - 1.0
        rows.append((np.sign(r_ldn), r_ny_early, r_ny_late))
    a = np.array(rows)
    sgn, early, late = a[:, 0], a[:, 1], a[:, 2]
    return {
        "early_edge": float(np.mean(sgn * early)),
        "early_hit": float(np.mean((sgn * early) > 0)),
        "late_edge": float(np.mean(sgn * late)),
        "late_hit": float(np.mean((sgn * late) > 0)),
        "n_days": len(a),
    }

The two edge numbers are the sign-conditioned average New York return in each window, and the two hit rates tell you whether the edge is broad or driven by a few days. The windows here are arbitrary dials, the 07:00 and 12:00 opens and the 16:00 split, and you should treat them as such: shift them, sweep them, and see whether the result is a knife-edge or a plateau. A bias that only appears at one exact minute boundary is curve fit. A bias that survives a half-hour wobble in the window edges has a chance of being real.

KEY POINTS

  • The day has a structure tied to the clock: London at 07:00 GMT reprices the overnight and initiates a trend, New York at 12:00 extends it into the overlap, and the late New York afternoon reverses it as books square and flow exhausts.
  • Test it by splitting each day into a London session return and a New York session return, then averaging the New York return conditioned on the sign of the London return. Positive in the early window means continuation, negative in the late window means reversal.
  • Always report the hit rate next to the average. A real session bias is a modest edge on most days, not a huge edge on a few trend days.
  • The reversal finding is easy to fake. Bid/ask bounce off last-trade prices injects negative autocorrelation that masquerades as a session reversal (the old article "Why Bid/Ask Bounce Matters for Intraday FX Systems"), so compute on mid-price and require the edge to clear a multiple of the spread.
  • The late New York window overlaps the 16:00 WMR fix, so part of the "reversal" can be forced fixing flow, and the whole pattern is a static time-of-day rule that algos have eroded. Re-measure the magnitude on recent data, and sweep the session windows to confirm the edge is a plateau, not a knife-edge (the timeframe discipline from the old article "How to Choose the Right Timeframe for a Strategy").

References