2. Data Quality: The Contaminated Foundation
2.1 The Taxonomy of Data Errors
A backtest is only as reliable as the data on which it is built, and the quality of freely available and even commercially distributed historical market data is far worse than most traders realise. Data quality issues fall into several categories, each capable of producing misleading results.
Erroneous prints: A single bad tick, a trade printed at a price far from the prevailing market, whether due to a fat-finger error, an exchange reporting glitch, or a data vendor processing failure, can generate an apparent trading opportunity with outsized returns that never actually existed. In tick or minute-level data, such errors may be individually identifiable, but in daily data they can distort the reported high, low, or settlement price without any obvious indication of error. A daily bar showing an anomalous low, for example, could trigger a limit-order entry in a mean-reversion system and subsequently show a profitable exit, when in reality the print that generated the entry signal was erroneous and no fill would have occurred. Cleaning can also err in the other direction, as it did in one Brent validation case from my own archive, where the front contract fell about 22% and a back month about 12%. Measured against the front month, the back-month move looked suspicious, but nearby maturities corroborated it and the move was real. A rule that removes such observations deletes the markets a strategy most needs to survive, and forward-filling a gap is a modelling decision too, since the repeated value is something the researcher has supplied.
Timestamp errors: Markets operate across time zones with varying session times, and data vendors are not always consistent in how they handle session boundaries, daylight saving transitions, or the distinction between electronic and pit trading sessions. A strategy that relies on the timing of price action (for example, a breakout of the prior session high) can produce very different results depending on whether the data vendor defines “session” consistently. Compounding this problem, different approaches to timestamping can be found even within data sets from the same provider. One product may deliver timestamps in UTC, while another is localised to the exchange’s native time zone, and a third uses an arbitrary reference time zone defined by the vendor. The researcher who loads data from multiple instruments or multiple products without verifying the timestamp convention of each is silently mixing time zones, a class of error that will not produce obviously wrong prices but will misalign bars across instruments and corrupt any cross-market signal. It would not be unreasonable to assume that, in 2026, the timestamping of financial data is a solved problem. Data providers seem almost to go out of their way to demonstrate that it is not. FirstRate Data, for example, labels its European instruments in New York time. A fixed UTC offset can agree with the exchange for months and then fail at daylight saving, and because the US and Europe change their clocks on different dates, the weeks between the two changes are the best time to compare one vendor’s import with another’s. The researcher’s own reference data can be wrong in the same way. In the session registry of my own futures archive, 17 NYMEX and COMEX energy and metals roots had their session times written in Eastern time under an
America/Chicagoheader, an hour out, and nothing complained, because1800-1700looks like a perfectly good session in either zone.Missing data: Gaps in the record, whether from holidays, half-day sessions, exchange outages, or vendor processing failures, can introduce artefacts into any indicator that relies on a continuous time series. Moving averages and volatility estimates, among others, are sensitive to missing observations. Some vendors omit a bar whenever nothing trades: Databento emits no OHLCV record for an interval without a trade,1 and a genuine one-minute aluminium series I imported had a median spacing of two minutes, so a classifier that inferred the bar interval from the median gap got it wrong. Whole years can go missing as well: in the same archive, BFX had no rows for 2024, COMEX aluminium (ALI) lacked 2018 and Henry Hub (HH) lacked 2011, and a coverage summary built from the first and last timestamps hid all three. A feed that stops in mid-afternoon still yields a daily bar that passes routine OHLC checks, with understated volume and a final price far from the session close. A missing bar may mean that the exchange was closed, that the instrument did not trade, or that something failed between the exchange and the local file. Telling these apart takes the exchange calendar, the vendor’s feed-condition reports and the researcher’s own import logs, used together.
Phantom data: The inverse of missing data: bars or ticks reported for periods in which no trading actually occurred. This can arise from vendor systems that generate synthetic bars to fill gaps in the record, from incorrect session boundary definitions that attribute activity to the wrong date or session, or from exchange-reported indicative prices being treated as actual trades. A strategy backtested over phantom bars will generate signals and simulated fills at prices that were never available in the market. Unlike erroneous prints, which at least reflect a real (if incorrect) data point, phantom data fabricates trading activity where none existed, and the resulting backtest entries and exits are entirely fictitious. Round-the-clock futures now produce phantom data by construction, because CME’s cryptocurrency futures have traded through the weekend since May 2026, with weekend trades carrying Monday’s trade date (see the section on session hours below). A vendor that builds daily bars by calendar date emits Saturday and Sunday bars that the exchange says don’t exist, while one that follows the trade date emits a fat Monday; both are defensible, and they don’t reconcile.
Well-formed but wrong: Some defects pass every validation rule. The clearest recent case is an issue Databento published in August 2026 (its internal reference is D-8175), affecting CME Globex history from before 21 May 2017, when the data came from the exchange’s older MDP 2.0 feed. On 25 dates between 15 July 2010 and 18 November 2015, most of a day’s activity had been folded into a single bar, and 19 of the 25 dates fall on the 15th of a month. The issue was posted on 10 August 2026, marked “Fix in progress” on 14 September and “Closed” on 26 September 2026.2 Each folded bar is well formed: the high is above the low, the open and close lie between them, and the volume is plausible for a whole day, because it is a whole day. Since the vendor legitimately omits intervals with no trades, a short day is no warning either, and the vendor’s notice was the only way to find these bars. A one-minute bar carrying most of a day’s range invites a simulated fill at a price the market reached only hours later. A companion issue, D-8174, covered 21 dates from 15 July 2010 to 15 September 2015, on which a request for part of a UTC date could come back truncated or empty; the workaround was to request whole UTC days. Most CME Globex products trade from 5:00pm to 4:00pm Chicago time, so the usual request for one session starts partway through one UTC date and ends partway through the next, which is exactly the request the issue describes. An empty response looks like a holiday, and a truncated one looks like a quiet afternoon.
Aggregation errors: A dataset assembled from correct inputs can still be wrong. The CFTC’s Commitments of Traders reports are organised by contract market, so a single positioning figure for an index means adding several markets together. For some groups of interchangeable contracts, including the S&P 500, the Dow and the Nasdaq-100, the CFTC publishes its own consolidated figure under the same commodity code as its members, and a sum over every market with that code counts the members twice. In my own aggregation of the reports for 2010–2026, the consolidation made up a median 19% of S&P 500 open interest, 42% after May 2023, and about a third of the Dow total.3 Units change too: from the report of 2 May 2023 the S&P 500 consolidation has been stated in E-minis rather than full-size contracts, so consolidated open interest jumped from 646,894 on 25 April to 3,278,182 on 2 May, while E-mini open interest went only from 3,234,472 to 3,248,741. The codes themselves move, and 25 contract codes were reclassified between 2010 and 2026, among them 21 crypto contracts moved to a new code in August 2025 and mostly moved back in January 2026, which took total Bitcoin open interest from 149,828 on 5 August 2025 to 29,158 a week later and to 206,530 by 27 January 2026. From June 2026 two dividend-index futures have been filed under the S&P 500 code, and they account for 719,000 of an 892,000-contract jump in the S&P 500 total in the week of 2 June 2026. Even the choice of report matters: leveraged funds’ net position in Euro FX futures has opposite signs in the futures-only and the combined reports in 86 of 845 weeks. None of this produces a malformed row, and every figure is the CFTC’s own.
Calendar and construction artefacts: Long histories carry the marks of how they were assembled. Ken French’s daily market returns, built from CRSP, contain 1,158 NYSE Saturday sessions, the last on 24 May 1952, so a year then had about 300 sessions against about 252 now. Annualising 1930s returns with 252 understates that decade’s return by about a sixth and its volatility and Sharpe ratio by about 8%, and nothing flags the error. CRSP’s daily files cover only the NYSE before July 1962; AMEX stocks join on 2 July 1962 and Nasdaq stocks on 14 December 1972. The S&P 500 was launched on 4 March 1957; before that, S&P’s daily index was the 90-stock Composite, and S&P Dow Jones Indices says that figures from before an index’s launch date are back-tested. Shiller’s long series uses monthly averages of daily prices, and Working (1960) showed that averaging a random walk creates a spurious first-order autocorrelation of about 0.25. The CFTC’s Traders in Financial Futures history before 2010 was backfilled using later classifications of traders, and the CFTC says it becomes less accurate the further back it goes. Stale prices make an index appear to trend, because the quiet stocks catch up tomorrow with what the busy ones did today: in the French size portfolios, the smallest tenth of stocks had a lag-1 autocorrelation of 0.49 in the 1970s, against 0.22 for the largest.4
These errors turn up routinely, and data vendor infrastructure and processing pipelines are themselves significant and demonstrably provable sources of error. Vendors aggregate data from multiple exchange feeds, apply their own session definitions, normalise timestamps across time zones, construct continuous contracts, and backfill historical records. Each step introduces opportunities for systematic errors that propagate silently into every downstream backtest. When these errors are identified and reported to vendors, the response is frequently inadequate: errors are acknowledged but not corrected, or corrections are applied only to newly delivered data while the historical record remains contaminated. This may seem implausible, but vendors serving a retail client base that rarely audits data quality have little incentive to invest in the engineering effort required to correct historical records. Traders end up developing and evaluating strategies on data that the vendor itself knows to be defective.5 TradeStation is one example: data-integrity problems raised on its own forum in 2020 were still unresolved in 2024, when the company acknowledged them with the defence that “This problem is not an easy fix.”6 Databento is the counter-example, since it publishes data-integrity issues with their affected dates, causes and status, and exposes dataset conditions and modification dates through its API, so a researcher can identify degraded dates and decide whether affected research needs rerunning.7
Errors do not only flatter, and a correction carries a cost of its own. A correction rewrites history, so anyone who downloaded the affected dates before it was applied still holds the old version and has to find out which results it touched. Faulty data can push a research decision either way: a folded or phantom bar can hand a breakout rule an entry it could never have had and keep a strategy that should have been ruled out, while the same bar can trigger every stop at once and reject a strategy that should have survived. The two mistakes don’t cost the same, because a strategy wrongly kept reveals itself, expensively, in live trading, whereas a strategy wrongly rejected never comes back.
I want to be blunt about this: the trader who assumes that commercially distributed data has been rigorously validated is making an assumption that is demonstrably false.
Cryptocurrency markets are a worse case again. Many crypto venues engage in wash trading: fabricated volume reported to inflate apparent liquidity. Credible analyses have estimated that a large fraction of reported crypto volume, even on major exchanges, is non-genuine. A backtest that uses reported volume for signal confirmation or liquidity estimation may be building on data that is, in a meaningful sense, fictional. This differs in kind from the erroneous prints and timestamp errors discussed above, because here the data is wrong by design.
The April 2020 WTI crude oil event, in which the May 2020 contract settled at $-37.63 per barrel, exposed a related class of data assumption that few traders had considered. Negative prices broke systems at every level: brokers could not process them, trading platforms rejected them, and data feeds that stored prices as unsigned values simply could not represent them. The event has since been incorporated into historical data sets, but vendors differ in how they handle it. Some report the negative settlement correctly; others clip it to zero or omit the session entirely. Any of these choices contaminates a backtest differently. What this exposed is that data schemas encode implicit assumptions about what prices can be, and those assumptions are occasionally wrong.
2.2 Vendor Divergence and Database Drift
The taxonomy above describes categories of error in the abstract. A more direct way to see the problem is to run an identical strategy against multiple vendors' data and compare the results. Concretum Group did exactly this: they ran the same Opening Range Breakout strategy, with the same code, the same parameters, and the same nominal time period, against intraday data from five providers (Polygon, Interactive Brokers, Databento, IQFeed, and Alpaca). The terminal portfolio value ranged from roughly $226,000 to $726,000 depending solely on whose data the engine consumed, a threefold variation in equity from identical code.
The mechanisms behind the divergence map onto the error categories described earlier, but several are worth singling out. Phantom highs and lows: isolated price spikes that appeared in one vendor’s bars and nowhere else, reflecting differences in how each vendor filtered trades for inclusion. Stale bars: extended sequences of unchanged OHLC values, typically the result of dropped ticks or improperly aggregated data. Tick-to-bar assignment ambiguity: trades occurring at exact time boundaries (09:35:00.000 being the canonical case) were assigned to different one-minute bars by different vendors, and the resulting bars contained different OHLC values from vendor to vendor. Early-close day leakage: some vendors continued to emit intraday bars past the official close on half-day sessions while others stopped cleanly. Venue coverage divergence: providers that consolidated from SIP feeds saw a different trade population than providers using their own subsets, and the implied highs, lows, and closes of identical time intervals differed accordingly.
Venue coverage deserves a closer look, because US equity data comes through two supply chains. Under Regulation NMS every exchange reports its quotes and trades to one of two securities information processors (SIPs), each governed by an industry plan: the CTA/CQ Plan for NYSE-listed and other non-Nasdaq listings (Tapes A and B, operated by SIAC) and the UTP Plan for Nasdaq listings (Tape C, operated by Nasdaq). CTS carries trades and CQS carries quotes, and off-exchange trades are reported through FINRA Trade Reporting Facilities (TRFs).8 Every trade carries sale conditions that decide what it is allowed to do. A trade outside regular hours carries the Form T condition and is not last-sale eligible, so it cannot set the official high, low or close, but it does count towards consolidated volume.9 The second chain bypasses the SIP altogether: a collector that captures the exchanges’ direct feeds doesn’t consume the consolidated tape at all. Databento, for example, sources its US equity data directly from each exchange across 18 datasets, with up to four timestamps per event, and builds its EQUS.SUMMARY dataset to maximise CTA and UTP coverage across exchanges and ATSs.10 Two vendors can therefore disagree about a bar’s high and low because they started from different trade populations and applied different sale-condition filters, without either of them being in error.
The amplification effect documented in the Concretum study is itself a useful diagnostic. Strategies whose stops were anchored to intraday highs and lows showed extreme dispersion across vendors. Strategies whose stops were anchored to ATR, a quantity derived from daily ranges with substantial smoothing, converged tightly across the same vendors. If a backtest’s behaviour is sensitive to which vendor’s intraday bars happened to be on the disk that day, the strategy is implicitly trading data-pipeline noise dressed up as a market signal. Running the same code against an independent source is one of the cheapest sanity checks available, and few traders bother.
A related and equally damaging problem is temporal drift in a single vendor’s data. The Concretum authors compared their own archive of Interactive Brokers minute bars from 2023 against a fresh download from the same vendor in 2026 for the same instrument and the same dates. Where the 2023 copy showed continuous price movement across the session, the 2026 copy, from the same vendor and the same query, contained more than 350 out of 390 one-minute bars with zero variation. Whatever pipeline change caused the divergence, the practical consequence is that any backtest result obtained against a third-party feed is reproducible only if the dataset is archived at the time the backtest is run. Re-running the same code against the same vendor a year later may produce different results because the data has been silently rewritten in between. The retail back-tester who treats the vendor’s database as a stable historical record is making an assumption the vendor itself does not honour.
Vendors differ in how openly they rewrite. Norgate, a curator that sells a reference layer of delisted securities, historical index constituents and corporate-action adjustments, states that corrections from its upstream suppliers flow through automatically and continuously to a subscriber’s local database, with no notification and no versioning, so the history a researcher backtested against last quarter cannot be reconstructed.11 Databento, a collector, publishes its data-integrity issues and exposes dataset conditions and modification dates,7 although a closed issue is not necessarily a fixed one. And a correction is itself a rewrite: anyone who downloaded the D-8174 or D-8175 dates described above before 26 September 2026 holds different bars from anyone who downloads them now.
The remedy is to make every backtest replayable. Give each run an identifier, and freeze everything it consumed: the market data and reference data, the engine, strategy and configuration versions, the random seed, and the event ordering (a seed will not cure inconsistent ordering in parallel processing). The first check is to replay the saved run against its frozen inputs; if the result changes, the fault lies in the researcher’s own software or environment. Next, download the same historical range again and compare it with the archived copy record by record, because a hash can only say that something differs, whereas a record-level comparison says which bars or reference values changed. Then run the frozen strategy on the new data as a separate experiment, so that a changed trade can be traced to the changed observation behind it. All of this should be automated and run after every data update.
Alongside it, keep a research log of decisions, including the strategies rejected and why, with the data version each test used. When a vendor publishes a correction, check its dates against the log and rerun the affected tests, rejected ones included. D-8175 touched only 25 of roughly 1,350 trading days in its span, which sounds harmless, but drawdown limits and worst-day filters live in the tails, and a couple of bad days is enough to fail an idea on maximum drawdown alone. If the strategy depends on intraday extremes, also run it against at least one independent source. None of this is technically demanding; it is, again, a discipline issue, and it is not done because the retail ecosystem assumes the data is fine.
Long histories are often stitched together from several vendors, which creates errors of its own. Concatenating overlapping histories double counts the overlap, and a bar built across a change of source is a bar that neither vendor delivered. A comparison between vendors means something only on the same dated contract, session, interval and timestamp convention, and the daylight-saving weeks deserve particular attention. A change in strategy performance at a vendor boundary should be investigated as a possible data artefact before it is called a regime change. And a request for a finer interval than the source’s native resolution should fail, because one-minute bars cannot be divided into five-second bars without inventing prices for which there is no evidence.
2.3 Historical Trading Venue Transitions
An underappreciated data quality problem in futures markets arises from the historical transition in trading venues. Many futures contracts have passed through three distinct eras: a pit-only era in which all trading occurred on exchange floors via open outcry; a transitional era in which pit and electronic trading coexisted, often with different session hours, different liquidity profiles, and occasionally different price discovery characteristics; and the current electronic-only era in which the pit has been entirely eliminated.
Each era produces data with very different properties. Pit-only data typically reflects shorter trading sessions with different volatility patterns, wider effective spreads, and reporting latencies that can affect the accuracy of recorded timestamps. During the transitional period, the relationship between pit and electronic prices was not always simple; the pit session and the electronic session could trade at different prices, and the “official” settlement price might be derived from one venue while most executable liquidity resided in the other. The electronic-only era brought entirely different order book dynamics and, for most contracts, near-continuous trading hours, but not for all of them. The livestock contracts went the other way: live cattle traded about 97 hours a week on CME Globex before October 2014 and about 23 from February 2016, after the move to electronic trading (see the next section).
These eras are not interchangeable, and a backtest that treats a twenty- or thirty-year futures history as a homogeneous data set is implicitly assuming that the microstructure of 1995 is comparable to that of 2025. In reality, a strategy that would have been executable in the electronic era may have been impractical in the pit era due to execution delays and wider spreads, quite apart from the impossibility of automated order placement. Conversely, strategies that exploited inefficiencies specific to open-outcry markets (such as the predictable patterns around pit opening and closing) ceased to function when the trading floor was eliminated. Failing to segment historical data by venue regime, or at minimum to acknowledge the structural breaks that venue transitions introduce, can produce backtest results that reflect no single coherent market environment.
The S&P 500 futures complex shows how the eras overlap. S&P 500 futures began trading in the CME pit on 21 April 1982, with options on them from January 1983. CME Globex launched on 25 June 1992 with four contracts, trading after the pits had closed, and the E-mini S&P 500 launched on 9 September 1997 and traded nearly round the clock from the start.12 Hasbrouck (2003) found that by 2000 most of the price discovery in S&P 500 futures was happening in the E-mini. CME closed its equity-index futures pits on 19 June 2015, except for the full-size S&P 500 contract, and most of its other futures pits on 2 July 2015. The Chicago trading floor closed as a precaution at the close of business on Friday 13 March 2020 and never reopened, and the full-size S&P 500 contracts were delisted after 17 September 2021.13
Before July 2015, then, the electronic tape was only a partial view of the market. Around 40% of live cattle volume still went through the pit in the months before 6 July 2015, the livestock pits’ first session without open outcry.14 A session boundary derived from Globex bars in 2013 is the boundary of the electronic market: the right one for backtesting an electronically executed strategy, and the wrong one for a claim about what the market did. A volume-based roll rule applied to those bars is choosing on a minority of the trade. Older bars carry a further warning, because Databento’s CME history begins in mid-2010 and earlier bars have to come from vendors such as Tick Data or FirstRate, which had already applied their own session filters. Session-filtered bars tell the researcher what the vendor thought the exchange’s session was, which is the very thing that needs auditing.
US equities have their own dated breaks, each of which changed what a bar means. In 1975 the Securities Acts Amendments directed the SEC to facilitate a national market system, and the consolidated tape followed. The Order Handling Rules of 1997 gave electronic communication networks a real share of volume, after which quoted spreads narrowed sharply. Regulation ATS (1998) created the category that most dark pools occupy today, and decimalisation in 2001 cut the minimum spread by about an order of magnitude. Regulation NMS (2005) took the market from a few venues to 16 exchanges and dozens of ATSs, and the Market Data Infrastructure Rule followed in 2020. Blue Ocean ATS launched in 2021 and by late 2025 handled about 83% of overnight volume, trading from 8:00pm to 4:00am ET, Sunday to Thursday.15 Settlement moved to T+1 in 2024, and on 29 June 2026 the NSCC went live with 24x5 clearing.16 If a history spans any of these dates, the meaning of a bar changes somewhere inside it.
It would be as much a mistake to assume that everything has changed as to assume that nothing has. On ES one-minute data from June 2010 to September 2026 (Databento), several features of the session have been strikingly stable. In every year since 2010 the overnight session set the full session’s high or low on 71–86% of days, and the overnight range was 58–69% of the full session’s range. From 2013, when my volume measure starts, the day session’s share of front-month volume stayed between 79% and 85%. The cash session’s high or low was set in its first hour on 70–75% of days, and about 60% of opening gaps were back at the previous 3:00pm CT price by the cash close. These are measurements on one instrument, but for questions about the overnight session, the opening hour or gaps in ES, 16 years of data really is 16 years of the same market. The rule is to measure each question, and to assume nothing in either direction.
2.4 Session Hours Are Dated Facts
Session hours are dated facts, although most systems store them as reference data, a single row per instrument copied from the exchange’s website. Exchanges change their hours by dated notice, per venue and product family, more often than most traders remember, and a registry that holds only today’s hours silently restates every earlier year under today’s rules.
2.4.1 Livestock and grains
Live cattle, feeder cattle and lean hogs show how far the hours can move.17
| Effective | CME Globex session for live cattle, feeder cattle and lean hogs (CT) | Hours per week |
|---|---|---|
| Before 27 October 2014 | Monday 9:05am open, then near-continuous with an hour’s halt each afternoon; Friday close 1:55pm | about 97 |
| 27 October 2014 | Monday 9:05am to 4:00pm; Tuesday to Thursday 8:00am to 4:00pm; Friday 8:00am to 1:55pm | about 37 |
| 29 February 2016 | Monday to Friday, 8:30am to 1:05pm | about 23 |
A registry that holds one row with today’s hours, applied to 2013, keeps under a quarter of the tape and throws away the rest, including every overnight print. Nothing is malformed, so nothing complains; the session filter simply returns fewer bars.
The CBOT grains were nearly as busy. Corn, soybeans and wheat changed session four times between May 2012 and July 2015, twice within a single month, and the day session’s open moved from 9:30am to 8:30am along the way. In May 2012 they traded from 6:00pm to 7:15am and from 9:30am to 1:15pm CT. ICE then launched competing grain contracts on a 22-hour day, and CME, having announced 22 hours in reply, settled on 21 hours, from 5:00pm to 2:00pm CT, effective 20 May 2012. From the trade date of 8 April 2013 the hours were cut back to 7:00pm to 7:45am, a 45-minute pause, and 8:30am to 1:15pm CT.18 Whether the market was open when the USDA released its crop reports changed with each switch, so a strategy that trades around those reports was trading a different event in each regime.
2.4.2 Equity-index futures and Eurex
Under CME Clearing Advisory 12-423, effective 18 November 2012, the Globex close for equity-index futures moved from 3:15pm to 4:15pm CT, with a 3:15–3:30pm halt inside the trade date. The halt survived until it was removed, effective 28 June 2021.19 The settlement moved on its own timetable: until September 2020, ES settled off the volume-weighted average price of trades between 3:14:30 and 3:15:00pm CT, and CME’s Special Executive Report SER-8591 of 22 September 2020 moved the window to 2:59:30–3:00:00pm CT, to synchronise it with the cash equity close.20 An ES settlement from 2017 and one from 2021 are therefore struck 15 minutes apart.
Eurex moved the open for its most liquid index and bond futures, the DAX among them, to 1:00am CET on 10 December 2018; before that, every Eurex product opened at 8:00am.21 A backtest of the DAX future over 2015–2020 under today’s session claims seven hours a day of trading that did not exist for the first four years.
2.4.3 The trading week
The set of days on which there is a session is a dated fact too. Until 1952 the NYSE also traded on Saturday mornings, so a year had about 300 sessions: Ken French’s daily market returns, built from CRSP, have 301 in 1935, and 51 of them are Saturdays. The exchange closed on Saturdays each summer from 1945, held its last Saturday session on 24 May 1952, and moved to a five-day week from 29 September 1952, extending the weekday session to 3:30pm to make up the time. It also closed for holidays it no longer observes, among them Lincoln’s Birthday, Columbus Day and Armistice Day until 1953 and Election Day until 1968, and from June to December 1968 it shut every Wednesday to clear a paperwork backlog.22
The tools do not agree on any of this.23 Yahoo Finance’s ^GSPC history for
1935 has 250 rows and no Saturdays, so each Saturday’s move is folded into
Monday’s close-to-close return. The pandas_market_calendars NYSE calendar has
all 301 sessions, with Saturdays running from 10:00am to noon.
exchange_calendars 4.13.2, the calendar library behind zipline-reloaded,
gives a plain Monday-to-Friday year of 261 sessions for 1935, including days
when the exchange was shut. MATLAB’s nyseclosures assumes a six-day week
before 29 September 1952 by default, while its holidays function assumes five.
The business-day functions in pandas and numpy count 261, and performance
libraries such as quantstats and empyrical annualise daily returns with 252
unless told otherwise. Each of these choices changes a backtest without
producing a single error, and day-of-week results change most. On the real
calendar, from July 1926 to May 1952, Monday’s average return in the French
daily data was −19.6 basis points (t = −5.1). On weekday-only bars, where Monday
absorbs Saturday’s return, the same Mondays average −8.2 basis points (t =
−1.7), and a strongly significant effect turns into noise.
2.4.4 Round-the-clock trading
CME’s cryptocurrency futures and options have traded continuously since 4:00pm CT on Friday 29 May 2026, with a weekday pause from 4:00 to 4:02pm CT and a maintenance window from 2:00 to 4:00am CT on Saturday, and more than 7,200 contracts traded over the first weekend. Trades from Friday evening to Sunday evening carry Monday’s trade date, so Monday’s daily bar covers about 70 hours of trading against Tuesday’s 24, and there is no weekend settlement.24 Any daily-bar statistic on these contracts now carries a day-of-week artefact that the exchange put there, and a comparison of Monday bars before and after 29 May compares two different objects. CME has since announced round-the-clock trading for its 1-ounce gold futures from 26 July 2026 and for a new 10-barrel WTI contract from 30 August 2026, both pending regulatory review.25 US equities follow on 6 December 2026, when they move to a 23-hour trading day and the trading date stops agreeing with the calendar date; the next section describes that change.
2.4.5 What a session registry needs
A registry that can hold all of this needs, for each session, an effective-from
date, a timezone of its own rather than one inherited from the venue, the
exchange notice that established the hours, and a settlement window recorded
separately from the session. The timezone matters more than it looks, because
ICE’s New York softs (sugar, coffee and cocoa) open and settle on London time,
and for the three or four weeks a year when US and UK daylight saving differ,
ICE issues a notice moving the New York opening times by an hour.26 A single
session string in America/New_York is right for about 48 weeks a year and
wrong for the rest. Placeholders are the other hazard: in the session registry
of my own futures archive, 36 of 43 CME roots carried 0830-1600 as their
regular trading hours, which is the daytime portion of Globex and nothing more,
so any code that treated that column as the liquid part of the day was using a
placeholder.
The researcher’s own bars are a better witness than any registry. For each root and trade date, take the first and last minute with volume, in venue-local time. Track the modal boundary over a rolling 20-session window, and record a change point whenever it shifts by more than a bar and stays shifted. The change points should land on the exchange’s effective dates; where they do not, trust the tape and look for the notice that was missed. Then assert the invariants: extended hours contain regular hours, no traded bar falls outside the session for its trade date, and each session leg is longer than zero and shorter than a day. These are cheap to check, and when I first checked them, three roots in my own registry had an extended session that ended before their regular session did.
2.4.6 The day session is a vendor convention
Futures traders have long distinguished the full electronic session from the “day” or regular-trading-hours session: the old pit hours, which outlived the pits and still carry most of the volume. The window differs by product, because each pit kept its own hours.27
| Product | Exchange | Day session (ET) | Full session (ET) |
|---|---|---|---|
| E-mini S&P 500 (ES) | CME | 9:30am–4:15pm | 6:00pm–5:00pm |
| WTI crude (CL) | NYMEX | 9:00am–2:30pm | 6:00pm–5:00pm |
| 10-year note (ZN) | CBOT | 8:20am–3:00pm | 6:00pm–5:00pm |
| Gold (GC) | COMEX | 8:20am–1:30pm | 6:00pm–5:00pm |
| Corn (ZC) | CBOT | 9:30am–2:20pm | 8:00pm–8:45am, then 9:30am–2:20pm |
Each broker and vendor keeps this table for itself, and implements it differently. Interactive Brokers’ historical data call takes a regular-hours-only flag, CSI and Barchart sell day-session and full-session series as separate products, and TradeStation uses session templates. Two daily ES series from two vendors can differ in open, high, low, close and volume, and both be correct. The quickest way to see how much of a bar is convention is to pull one ES date from IBKR with the regular-hours flag on, then off, and compare the two rows.
2.5 The 6 December 2026 Equity Change
US equities are about to go through what futures went through between 1992 and 2013. On 6 December 2026 the securities information processors extend to a 23-hour day. The CTA and UTP plan amendments were filed in January 2026 and approved on 26 June, the launch calendar was published on 7 July, and a pre-launch testing period runs from 8 November to 5 December 2026, with test symbols only.28
Nasdaq’s session runs from 9:00pm to 8:00pm ET as one trading day, with a pause from 8:00 to 9:00pm, and keeps the regular 9:30am–4:00pm session and closing auction. Trades from 9:00pm to midnight carry the next trading date, for volume as well as price, so the trading day labelled Monday starts at 9:00pm on Sunday, and midnight in New York no longer starts a new trading day.29 In the launch week:
| Execution time in New York (EST) | Same instant in UTC | Nasdaq trading date |
|---|---|---|
| Sunday 6 December, 9:30pm | 7 December, 2:30am | Monday 7 December |
| Monday 7 December, 12:30am | 7 December, 5:30am | Monday 7 December |
| Monday 7 December, 7:30pm | 8 December, 12:30am | Monday 7 December |
| Monday 7 December, 9:30pm | 8 December, 2:30am | Tuesday 8 December |
Monday’s session spans two New York calendar dates and two UTC dates. In Melbourne it runs from 1:00pm Monday to noon Tuesday AEDT, and that conversion changes with daylight saving.
Prices and volume will behave differently across the cutover, because Form T still applies overnight: overnight trades can’t set the open, high, low or close, but they do count in volume.30 The result should be a level shift in volume with no matching shift in price. Norgate’s stated rule, that only regular last-sale-eligible trades during regular hours contribute to OHLC while volume also includes pre-market and post-market trades, implies exactly that, although Norgate itself has said nothing either way.11
Orders and corporate actions are affected as well. For orders, Nasdaq cancels outstanding overnight orders at 4:00am, although the trading date continues, so a backtest must allow for that cancellation when deciding whether a later trade could have filled an order.31 Nasdaq’s proposed handling of certain corporate actions would halt affected securities before 9:00pm on the evening before their effective date and reopen them at 8:00am.32 Listing exchanges must deliver their daily XML files (corporate actions, adjusted closing prices and overnight price bands) by 8:00pm, which leaves 55 minutes of processing before the session starts, with a documented degraded mode if a file is late.30 After a Monday exchange holiday, the market reopens on Monday evening.29
Participation is optional: every listing exchange must support the overnight session, but none is required to trade in it, so the overnight NBBO comes only from the venues that opt in. As a backstop, the SEC granted 24X a conditional exemption on 7 August 2026, effective 24 January 2027, which applies only if the SIPs miss the December date.28 NYSE Arca plans the same start as Nasdaq, and the other NYSE Group equity exchanges keep their current schedules.29
The rules for the data follow from all this: key equity data by the exchange trading date, and keep the execution timestamp for sequencing events, so that a change of date label never changes when a trade happened, and version the session definition with an effective-from date, so that 2015 is never restated under December’s rules.
2.6 Look-Ahead Bias and Data Asynchronicity
Look-ahead bias is among the most dangerous classes of data error: the implicit assumption that information was available at a time before it actually existed. The most obvious forms (using a future price to calculate a current signal) are easily avoided. But subtler forms pervade standard datasets and are invisible to the researcher who does not understand the provenance of the data.
The timestamp convention of a bar is the simplest example. Databento labels its OHLCV bars with their opening time, while other vendors label bars at their close.1 If the row labelled 10:00 holds the high, low and close of the minute that follows, a backtester that releases the completed row at 10:00 has given the strategy a minute of future information.
Slower data has longer delays, and the CFTC’s Commitments of Traders reports are a clear case: they describe positions on Tuesday and are published on Friday at 3:30pm ET, so figures placed against Tuesday give a strategy several days' notice of information it could not have had. Even a rule that always moves the figures to Friday gets some weeks wrong. By my own count against the CFTC’s release dates, 90 of 816 reports over 16 years missed the usual Friday release, delayed by holiday Mondays, by government shutdowns and by the ION cyber incident of 2023, the longest by 47 days, and a Friday rule stamps all of them before they were published.33
Economic data has the same problem on a larger scale. FRED dates each value by the period it describes, so a join on observation date delivers quarterly figures a median 119 days before they were released, monthly figures 34 to 68 days early, weekly figures five to 12 days early and daily figures a business day early (my comparison of FRED observation dates with the date each value was first released). Revisions make it worse, because today’s download may hold a later estimate for an old quarter, and only vintages, which ALFRED provides, reconstruct what was known at the time.34 Walk-forward testing does not catch any of this, because it repeats the leak at every step.
The 23-hour equity session creates a new form of the same trap. After 6 December 2026 a completed full-session bar labelled Monday is not finished until 8:00pm on Monday, so a backtester that hands it to a strategy at the regular close has supplied four hours of future information. Official figures have their own publication times, and a roll rule that uses official volume must wait until the exchange has published it. Corrections arrive late too: under the new schedule FINRA’s TRFs accept Prior Day messages, carrying the previous session’s unreported, cancelled or corrected trades, from 9:00pm, so corrections to Monday arrive while Tuesday is already trading.30
Market closing times introduce a related form of asynchronicity. European equity markets close several hours before U.S. markets, and Asian markets are closed before New York opens. Without relatively sophisticated data management, a strategy that uses daily closing prices across multiple regions may be implicitly assuming these prices are contemporaneous, when in fact they may be separated by half a day or more. A major U.S. market move in the final hours of the New York session will not be reflected in that day’s European or Asian close, creating spurious correlations and false arbitrage signals in the historical record. The retail back-tester working with a simple table of daily closes, one column per market, will see none of this.
The same asynchronicity exists between a futures contract and its underlying. Until September 2020 the ES settlement was struck from trades between 3:14:30 and 3:15:00pm CT, a quarter of an hour after the cash equity close at 3:00pm CT (4:00pm ET), and SER-8591 then moved it to 2:59:30–3:00:00pm CT.20 Globex keeps trading after the settlement, so the session’s last trade and the settlement price are separated by an hour of trading (45 minutes before September 2020), and a daily ES bar whose close is the last print is contemporaneous with neither the settlement nor the cash index close (see Section 4.3). From December 2026 the constituents of US indices will trade 23 hours a day, but index providers have not committed to overnight calculation,28 and listed options will not trade from 9:00pm to 4:00am, because the options exchanges are keeping their current schedules.35 And for CME’s round-the-clock cryptocurrency futures, Friday’s settlement stands through the weekend while the price moves.
Even within a single market, the treatment of missing data introduces silent errors. Most database systems assign a value of zero to a missing data point. A price of zero implies total loss, whereas an unknown price means only that no data were received. (Most spreadsheet software, incidentally, makes the same conflation.) A system that fails to distinguish between these two states can generate catastrophic false signals: a moving average calculated over a series that includes a spurious zero will produce a wildly distorted output, potentially triggering large trades based on data that never existed. Institutional data operations invest substantial effort in distinguishing between “zero” and “blank” across every field and every timestamp in their databases. The retail trader downloading a CSV file has no such safeguard. Nor is the conflation confined to spreadsheets and CSV files: at least one backtesting product on sale today documents that a formula that cannot be evaluated returns zero, which turns an undefined value into a silent zero that looks like a real one.
2.7 Survivorship and Selection Bias
Survivorship bias is well-documented in the academic literature on equity backtesting, but its effects extend beyond equities and beyond the commonly discussed problem of universe selection. In futures markets, contracts are periodically delisted or their specifications significantly altered. Commodity markets that no longer trade, or that have been restructured (such as the transition from open-outcry to electronic trading, which transformed market microstructure), are often absent from freely available data sets. A universe of instruments constructed from those currently trading implicitly excludes instruments that failed or were delisted, biasing results towards markets that happened to persist.
Survivorship also depends on instrument identity, because tickers change and get
reused. Meta Platforms changed its Nasdaq ticker from FB to META on 9 June
2022, with its Class A CUSIP unchanged. Earlier that year, Roundhill’s metaverse
ETF on NYSE Arca had traded as META until it became METV on 31 January
2022.36 Treating the rename as the birth of a new security throws away valid
history, while joining everything called META splices an ETF’s prices into a
technology company’s record. A backtest needs a persistent identity behind each
name, with dated mappings that record when each name was valid. Before spending
much time on an equity model, ask how the data provider handles delisted
securities. Norgate, for example, offers delisted NYSE securities back to 1950,
daily historical index constituents, a stable assetid that survives symbol
changes, and continuation of a security’s history after it moves to OTC
trading.11
Survivorship operates at the level of whole markets as well. Jorion and Goetzmann (1999) found that real US equity price gains of 4.3% a year from 1921 to 1996 compared with a median of 0.8% across 39 markets, which makes a century of US data the history of the market that won. Dimson, Marsh and Staunton (2026), with 126 years of returns from 35 markets, found premiums negative over whole decades in 22% of country-decades.
However, survivorship bias does its most damage later, when the researcher interprets the backtest output. When a strategy is tested across a large universe of instruments, the temptation to focus on the subset that performed well is almost impossible to resist. A researcher who tests a mean-reversion strategy on 50 futures contracts and finds that it is profitable on 12 of them faces a choice: report the aggregate results across all 50 (which may be mediocre or negative), or present the 12 “validating” instruments as the strategy’s target universe, implicitly discarding the 38 that failed to confirm the hypothesis. The latter approach produces a survivorship-biased result that overstates expected performance, even if each individual backtest is technically correct.
This problem is amplified considerably by what might be called the algorithmic generator approach, the trading equivalent of the infinite monkey theorem. Given sufficient computational resources, it is easy to generate thousands or even millions of strategy variants by systematically permuting parameters, indicator combinations, entry and exit rules, and filter conditions. Among a sufficiently large population of random strategies, some will inevitably show impressive backtested performance purely by chance. The probability of finding at least one strategy with apparently excellent performance metrics approaches certainty as the number of variants tested increases, regardless of whether any genuine edge exists in the underlying logic.
The survivorship bias in this context is severe: out of a million generated strategies, the few hundred that survived the performance filter are presented as discoveries, when they are in fact the expected tail outcomes of a large random sample. The strategies that emerge from such processes are frequently characterised by opaque combinations of indicators, filters, conditions, and timing rules that have no coherent theoretical basis, a phenomenon that could be referred to as “indicator soup.”37 The resulting rules may appear sophisticated, but their complexity is an artefact of overfitting rather than evidence of genuine market insight. Without rigorous correction for the number of strategies tested (a correction that is almost never applied in practice), such results are meaningless. This is worse than it sounds, because the researcher is often not fully aware of the number of implicit comparisons made, as is often the case when iterative manual refinement substitutes for explicit combinatorial search. Even a researcher who does not deliberately generate thousands of variants may, through repeated adjustment and re-testing, effectively sample a large strategy space while believing they have tested only a handful of ideas.
A common belief is that the problems of overfitting and survivorship bias in strategy generation can be adequately addressed by reserving a separate out-of-sample period or by employing walk-forward analysis. These techniques improve on naive in-sample-only evaluation, but they do not eliminate the problem. When a large number of strategy variants are subjected to an out-of-sample filter, the variants that pass may simply be those that happened to fit the noise in the out-of-sample period as well as the in-sample period. The out-of-sample test, in effect, becomes another selection criterion in a multi-stage filtering process, and the strategies that survive all stages may simply be those whose particular pattern of overfitting happened to generalise to the specific out-of-sample window chosen. Walk-forward analysis mitigates this to some degree by using multiple out-of-sample windows, but it remains vulnerable when the number of candidate strategies is large relative to the effective degrees of freedom in the data. The reassurance that “it passed out-of-sample testing” is less meaningful than it appears.
A subtler failure mode occurs when the researcher iterates between in-sample and out-of-sample periods. A model is fitted in-sample, tested out-of-sample, found wanting, revised based on what was learned from the out-of-sample failure, re-fitted, and re-tested. Each iteration effectively contaminates the out-of-sample data, converting it into a second in-sample period. The researcher believes the final model was validated on unseen data, but the data were not truly unseen: they were examined and used to inform model revisions. This iterative contamination is nearly universal in practice and is rarely acknowledged.
The problem runs deeper still, because an experienced researcher who has tested many strategies over many years develops familiarity with the major events and regime shifts in the historical record: the 1987 crash, the internet bubble, the 2008 financial crisis, the 2020 pandemic sell-off. This familiarity means that even a nominally “fresh” out-of-sample test is compromised: the researcher already knows, at least broadly, what happened during the test period and will unconsciously or consciously design models and select parameters that accommodate those known events. Institutional quantitative firms recognise this problem and take countermeasures that range from separating the strategy research function from the strategy selection function to physically withholding portions of the database from researchers, so that the researcher cannot know what data will be used for out-of-sample validation. Some firms go further, randomising which portions of the data are used for fitting versus testing, or having independent teams conduct the validation. The retail back-tester, working alone with a single dataset and full knowledge of the historical record, has no access to any of these institutional safeguards and is therefore maximally exposed to this form of look-ahead bias.
The underlying methodological failure is an inversion of the scientific method. Properly conducted research begins with a theory derived from observation, deduces testable consequences, and then seeks to falsify those consequences to find evidence that the theory is wrong. A theory that survives repeated attempts at falsification gains credibility, but it is never “proved.” The retail backtesting workflow inverts this process entirely: the researcher searches for parameters that produce attractive historical performance, seeking confirmation rather than falsification.
The distinction matters because seeking confirmation is trivially easy in a noisy dataset with many degrees of freedom; any sufficiently flexible model can be made to fit historical data. Seeking falsification is hard, and it is the hardness that gives the surviving theories their value. A backtest that begins with the question “does this combination of parameters make money?” rather than “under what conditions would this theory fail, and does the evidence show those conditions?” is engaging in a sophisticated form of confirmation bias.
A concrete and timely illustration of this failure mode can be seen in the recent proliferation of gold trading strategies among retail systematic traders. Gold reached a succession of all-time highs in 2024 and 2025, and the result has been a predictable surge of interest in developing gold-specific strategies.38 The aspiring trader, having watched gold’s ascent in real time, decides to build a trend-following or breakout system for the gold futures market. They obtain twenty years of historical data, reserve the most recent two or three years as an out-of-sample holdout, fit their model to the earlier period, and then validate it against the withheld data. The out-of-sample period, which happens to coincide with one of the strongest gold rallies in history, produces impressive results, and the trader concludes that the strategy has been rigorously validated on unseen data.
But the entire exercise is contaminated by a form of look-ahead bias that no amount of out-of-sample discipline can correct. The decision to build a gold strategy in the first place was made because gold had recently performed spectacularly well. The trader did not, in 2015 or 2018, survey the universe of tradeable futures markets and select gold on theoretical grounds; the trader selected gold in 2025, with full knowledge that it had reached record highs, and then tested a strategy designed to capture trending behaviour against a holdout period that they already knew (perhaps just subconsciously) contained a powerful trend. What the out-of-sample test measures is whether a trend-following strategy makes money during a period the trader already knows was dominated by a trend, and the answer is almost guaranteed to be yes, which tells the trader almost nothing about the strategy’s forward viability.
The self-deception is compounded by a failure of counterfactual honesty. The trader must ask: had they been trading this strategy live over the full historical period, would they have persisted through the years when gold went essentially nowhere? Gold spent much of 2013 through 2019 in a broad range, delivering the kind of choppy, mean-reverting price action that is maximally punishing for trend-following systems. A live trader living through several years of whipsaws and negligible returns would face enormous psychological pressure to abandon the strategy, and most would.
The backtest, however, glides serenely through this period because the trader viewing the historical equity curve already knows that the payoff is coming. The backtested return includes the years of frustration as though they were costless to endure; in practice, they are anything but. The strategy that “works” over twenty years of history is, for most human traders, untradeable over the difficult middle years that make the long-term return possible.
This pattern (selecting an instrument after observing its recent success, fitting a strategy to its historical data, “validating” the strategy on a holdout period that the trader already knows was favourable, and then treating the result as evidence of a real edge) is among the most common and most damaging mistakes made by novice systematic traders, and among the hardest to detect, because every individual step in the process appears methodologically sound. The data were split properly; the out-of-sample period was genuinely withheld; the strategy was not re-fitted after seeing the holdout results. But the fatal contamination occurred before any of these steps, at the moment the trader chose the market.
No statistical technique can correct for an instrument selection decision that was itself driven by knowledge of the outcome.
One partial countermeasure, available in some backtesting frameworks but rarely employed by retail traders, is logarithmic detrending of the price series before evaluation. Detrending mathematically removes the dominant directional trend from the historical data, leaving only the deviations around that trend for the strategy to exploit. A trend-following strategy tested on detrended gold data cannot profit simply from the secular upward move; it must demonstrate an ability to capture shorter-term directional movements that would exist regardless of the long-term trajectory. If the strategy’s performance collapses on detrended data, this is strong evidence that the apparent edge was nothing more than the underlying trend, the hindsight artefact described above. Detrending does not eliminate all forms of look-ahead bias (the instrument selection problem remains), but it removes the most obvious one: the strategy that appears to work only because the chosen market happened to go up. Despite the simplicity and diagnostic power of this technique, it is almost unknown among retail systematic traders, in part because few of the popular backtesting platforms (including legacy platforms such as TradeStation, which has no built-in detrending capability) offer it as a standard feature, and in part because the trader who has already convinced themselves of their strategy’s robustness has little motivation to apply a test that might disprove it.
2.8 Continuous Contract Construction
For futures-based strategies, the method of constructing continuous price series from individual contract months is a source of substantial variation in backtest results that is rarely discussed in retail contexts. The back-adjusted (or “Panama”) method preserves point-to-point price changes but produces artificial price levels that may become negative for some instruments over long histories. Ratio-adjusted (proportional) methods preserve percentage returns but alter the apparent magnitude of price moves. Unadjusted series preserve actual prices but introduce discontinuities at roll dates.
Each method produces a different equity curve for the same underlying strategy, with the same trades yielding different numbers. More importantly, strategies that depend on absolute price levels (such as those using support and resistance concepts) may produce entirely spurious signals on back-adjusted data, since the price levels in the adjusted series never actually existed in the market. The qualification matters: only the levels are fictitious, and the point-to-point changes are real. A difference-based rule (a moving-average crossover, a breakout, a momentum signal computed on changes) reads the same series correctly, because it keys off increments that the adjustment preserves rather than off an absolute level the adjustment has shifted. A level-based rule does not, and the shift is not even stable: re-anchoring the series on the next roll moves every historical level again, so the same fixed-threshold rule can fire on different bars depending on when the continuous series was built. This anchor-dependence is the more useful diagnostic than the blanket claim that adjusted data is “unreal”: difference-based rules survive it, and level-based rules do not. The choice of roll date, roll method (calendar-based versus volume-based versus open interest-based), and adjustment methodology collectively represent a set of implicit assumptions that many back-testers never examine.
The anchor-dependence is easy to demonstrate with ES. On 10 July 2014 the unadjusted September 2014 ES contract opened at 1967.50. FirstRate’s daily absolute-adjusted series showed 2352.25 for the same open, a shift of +384.75 points, and a Panama reconstruction over 2010–2026 showed 2593.50, a shift of +626.00. Because the reconstruction was anchored at the end of the query window, a query ending in 2014 and one extending to 2026 returned different prices for the same session, and a stop written on the synthetic series was not a stop on the contract the trader actually held. The FirstRate files also had inconsistencies in their adjustment ladder, and their minute and daily series were built with different roll constructions.
A related and frequently overlooked issue is the change in contract specifications and effective notional value over time. Many futures contracts have undergone substantial changes in contract size, tick value, or margin requirements during their history. Even where specifications have remained nominally stable, the notional value of a single contract can change dramatically with price level. A backtest that trades “one contract” of the E-mini S&P 500 throughout a twenty-year history is implicitly treating a position that represented a modest notional exposure at early-2000s price levels as equivalent to one representing more than six times that exposure at 2026 levels. The S&P 500 ended 2001 at 1,148.08, 2002 at 879.82 and 2003 at 1,111.92, while ES traded around 7,400 in 2026. The risk characteristics of the strategy are therefore not constant across the sample period, and position sizing rules calibrated to current contract values will produce misleading results when applied retrospectively to periods when the same contract represented a very different risk exposure.
The S&P 500 futures complex provides a particularly instructive example of this distortion. When the E-mini contract (ES) was introduced in September 1997, the S&P 500 index stood at roughly 950. The full-size S&P 500 contract (SP), with its $250 multiplier, had a notional value of roughly $237,500.39 The E-mini, at one-fifth the size with its $50 multiplier, represented approximately $47,500 of notional exposure. As the index has appreciated over the subsequent decades, with ES trading around 7,400 in 2026, the E-mini’s notional value has grown to about $370,000, far more than the full-size contract represented when the E-mini was introduced. CME delisted the full-size S&P 500 contracts after 17 September 2021, because the E-mini had completely supplanted them. CME Group launched the Micro E-mini (MES) on 6 May 2019 at one-tenth the E-mini’s size, intended to make the S&P 500 accessible to smaller accounts. Yet even the Micro E-mini, with its $5 multiplier, now carries a notional value of about $37,000, which is smaller than the original E-mini’s $47,500 at launch but a far cry from the sub-$10,000 position size that many retail traders assume they are taking on when they trade “the small contract.” On 24 August 2026 CME went a step further, with E-nano equity futures a hundredth the size of an E-mini.40
For the back-tester, this means that a strategy tested over twenty years of E-mini data is not operating on a consistent instrument: the contract at the start of the sample is, in economic terms, a wholly different proposition from the contract at the end.
The full-size SP contract adds a further wrinkle, because when the E-mini launched in September 1997, the SP contract carried a $500 multiplier, giving it a notional value near $475,000 at the prevailing index level. Just two months later, in November 1997, the CME halved the multiplier to $250 because the contract had simply grown too large for many participants. Any backtest spanning this period must account for the fact that “one contract” of the SP before and after November 1997 represents a very different economic exposure, since the post-change contract was half the size of its predecessor. Whether a given data source correctly reflects this multiplier change or silently treats the pre- and post-change contracts as identical, is yet another data nuance that may or may not be handled correctly and that the back-tester must verify independently.
This issue is especially dangerous for strategies that use fixed-dollar stop-losses, a practice that is common among retail traders who calibrate their risk in terms of “the most I am prepared to lose on this trade.” A trader who backtests with a $3,000 stop over a twenty-year history is implicitly assuming that $3,000 represents the same risk tolerance throughout the sample, which is wrong for two compounding reasons. First, inflation alone has eroded the purchasing power of $3,000 over two decades: in real terms, $3,000 today buys considerably less than $3,000 did in 2005. Second, and more importantly for strategy mechanics, the contract’s notional value and typical daily range have grown dramatically. A $3,000 stop on an E-mini S&P position twenty years ago, when the contract’s notional value was roughly $60,000 and a typical daily range might have been 15 points ($750), afforded the strategy approximately four days’ worth of adverse movement before triggering the stop. The same $3,000 stop today, when the notional value is about $370,000 and a typical daily range may be 60 points, barely provides a single day’s cushion. The backtest will show the strategy surviving adverse excursions in the early years that would trigger the stop almost immediately under current conditions. The historical equity curve is therefore effectively built from a series of evolving strategies: the early portion of the equity curve is built from a strategy that has generous room to move and absorb volatility, while the latter portion is effectively scalping with a tight stop, and yet both appear as a single continuous track record.
Stops written in ticks drift in the same way, because ES has traded in quarter-point ticks since it was launched while its price has risen more than sixfold since 2010. On ES one-minute data from June 2010 to September 2026 (Databento, unadjusted single contracts), I placed a notional 8-tick (2-point) stop at 9:00am CT each day and counted how often the next 30 minutes traded through it, for a long and a short separately.
| Year | Price | Tick (bp) | Median cash-session range (ticks) | 8-tick stop at 09:00 hit within 30 min |
|---|---|---|---|---|
| 2010 | 1,143 | 2.19 | 49 | 58% |
| 2026 | 7,400 | 0.34 | 258 | 90% |
In 2010 the 8-tick stop survived its first half-hour a little under half the time; in 2026 it was taken out nine times in ten. A stop set at 15% of the 20-day average range, about eight ticks wide in 2010 and about 42 in 2026, was hit on 41–52% of occasions in every year from 2010 to 2026. These figures come from one instrument and from unadjusted contracts, so they say nothing about the further distortion a back-adjusted series adds, but they support scaling stops to volatility.
Stops based on volatility measures such as ATR partially mitigate this problem by adapting to the prevailing range, but even ATR-based stops are distorted over long histories if the underlying relationship between range and notional value has shifted, as it has for any contract whose price level has changed a great deal. Continuous contract adjustments compound the problem: back-adjusted series accumulate roll adjustments that grow larger the further back one looks, progressively distorting the relationship between the adjusted price level and the actual trading ranges that prevailed at the time. An ATR calculated on back-adjusted data from twenty years ago may bear little resemblance to the ranges a trader would have actually experienced. Extreme price events add further complications: when WTI crude oil traded at negative prices in April 2020 (the May 2020 contract settling at $-37.63), several brokers were unable to process negative prices in their systems, and the same is true of backtesting platforms. Any framework that stores prices as unsigned values, computes percentage returns, or uses logarithmic transformations will fail on a negative price. Back-adjusted continuous series that pass through this event can produce negative adjusted prices for earlier contracts even if the unadjusted prices were positive, propagating the problem backward through the entire history. A backtest of any strategy spanning this period that does not specifically handle negative prices is unreliable, and the trader who has not checked whether their platform can handle this case is carrying a risk of which they may not be aware.
2.8.1 The drift is real money
There is a subtler point here that is easy to get backwards, and getting it backwards leads to the wrong fix. The cumulative adjustment that back-adjustment piles onto historical data is often described as a distortion to be cleaned away. That description is correct for absolute price levels, and wrong for the price changes and therefore for profit and loss. The total change of an additively back-adjusted series from the start of the history to the end equals exactly the profit and loss of holding one continuously-rolled position over that period. The roll gaps that the adjustment strips out are the actual cashflows of the roll. At each roll the expiring contract is closed at its price and the next is opened at its price, and the difference between the two is money that genuinely changed hands. Additive back-adjustment is, by construction, faithful to that profit and loss in points. That is why it is the default method, and why “the adjusted prices never existed”, which is true of the levels, does not imply that “the adjusted returns are fictitious”.
This matters because the drift is not random. In a market that sits persistently in contango, the roll gap carries a consistent sign, and the cumulative sum of same-signed gaps imparts a deterministic, low-noise, highly autocorrelated drift to the level series: persistent contango drives the back-adjusted series steadily downward as one looks further back, persistent backwardation drives it upward. That drift is the roll yield, and it is real return that a position holder earns or pays. The contracts most exposed to driving an adjusted series through zero (low-priced instruments with long histories and a persistent curve sign, such as short-term interest-rate futures and some energy contracts) are exposed because the roll yield is large and one-directional relative to their price.
The practical consequence is a denominator problem that is easy to introduce and hard to see. Any quantity computed as a percentage of the adjusted price (the return volatility used for position sizing, the entries of a correlation matrix, a log return) is wrong if the adjusted close is used as the denominator, because that denominator is an anchor-dependent fiction that drifts further from the real contract price the further back one looks. The fix is to keep additive adjustment and never divide by the adjusted level: compute each period’s return as the change in the adjusted series divided by the actual contract price that was trading at the time.41 In practice this means carrying the unadjusted contract price alongside the adjusted series at the resolution the strategy trades on, so the real denominator is always available. A volatility-scaling or correlation routine that silently divides by the adjusted close is carrying a bug that grows with the length of the history, and on a large multi-instrument book it corrupts both the per-instrument position sizes and the cross-instrument risk model at once.
Continuous contract construction in back-testing should be handled in the same
way that the trader will trade the strategy in real life. A continuous series is
a research convenience, and orders must name a real contract, such as the
September 2026 E-mini (fut:XCME:ES:U26 in my own notation). A strategy can
generate its signals on the synthetic series, provided its calculations make
sense under the adjustment, but any stop or limit level must be translated onto
the real contract’s price scale, and simulated fills must use that contract’s
market data, because the synthetic series never traded.
In many cases, strategy developers test strategies on continuous contracts without understanding the specific rules used to construct them. I prefer to keep the dated contracts and an explicit roll rule rather than a pre-stitched download, so that the series can be rebuilt, a discrepancy can be explained, and the roll heuristics used in real life are also modelled in the backtest. A volume-based roll rule depends on whether it reads day-session or full-session volume, and on when the official volume is published, and for round-the-clock contracts a roll that lands on a weekend is handled differently by each vendor. Most backtests also ignore roll costs, which matter for strategies that regularly hold positions across contract roll dates.
Product codes get reused as well: CME’s 2010–2012 TN contracts, with security
group TN and a February/May/August/November cycle, are not the Ultra 10-year
contracts listed from 2016, which carry security group Z1. Both show asset
TN, venue XCBT, a 1/64 tick and $100,000 notional, so roll logic keyed on
the root alone can stitch the old contracts onto the front of the Ultra 10-year
history.
2.9 Equity Price Adjustments: Dividends, Splits, and Consolidations
The continuous contract construction problem described above has a direct analogue in equities, though it manifests differently and is, if anything, less well understood by the retail back-tester. Equity data vendors routinely supply “adjusted” historical prices that have been retroactively modified to account for corporate actions: stock splits, reverse splits (consolidations), and dividend payments. The adjusted series is intended to produce a continuous return stream, so that a chart or backtest can treat the instrument’s history as though these events had not occurred. The intention is reasonable, but the execution is a source of widespread and frequently unrecognised distortion.
Consider a stock that has undergone a 2-for-1 split. On the split date, the share price is halved and the number of outstanding shares is doubled. To prevent the split from appearing as a 50% loss in the historical record, the data vendor retroactively halves all pre-split prices. This preserves the percentage return series: a move from $100 to $110 pre-split becomes a move from $50 to $55 in the adjusted data, and the 10% return is correctly maintained. But the adjusted prices are now fictitious, because no one ever traded this stock at $50 before the split; the actual market price was $100. Any strategy that depends on absolute price levels, whether through fixed-dollar stop-losses, support and resistance levels, or round-number effects, will generate signals on the adjusted series that bear no relation to the conditions that actually prevailed. This is the same class of error described above for back-adjusted futures, and it is just as damaging.
Reverse splits (consolidations) introduce the mirror-image problem. A company executing a 1-for-10 reverse split is typically doing so because its share price has fallen to very low levels, often to avoid delisting requirements. The adjusted series retroactively multiplies all pre-consolidation prices by ten, transforming what was in reality a low-priced, wide-spread, difficult-to-trade instrument into one that appears to have always traded at a respectable price level. A backtest run on the adjusted data will simulate entries and exits at these inflated historical prices, entirely concealing the fact that the actual trading environment featured penny-stock spreads, thin liquidity, and the particular microstructure pathologies that afflict very low-priced equities. The strategy’s apparent historical performance includes a period that was, in practice, untradeable at the costs and fill quality the backtest assumes.
Dividend adjustments are subtler but arguably more consequential, because they are universal rather than occasional. When a stock pays a dividend, the standard adjustment methodology reduces all pre-dividend historical prices by the dividend amount (for point-adjusted series) or by the dividend yield (for proportionally adjusted series). Over a long history, for a stock that has paid regular dividends for decades, the cumulative effect of these adjustments is enormous. Historical prices in the adjusted series can be reduced to a small fraction of their actual traded values. A stock that traded at $40 twenty years ago may appear in the adjusted series at $15 or less, once the cumulative effect of two decades of quarterly dividends has been subtracted from the historical record.
This creates several concrete problems for the back-tester. First, as with splits, the adjusted prices are fictional, and any strategy logic that references absolute price levels is operating on numbers that never existed in the market. Second, the adjustment methodology itself varies between vendors: some adjust for regular dividends but not special dividends, some for all cash distributions, and some adjust only the closing price where others adjust the full OHLC bar. The same stock, over the same period, can produce noticeably different adjusted price histories depending on the vendor and adjustment method, and consequently different backtest results. The researcher who downloads adjusted data from one source, develops a strategy, and then attempts to validate it against data from another source may find discrepancies that come from differing adjustment methodologies, with neither dataset in error.
Third, dividend-adjusted data distorts volatility measures in ways that are easy to miss. A stock whose actual price was $40 with a daily range of $1 (2.5% of price) may appear in the adjusted series at $15, but the daily range is also adjusted to approximately $0.38. In absolute terms, the range has been compressed; in percentage terms, it is preserved. This means that any volatility metric calculated in percentage or logarithmic terms (such as standard deviation of returns) will be correct, but any metric calculated in absolute terms (such as ATR in dollars, or a fixed-point stop-loss) will be distorted by the cumulative adjustment. A strategy that uses a dollar-denominated ATR to set position sizes will systematically oversize positions in the early part of the history, where the adjusted prices are artificially low, and the resulting equity curve will overstate both returns and risk in that period.
Fourth, and most damaging, the adjustment methodology embeds future information into past prices. The closing price for a stock on 1 January 2010, in a dividend-adjusted series downloaded today, has been reduced by the cumulative effect of every dividend declared between January 2010 and the day of the download. None of those dividends had been declared at the time the historical bar was created. A strategy that places a stop at a round number, or that triggers an entry on a breach of a fixed price threshold, is responding to a price level that was itself computed using knowledge of dividends that did not yet exist. This is look-ahead bias hidden inside the data. The contamination is structural, embedded in the historical record by future corporate actions, and it does not show up as an implementation error in the strategy code.42
The fix is to keep two clean series side by side: an unadjusted series for any logic that depends on absolute levels, and a total-return series for return calculations. Most retail backtesting infrastructure stores only one of the two and forces the researcher into a choice that is rarely an informed one.
The simulation must also stay consistent with whichever series it uses. A split rescales the price, so the simulation has to rescale quantities and pending orders as well; changing the price scale while leaving an order or position on the old basis produces an inconsistent account. Dividends can also be counted twice, because a simulation on raw prices credits dividends as cash while a total-return series already includes them, so a process that credits dividend cash on top of a total-return series counts the same benefit twice. It’s an easy mistake to make when the adjustment policy is hidden inside the platform. The vendors’ own choices vary here too: Norgate, for example, offers four selectable corporate-action adjustment methods.11 And after December 2026 the timing of corporate actions moves, with listing exchanges’ XML files due by 8:00pm and affected securities halted before 9:00pm under Nasdaq’s proposal, so an adjustment keyed to local midnight can put observations on the wrong price basis.32
A further complication arises from the interaction between dividend adjustments and total return calculations. A backtest on price-only (unadjusted) data will understate the returns of a dividend-paying stock, because the dividends are not captured. A backtest on dividend-adjusted data will correctly capture the total return, but only if the researcher understands that the “price” series they are using is a total-return index expressed in price-like units. Mixing adjusted and unadjusted data within the same strategy, or applying logic designed for one to the other, produces results that are internally inconsistent. A cross-sectional strategy that ranks stocks by price, for example, will produce different rankings depending on whether the prices are adjusted or unadjusted, and the adjusted rankings will reflect cumulative dividend history as much as current market valuation, which is almost certainly not the researcher’s intention.
The researcher who downloads an adjusted price series and treats it as though it were a record of actual traded prices is making an error that is conceptually identical to the futures trader who treats a back-adjusted continuous contract as a record of actual futures prices. In both cases, the data have been transformed to serve a specific analytical purpose (preserving return continuity), and using them for any other purpose (absolute price comparisons, dollar-denominated risk calculations, cross-instrument rankings) produces artefacts that the backtest will silently incorporate into its results.
Databento: Aggregate bars (OHLCV), covering interval timestamps, UTC daily bars and omission of intervals without trades. ↩︎ ↩︎
Databento issue tracker: CME Globex MDP2 data has incomplete bars for many days, posted by Databento staff on 10 August 2026. Its status was “Fix in progress” on 14 September 2026 and “Closed” on 26 September 2026, the date of its last update. The issue lists 25 affected dates between 15 July 2010 and 18 November 2015, 19 of them on the 15th of a month, and gives the internal reference D-8175. Databento issue tracker: CME Globex MDP2 requests for part of a UTC date return truncated or empty (D-8174, 21 dates from 15 July 2010 to 15 September 2015, with the workaround of aligning
startandendto UTC date boundaries). Both were posted on 10 August 2026 and last updated on 26 September 2026, when both were marked “Closed”. The session-request example, the trading-day count and the effects on particular order types are my own deductions from the issue text; neither issue says how its fix was verified or which requests customers actually made. ↩︎My own aggregation of the CFTC’s Traders in Financial Futures and Disaggregated reports, 2010–2026, from its historical compressed files. The aggregates are the futures-and-options-combined figures unless stated. The consolidation formulas are inferred from the published figures, not from a CFTC statement: before the 2 May 2023 report, the S&P 500 consolidated open interest equals the full-size contract plus a fifth of the E-mini in every week checked, and from that report on it equals the E-mini plus a tenth of the Micro E-mini. The commodity-code moves are those visible in the reports’
CFTC_Commodity_Codefield. The Euro FX comparison uses the futures-only and combined files for the same weeks. ↩︎Kenneth R. French Data Library, daily three factors, momentum and size portfolios, built from the 202608 CRSP database, https://mba.tuck.dartmouth.edu/pages/faculty/ken.french/data_library.html. CRSP’s daily coverage is NYSE from 1926, AMEX from 2 July 1962 and Nasdaq from 14 December 1972. S&P 500 launch and back-tested history: S&P Dow Jones Indices, S&P 500 Through History (2023). Shiller’s description of his price series is at https://shillerdata.com/. The CFTC’s caveat on backfilled Traders in Financial Futures history is in its explanatory notes for that report. The Saturday count, the annualisation effect and the size-decile autocorrelations are my own calculations from the French daily data. ↩︎
I have encountered vendors who, when confronted with documented errors in their data, pretend that they are serious about fixing it, but never do. ↩︎
TradeStation forum: API and TS app data differences, created on 8 September 2020, documents API/desktop price and volume discrepancies and request-boundary questions; support discussed the request semantics. Then the Unbelievably frustrated with TS data integrity, opened on 10 September 2024, explicitly says the problem had been raised four years earlier and remained unaddressed. ↩︎
Databento: dataset-condition API and public issue-report guidelines. Conditions and modification dates are reported by dataset and UTC date; they don’t verify every symbol or your own archive. An issue being closed doesn’t necessarily mean it was fixed. ↩︎ ↩︎
Regulation NMS, 17 CFR §242.600 et seq. Rule 601 governs transaction reporting, Rule 602 quotation reporting, Rule 603 data dissemination, and Rule 611 order protection. The CTA/CQ and UTP Plans are the national market system plans filed under Rule 608. ↩︎
CTA Extended Trading Hours FAQ, version 1.1, 6 July 2026, Q11 and Q12. The Form T (‘T’ sale condition) treatment described there is a continuation of current practice, not a December change. ↩︎
Databento equities, on direct exchange sourcing across its US equities datasets and its four-timestamp convention. Databento, Build a fast, real-time stock screener in Python, describing the
EQUS.SUMMARYdataset as consolidated end-of-day OHLCV across all NMS exchanges and ATSs, designed to maximise CTA/UTP SIP coverage. ↩︎Norgate Data FAQ: “What does consolidated tape price data mean?” (OHLC from regular last-sale-eligible trades during regular hours; volume and turnover from all trades including pre- and post-market and blocks; rules determined by the CTA and UTP Plan), “Is the database static with regard to historical data?” (corrections from primary upstream suppliers, applied continuously, no notification and no versioning), plus the sections on price adjustment methods,
assetid, historical index constituents and delisting. The inference that Norgate’s volume series will shift in December is mine, drawn from their stated rules against the CTA schedule, not a statement by Norgate. ↩︎ ↩︎ ↩︎ ↩︎S&P 500 futures and options first trading days: CME Group, Products: First Day of Trading. OnixS, A brief history of CME Globex, and CME Group, Product Anniversaries: Globex launched 25 June 1992 with four contracts, three on the Deutsche mark and yen and one on the 10-year Treasury note. CME Group, The Origins of the E-mini S&P 500: launched 9 September 1997, over 7,000 contracts on the first day, nearly 24-hour trading from Sunday 6:00 pm to Friday 5:00 pm ET with a 60-minute daily halt. ↩︎
CME Group press release, 4 February 2015, on closing most open-outcry futures trading in Chicago and New York by July: equity-index futures pits closed on 19 June 2015, except the full-size S&P 500, and most other futures pits on 2 July 2015. CME Group press release, CME Group to Close Chicago Trading Floor as a Precaution, 12 March 2020, closing the floor at the close of business on Friday 13 March 2020. CME Group press release of 4 May 2021 on the delisting of the full-size S&P 500 contracts after 17 September 2021. ↩︎
Gousgounis and Onur (CFTC), Who Paid the Price when the Livestock Futures Pits Closed? and Is Pit Closure Costly for Customers?, on the 6 July 2015 closure of the livestock pits and the share of live cattle volume executed there beforehand. Databento’s
GLBX.MDP3history begins in mid-2010, per its dataset documentation. ↩︎Tiingo, Overnight Stock Data API: Real-Time 8pm-4am Prices from Blue Ocean ATS, 23 July 2026, updated 7 August 2026. Blue Ocean’s ~83% share is a December 2025 figure and is the only publicly disclosed overnight market share; the other venues report per-session volume but not share. ↩︎
DTCC, NSCC Now Live with Clearing Hours Extended to 24x5, 29 June 2026. T+1: SEC Release 34-96930. ↩︎
CME Group press release, CME Group Announces Reduced Electronic Trading Hours for CME Livestock Products, 3 October 2014; CME Globex Notices of 6 and 13 October 2014, Reduction of CME Globex Trading Hours for CME Livestock Contracts, which tabulate the current and new Globex schedules (before 27 October 2014: Monday 9:05 am open, a 4:00–5:00 pm halt Monday to Thursday, Friday 1:55 pm close); CME Group press release, CME Group Announces Measures to Further Enhance Livestock Markets, 10 February 2016, certified with the CFTC on 25 February 2016 as CME Submission No. 16-064. The hours per week are computed from those schedules. The 2016 release notes that about 87% of daily livestock futures and options trades in 2015 already fell inside the shorter hours. ↩︎
Grains: CME Group press releases of 1 May 2012 and 17 May 2012 on CBOT grain and oilseed hours, the 8 April 2013 reduction to a 19:00–07:45 CT overnight leg plus an 08:30–13:15 CT day session, and SER-7395R (6 July 2015). CME Group notice reproduced by Optimus Futures, New Grain Futures and Oil Seed Futures Trading Hours: effective with the CME Globex open on Sunday 7 April 2013 (trade date Monday 8 April), Globex trading 7:00 pm to 7:45 am CT Sunday to Friday, a pause from 7:45 to 8:30 am CT, and floor and Globex trading 8:30 am to 1:15 pm CT Monday to Friday. Welch, Anderson, Robinson, Vedenov and Waller, What to Expect from Expanded Trading Hours?, Food and Fiber Economics vol. 41 no. 1, Texas AgriLife Extension, May 2012, which records the prior Chicago hours (6:00 pm to 7:15 am and 9:30 am to 1:15 pm CT), ICE’s 22-hour window, CME’s announced 22 hours pared back to 21 (5:00 pm to 2:00 pm CT), the 20 May 2012 effective date, and the concern that USDA’s 7:30 am reports would now land during trading. ↩︎
Equity index: CME Clearing Advisory 12-423 (effective 18 November 2012) and the removal of the 15:15–15:30 CT halt effective 28 June 2021. ES hours: CME, Changes to CME Globex Trading Hours and Daily Price Limits (2012), and CME Globex Notices, 21 June 2021. ↩︎
CME Group, Special Executive Report SER-8591, Amendments to the Daily Settlement Procedure Documents, 22 September 2020, moving the ES daily settlement window from 15:14:30–15:15:00 CT to 14:59:30–15:00:00 CT to synchronise with the cash equity close. The earlier procedure: CME Group, CME S&P & E-Mini S&P 500 Futures Daily Settlement Procedure, CFTC rule filing of 26 January 2018, Exhibits A to C. Exhibit A gives the ES three-tier procedure over 15:14:30 to 15:15:00 CT. ↩︎ ↩︎
Eurex: circular er18088e and the Eurex Asian Trading Hours FAQ, November 2018, which list the products in scope (Bund, Bobl, Schatz, Buxl, EURO STOXX 50, DAX, mini-DAX and the MSCI futures). ↩︎
NYSE, History of NYSE Holidays and New York Stock Exchange Special Closings, 1885–date (revised January 2011), for the summer Saturday closures of 1945 to 1952, the holidays, and the 1968 four-day weeks. MathWorks,
nyseclosuresdocumentation, for the move to a five-day week on 29 September 1952. Goizueta Business Library, Emory University, This Day in Business History: NYSE Ends Saturday Session (2024), for the 3:30 pm close. Session counts are from the Kenneth R. French Data Library daily factors, built from the 202608 CRSP database, whose last Saturday is 24 May 1952. ↩︎Checked on 3 October 2026 with Yahoo Finance daily
^GSPChistory (downloaded withyfinance),pandas_market_calendars5.4.0,exchange_calendars4.13.2, pandas 3.0.6 (bdate_range), numpy (busday_count),quantstats0.0.86 andempyrical-reloaded0.5.12, whose annualisation factor for daily data is 252. MATLAB behaviour is from the MathWorks documentation fornyseclosuresandholidays. The Saturday, Monday, and Tuesday-to-Friday averages are total market returns from the French daily data; the weekday-only figures fold each Saturday’s return into the following trading day. ↩︎CME Group Client Systems Wiki, Cryptocurrency Futures and Options Migration to 24-7 Trading: migration from 4:00 pm CT on Friday 29 May 2026; “at least a two-hour weekly maintenance period occurring on the weekend”; and the rule that “All holiday or weekend trading from Friday evening through Sunday evening will have a trade date of the following business day, with clearing, settlement and regulatory reporting processed the following business day.” CME Group, FAQ: Cryptocurrency Futures and 24/7 Crypto Futures and Options Trading: Monday to Friday maintenance 4:00 to 4:02 pm CT; weekly maintenance Saturday 2:00 to 4:00 am CT. CME Group, CME Group Announces Launch of 24/7 Cryptocurrency Futures and Options Trading, 1 June 2026: over 7,200 contracts, roughly $50 million notional, over the inaugural weekend. ↩︎
CME Group, CME Group to Expand 24/7 Trading for WTI Crude Oil and Gold, 11 June 2026: 1-Ounce Gold futures (COMEX) from 26 July 2026 and a new 10-Barrel WTI Crude Oil futures (NYMEX) from 30 August 2026, both pending regulatory review. ↩︎
ICE Futures U.S. exchange notices on temporary opening-time changes during the US/UK daylight-saving mismatch: 4 October 2010 (for trade dates 1–5 November 2010), and the equivalent notices for 31 October to 4 November 2022 and 27 to 31 October 2025. The 2025 notice also moved the Coffee “C” and Cocoa settlement windows for the week. ↩︎
CME Group, Holiday and Trading Hours, as at September 2026. The full-session times are CME’s; the “day session” windows in the table are the regular-trading-hours conventions used by brokers and vendors (see, for example, tastytrade’s Futures Market Hours), and each vendor’s own table is authoritative for its own bars. ↩︎
Massive, US Equities Move to 23/5 Trading on December 6, 2026, 26 August 2026. Underlying primary sources: SEC Release 34-101777 (24X registration, 27 November 2024); 34-102400 (NYSE Arca 22-hour extension, 11 February 2025); 34-105199 (Nasdaq 23/5 approval, 10 April 2026); 34-105779 and 34-105780 (CTA and UTP plan amendment approvals, 26 June 2026); 34-106061 (24X conditional exemptive relief, 7 August 2026). Pre-launch calendar: CTA Extended Trading Hours FAQ, version 1.1, 6 July 2026, Q28–Q32. ↩︎ ↩︎ ↩︎
Nasdaq Equity Trader Alert 2026-46, 17 August 2026, gives the trading-date rule and 4:00 am order cancellation. The Nasdaq Global Trading Hours FAQ covers sessions and Monday-holiday handling; the corporate actions FAQ describes proposed overnight halts for specified actions, subject to SEC review and approval. The NYSE Extended-Hours Trading FAQ, version 4.0, August 2026, covers Arca’s plans, leaving other NYSE Group equity exchanges’ schedules unchanged. Nasdaq announces 6 December 2026; the FAQs retain applicable approval and infrastructure conditions. The timestamp conversions use the December 2026 New York and Melbourne offsets. Provider and strategy implications are deductions from these schedules. ↩︎ ↩︎ ↩︎
CTA Extended Trading Hours FAQ, version 1.1, 6 July 2026: Q6 and Q8 (session and daily event schedule), Q11–Q12 (sale conditions and volume), Q15–Q17 (halt and SSR carryover, corporate actions), Q18–Q23 (overnight price bands), Q26–Q27 (listing exchange obligations and missed-deadline handling), Q28–Q32 (pre-launch and test calendar). The equivalent Nasdaq UTP SIP Extended Trading Hours FAQ covers Tape C and should be read alongside it; the schedules match but the documents are separate. ↩︎ ↩︎ ↩︎
Nasdaq Equity Trader Alert 2026-46, on cancellation of overnight orders at 4:00 am Eastern. ↩︎
Nasdaq corporate actions FAQ, on proposed overnight halts for specified actions, subject to SEC review and approval. ↩︎ ↩︎
CFTC: Commitments of Traders and release schedule. Publication dates can differ from the usual Friday schedule. CFTC staff statements on the cyber incident at ION Cleared Derivatives, a unit of ION Markets: CFTC Statement on ION and the Impact to the Derivatives Markets, 2 February 2023, which delayed the Commitments of Traders report “until all trades can be reported”; CFTC Issues Statement on the Ongoing Impact to Reporting, release 8655-23, 10 February 2023; and CFTC Announces Postponement of Commitments of Traders Report, release 8662-23, 16 February 2023, which set out the plan to publish the missed reports in sequence from 24 February. ↩︎
Federal Reserve Bank of St. Louis: FRED real-time periods, ALFRED vintage downloads, and release dates versus service availability. ↩︎
Nasdaq Global Trading Hours FAQ, which states that Nasdaq Texas and PSX equity exchanges, and the Nasdaq options exchanges, will continue to operate on their current schedules. ↩︎
Meta Platforms’ ticker-change announcement, 31 May 2022, specifies the 9 June effective date and unchanged CUSIP. Roundhill’s METV product page records its earlier change from
METAtoMETV, effective 31 January 2022. These were different securities on different listing venues; the example demonstrates reuse of the bare ticker. ↩︎The metaphor may be too generous. A soup at least has a recipe. These strategies have the complexity of a recipe with none of the intentionality. ↩︎
The same pattern has played out previously with Bitcoin, natural gas, and crude oil. The instrument changes; the methodological error does not. ↩︎
When the E-mini launched in September 1997, the full-size SP contract actually carried a $500 multiplier, giving it a notional value closer to $475,000 at prevailing index levels. The CME halved the multiplier to $250 just two months later, in November 1997, precisely because the contract had grown too large for many participants. The $237,500 figure cited here reflects the post-adjustment value. ↩︎
Micro E-mini: CME Group, After Five Years, Micro Equity Futures Still Gaining Steam (2024). E-nano: CME Group press release, 3 August 2026. ↩︎
Carver (2023) makes this point repeatedly in the context of his own systematic futures work, and his
pysystemtradeframework implements it directly: percentage returns are computed against adaily_denominator_pricethat holds the price of the contract actually being traded, never the back-adjusted level. The same logic applies to any volatility estimate or correlation used for risk scaling. ↩︎There is a long-running thread on r/algotrading that captures the practical confusion this causes for beginning back-testers: when to use adjusted versus unadjusted data, and what the choice implies for the strategy. The answer depends on whether the strategy reasons in returns or in absolute levels. The fact that the question is asked again every few months suggests the typical retail tutorial fails to address it at all. ↩︎