Two systems, two definitions of the same word
This disagreement is almost never a bug in either system. It is two correct answers to two questions that nobody wrote down, and the way to resolve it is to narrow the definitions until only one can still be true. There is an order to that, because each step invalidates the comparison at the step below it: identity first, then series definition, then adjustment vintage, then the currency, and only then arithmetic.
Skipping to the arithmetic is what makes these investigations take a week. If the two sides are looking at different instruments, comparing their returns tells you nothing at all.
Is it the same instrument for the whole period?
Instruments are not stable objects. A company changes its name, moves its primary listing, reorganises and emerges with a new identifier, spins off a subsidiary, or is acquired and disappears. Meanwhile identifiers are recycled: a short ticker freed by a delisting can be reassigned to an entirely unrelated company, so a history keyed on ticker can contain two businesses joined at the point where one ended.
That is the reason a market data platform needs its own permanent internal instrument identifier, minted once and never reused, with every external identifier attached to it as a dated mapping rather than as a column. Then "the same instrument" is a question the system can answer, and a history assembled through the mapping is traceable to the entity rather than to the symbol. Without that, the first check available to you is manual: pull the corporate action and identifier history for the period and look for a discontinuity near where the two series diverge, because that is usually exactly where it will be.
The related defect is what is missing rather than what is wrong. A universe drawn from a vendor's current list of listed companies contains only survivors, and a strategy tested on survivors is being handed information the desk never had. Any historical universe has to be reconstructed as at each date from dated membership records, including the names that were delisted, suspended or acquired away.
Which series, exactly?
For a single instrument on a single day there are several defensible prices, and they differ by amounts large enough to explain a disagreement. The official closing price published by the primary listing venue is usually struck in a closing auction and is not the same as the last trade of the day on that venue, which in turn is not the same as the last trade anywhere, which is not the same as a consolidated closing print. Add the venue's session boundaries and the time zone the researcher's tooling assumed, and a series can be offset by a day for part of its history.
Then there is the adjusted-versus-unadjusted distinction, and beneath it a further one. A price-adjusted series removes the mechanical effect of splits and similar actions so that the series is continuous. A total-return series additionally assumes dividends were received and reinvested. A strategy tested on total-return data has silently been credited with income that the live book only receives if it held through the record date, paid the right tax, and was not lent out at the time. That gap alone is enough to make a marginal strategy look profitable.
Adjusted history is rewritten, which is why backtests are not reproducible
The subtlest item on the list, and the one worth leading with once identity is settled, is that an adjusted series has no fixed value. When a corporate action occurs, the vendor recomputes adjustment factors and every prior observation changes. The number your researcher recorded for a date three years ago was correct when they ran the test and is different today, because a consolidation happened last month.
So a backtest cannot be reproduced from a live-updating adjusted series, and any result quoted without the vintage of the data it used is unfalsifiable. The fix is to treat the adjustment as data rather than as a property of the price: store raw traded prices exactly as published and never touch them, store corporate actions as dated events, and derive the adjusted series on demand as at a stated date. A test then names the as-at date of its reference data along with its parameters, and the same test run a year later either reproduces the number or has a stated reason not to.
The same discipline applies to everything else the test depended on. Index membership, sector classification, shares outstanding, lot size and tick size all change and are all usually stored as current values, which means a test that filtered on any of them was filtering on facts from the future. Point-in-time reference data is not a luxury for a research platform; it is the difference between a measurement and a story.
The currency is a second series
If either side is reporting in a currency other than the one the instrument trades in, there is a second time series in the calculation, and it has all the same problems plus one of its own. Which rate was used, struck at what time, from which source, and against which side of the spread? A researcher taking a daily closing rate and a desk translating at the rate that applied at the moment of each transaction will disagree, and the difference is neither party's error. It has to be pinned in the same way as everything else, and pinned separately for valuation and for realised results, because those are genuinely different questions.
Where the disagreement usually turns out to live
Once you have run the ladder, the resolutions cluster. In roughly descending order of frequency, it is an identifier discontinuity around a reorganisation; a closing-price definition mismatch between the primary venue's auction and a consolidated last trade; an adjusted series compared against unadjusted transaction prices, or a total-return series compared against price-only results; an adjustment vintage difference where one side re-derived and the other did not; and a currency rate convention. Arithmetic errors do occur and are the last place to look, not the first.
What makes this worth engineering rather than investigating repeatedly is that every one of those causes is a missing definition rather than a missing capability. A market data layer that stores raw prices immutably, keeps corporate actions and identifier mappings as dated events, exposes derived series with an explicit as-at date, and forces every consumer to name the price definition it wants, does not produce this disagreement. One that hands out a convenient adjusted close will produce it indefinitely, and each occurrence will be investigated from scratch by somebody who has not seen it before.
An adjusted price history is a derived view that changes without anyone touching it. Store what was traded, store what the issuer did, and derive the series with a stated as-at date, or accept that no research result in your firm is reproducible.
© 2026 Preptima. Originally published at preptima.com (opens in a new tab).