Free market data, and what it quietly costs you
August 4, 2026
You can build a working research setup without paying for data. Plenty of people do. But free data is not the same product as paid data with the price removed, and the differences show up as backtest results that are better than reality.
Adjustments
A stock that splits two for one halves in price overnight. If your series is unadjusted, that looks like a 50% loss and your strategy reacts to it. Adjusted series fix this by scaling historical prices, and most free sources offer them.
The subtlety is that adjustment is retroactive. The adjusted price for a bar last year changes when a dividend is paid this year. So a backtest run today sees prices that nobody could have seen at the time. For most strategies this is a small effect. For anything keying on exact price levels, round numbers, or precise gaps, it is not.
Survivorship
This is the big one. Most free sources give you data for tickers that exist now. Companies that went bankrupt, got acquired, or were delisted are simply absent.
Backtest a strategy on today's index members over ten years and you have quietly selected for companies that survived ten years. Your results will be better than they should be, and the effect is largest exactly where you would want a strategy most, in the beaten-down value names.
There is no clean fix with free data. What you can do is know it is there, discount your results accordingly, and be suspicious of any strategy whose edge comes from buying the worst performers.
Point-in-time fundamentals
Prices are the easy part. Fundamentals get restated, and most free sources give you the current version of a number rather than the version that was public on the day. A backtest that trades on an earnings figure the market did not have yet is not a backtest, it is a time machine.
If your strategy uses fundamentals, either find point-in-time data or add a lag long enough to cover the reporting delay. A lag is crude, but it is honest.
Gaps, bad ticks and holidays
Free feeds have holes. A missing bar, a price with a misplaced decimal, a day the exchange was closed that appears anyway. Any of these can produce a return spike your strategy loves.
Check for them before you trust anything:
df = df.sort_index()
assert df.index.is_unique, "duplicate dates"
daily = df["Close"].pct_change()
suspicious = daily[daily.abs() > 0.5]
print(suspicious)
A 50% single day move is possible and rare. Anything the check flags deserves a look at the actual company before you accept it as real.
What free data is fine for
Learning the tools, building your pipeline, and testing whether an idea is worth pursuing. That is most of the work. Pay for data when you have a strategy that survives the free version and the remaining question is whether the edge is real or an artifact of bad inputs. Buying data first is a way of feeling serious without being any closer to an answer.