At a glance
- Biggest issues
- Adjustments, survivorship, roll methodology, timestamps
- Silent failures
- Bad prints that trigger stops; missing delisted instruments
- Vendor differences
- The same instrument can have different bars from different sources
- Practical rule
- Audit the data before debugging the strategy
Key takeaways
- Adjusted prices are not the prices at which trades occurred, which matters for any rule referencing round numbers or historical levels.
- Continuous futures contracts are constructed, not observed, and different roll methods produce materially different historical series.
- Bad prints and erroneous ticks trigger stops and generate phantom signals, and they are common even in professional data.
- Timestamp conventions differ between vendors and between markets, which causes subtle look-ahead when combining sources.
- Two vendors can produce different daily bars for the same instrument, so results are not reproducible across data sources without care.
Price adjustments
Historical equity prices are commonly adjusted for splits and dividends so that returns are continuous. That adjustment changes every historical price, which has consequences for any rule that references absolute levels.
| Series type | What it shows | Correct use | Problem |
|---|---|---|---|
| Unadjusted | Actual traded prices | Level-based rules, round numbers | Artificial gaps on ex-dividend and split dates |
| Split adjusted | Continuous through splits only | Most technical rules | Dividend gaps remain |
| Total return adjusted | Continuous through splits and dividends | Return calculations, performance | Historical prices never existed |
| Back-adjusted futures | Continuous through contract rolls | Trend systems on futures | Can produce negative historical prices |
Futures continuous contracts
Situation: front contract 70.00, next contract 71.50 (contango)
UNADJUSTED SPLICE
The series jumps 1.50 at the roll date.
Creates an artificial gap that triggers signals.
BACK-ADJUSTED (difference method)
All prior prices shifted down by 1.50 so the series
is continuous. Historical levels no longer match
what actually traded, and repeated rolls can push
early history negative.
RATIO-ADJUSTED
All prior prices multiplied by 70.00/71.50 so the
series is continuous in percentage terms.
Preserves percentage moves; distorts absolute levels.
The choice changes: signal timing, stop levels,
percentage returns, and in some cases the sign of
the long-run result. It must be documented.Additional roll decisions compound the problem: rolling on a fixed date, on volume crossover, or on open interest crossover produces different series. For backtests to be meaningful, the roll rule in the data must match the roll rule you would trade.
Bad prints and data errors
- Erroneous ticks. A single bad print creates a spike that triggers stops and generates false breakout signals. Screen for prices deviating implausibly from neighbouring bars.
- Zero or missing volume. Frequently indicates a holiday, a halt, or a data gap rather than genuine inactivity.
- Stale prices. Illiquid instruments repeat the previous close, which understates volatility and creates artificial mean reversion.
- Missing bars. A gap in the series can silently shift lookback calculations, producing signals computed from the wrong window.
- Duplicate bars. Double-counting inflates volume and distorts any cumulative calculation.
- Incorrect corporate actions. A missed split produces a 50 percent phantom gap; a missed reverse split produces the opposite.
- Weekend and holiday bars. Some sources include them with zero volume, which affects any bar-count-based rule.
Timestamps and session conventions
| Issue | Example | Consequence |
|---|---|---|
| Bar timestamp convention | Is a bar labelled by its start or its end? | One-bar look-ahead if mismatched |
| Time zone | Exchange local, UTC, or vendor local | Misaligned cross-market data |
| Daylight saving transitions | Session times shift relative to UTC | Duplicate or missing bars twice a year |
| Session definition in 24-hour markets | Which close defines the daily bar | Entirely different daily candles |
| Extended hours inclusion | Pre-market and after-hours in daily bars | Different highs, lows, and gaps |
| Settlement versus last trade | Futures daily close convention | Different signals from the same market |
The bar timestamp convention is the most dangerous because it silently introduces look-ahead. If bars are labelled by their start time and your code treats the label as the time the bar closed, every signal is computed with information from the future. This produces excellent backtest results and no error message.
Choosing and validating a data source
- 1
Establish whether delisted instruments are included
The single most important question for any equity or crypto dataset. See survivorship bias.
- 2
Confirm the adjustment methodology
What is adjusted, when, and whether unadjusted series are also available. You will need both for different purposes.
- 3
Check the futures roll rule and adjustment
It must be documented and it must match your intended trading approach.
- 4
Cross-check against a second source
Compare a sample of bars across two vendors. Differences reveal convention mismatches before they corrupt a year of research.
- 5
Verify timestamp semantics explicitly
Confirm whether bars are labelled by open or close time, and in which time zone. Test with a known event whose timing you can verify.
- 6
Run the audit checks on every new dataset
Outlier ranges, zero volume, date gaps, stale prices, and negative values. Automate it so it runs every time you load data.
Frequently asked questions
Should I use adjusted or unadjusted prices?
Both, for different purposes. Total-return adjusted series for computing performance and for signals based on returns. Unadjusted series for anything referencing actual price levels, such as round numbers or historical support. Using only adjusted data means your backtest sees levels that never traded.
Which futures roll method should I use?
Whichever matches how you will trade. If you roll on volume crossover, your data should too. Ratio adjustment is generally preferable to difference adjustment because it preserves percentage moves and avoids negative prices, but the essential requirement is that the method is documented and consistent.
How do I find bad data in my dataset?
Screen for bars with ranges far above the median, zero or missing volume, gaps in the date sequence, prices repeated identically across many bars, and any negative values. These checks are fast, catch most problems, and should run automatically whenever data is loaded rather than only when results look strange.
Do different data vendors give different results?
Yes, frequently. Session definitions, extended-hours inclusion, adjustment timing, and bad-print filtering all vary. The same strategy can produce noticeably different backtest results on two vendors’ data for the same instrument, which is why documenting your data source is part of documenting your strategy.
Is free market data good enough for backtesting?
For broad index ETFs and liquid instruments with straightforward adjustments, often yes. For anything involving a universe of individual stocks, delisted instruments, futures rolls, or point-in-time fundamentals, generally no. The biases introduced by free data are systematically favourable, which is the worst kind of error.
Test this idea before you trade it
Describe the rules in plain language and AlgoTrader AI turns them into a structured strategy blueprint with a configurable historical backtest, cost assumptions, and exportable code.
Build a backtestKeep reading
- BacktestingBacktesting Guide: How to Test a Strategy Honestly
- BacktestingSurvivorship Bias: Testing Only on the Winners
- BacktestingLook-Ahead Bias: Using Information You Could Not Have Had
- MarketsFutures Trading Strategies: Leverage, Rolls, and Diversification
- Algo & QuantMarket Data Guide: Types, Sources, and What You Actually Need
- BacktestingTransaction Cost Modelling: The Number That Decides Viability
Referenced by
Educational use only. This guide explains how a strategy works. It is not investment advice, not a recommendation, and no result described here is a forecast. Test any approach on historical and out-of-sample data, size positions conservatively, and never risk money you cannot afford to lose.