Second Source Market Data
Second source market data when providers restate history
Quants who rely on a single provider for bar history can be surprised when that provider restates historical data. Databento restated historical Nasdaq TotalView-ITCH data on 31 October 2026, as noted in the provider blog https://databento.com/blog/nasdaq-totalview-itch-restatement-2026. Restatements are normal in market data, but they can break pipelines, shift backtests and change signals if you do not detect them. A second source is not a replacement, it is a cross-check that lets you quantify the impact, isolate the dates and decide whether to re-run research.
Why provider restatements happen and why they break pipelines
Market data providers ingest raw feeds from exchanges and reconstruct bars from trade and quote messages. When an exchange corrects late trades, cancels erroneous prints, or re-delivers a feed, the provider must restate history to keep the record accurate. For example, as of October 2026 Databento is restating its historical Nasdaq TotalView-ITCH data on 31 October 2026, with new instrument IDs before 28 November 2023, an after-hours fix and midnight snapshots, and notes it may be a breaking change (announcement, pricing).
Restatements can change row counts, session start and end times, and OHLC values. For intraday strategies that depend on first trade, last trade, or volume-weighted prices, even small corrections propagate into features and labels. Pipelines that cache bars by date will silently serve stale values after a restatement unless you version your inputs.
Backtests that are not reproducible become a risk. If a signal flips because a close moved by a few cents, you need to know whether the change is real or an artifact of the restatement. A second source market data check gives you an independent view of the same period so you can separate provider corrections from genuine market moves.
Operational impact is also real. Data pulls that previously matched now diverge, alerts fire, and downstream models retrain on different history. Documenting the restatement window and comparing against an independent source reduces debugging time and preserves trust in research.
How to validate history after a restatement
Validation starts with basic integrity checks. Compare row counts per symbol per day before and after the restatement window. Missing sessions are a common symptom of feed gaps or exchange holidays that were mis-labelled. Build a calendar of expected trading days and flag any date with zero rows.
Next check corporate actions. Split and dividend adjustments should be applied consistently. Compare adjusted close series to unadjusted prices and verify adjustment factors match the point-in-time record. A mismatch here will create artificial jumps in returns.
OHLC differences beyond a tolerance need investigation. Join the two histories on date and compute absolute and percentage differences for open, high, low and close. Flag close diffs greater than 0.5% for manual review. Volume differences are also informative, especially for intraday bars where late trades are added.
Keep a restatement log with provider, dataset, restatement date, affected date range, and the metrics you checked. This log becomes part of your data governance and makes audits straightforward when results change.
Use a second source as a cross-check, not a replacement
A second source market data set is a control, not a primary feed. FinzData provides 16,000+ US stocks since January 2000 including delisted names, 231 ETFs, daily to 1-minute bars, and futures since 2007. Intraday bars are stamped at the start of each interval in US Eastern time; minutes without trades are omitted, never forward-filled.
Point-in-time universe means the stocks that actually traded on each date, which is essential when you compare histories after a restatement. Delisted names remain in the history so survivorship bias does not distort the comparison.
When you cross-check, align timestamps, time zones and adjustment methods first. Then compare distributions, not just point values. A second source helps you confirm whether a change is isolated to one provider or reflects a broader market data correction.
FinzData is a market-data API and Python client that mirrors yfinance. Install with pip install finzdata, import finzdata as yf. The client returns pandas DataFrames. REST API at https://api.finzdata.com returns JSON or CSV; Parquet and bulk files on paid plans.
Free bar check tool for missing sessions and price differences
FinzData provides a free bar check tool at /tools/bar-check. Upload a CSV of daily or minute bars with time/date or ts_event column and open/high/low/close. The tool reports missing sessions and price differences against the FinzData reference.
The workflow is simple. Export your provider bars to CSV, upload the file, and review the summary of missing dates, duplicate rows and OHLC deviations. The report highlights dates where close differs beyond your chosen tolerance and lists sessions with no data.
This is useful after a restatement when you need a quick sanity check without writing custom joins. It is also helpful for onboarding a new provider or validating an ETL pipeline. The tool is free and does not require an API key.
For deeper work, pull the same symbols from FinzData in Python and run statistical comparisons. The Python client supports yf.Ticker, yf.download and yf.Client().c.prices for bulk access.
CODE: Compare Databento export to FinzData with pandas
import finzdata as yf
import pandas as pd
import databento as db
# 1. Export daily bars from Databento (prices as decimals, ISO timestamps)
client = db.Historical("YOUR_DATABENTO_KEY")
dbn = client.timeseries.get_range(dataset="XNAS.ITCH", schema="ohlcv-1d", symbols=["AAPL"],
start="2024-01-02", end="2024-06-28")
a = dbn.to_df(pretty_px=True, pretty_ts=True).reset_index()
a.to_csv("AAPL_databento_daily.csv", index=False) # upload this file to /tools/bar-check
a["date"] = pd.to_datetime(a["ts_event"]).dt.date
# 2. The same window from FinzData (free key covers the last 12 months)
b = yf.Ticker("AAPL").history(interval="1d", start="2024-01-02", end="2024-06-28").reset_index()
b["date"] = pd.to_datetime(b.iloc[:, 0]).dt.date
# 3. Join on date and flag closes that differ by more than 0.5%
m = a.merge(b, on="date", how="outer", suffixes=("_db", "_fd"), indicator=True)
print(m["_merge"].value_counts()) # sessions only in one source
m["diff_pct"] = (m["close_db"] / m["Close"] - 1) * 100
print(m.loc[m["diff_pct"].abs() > 0.5, ["date", "close_db", "Close", "diff_pct"]])What FinzData adds beyond bars
Beyond bars, FinzData provides point-in-time fundamentals, delisted names and a survivorship-free universe. This is valuable when a restatement raises questions about corporate actions or listing history.
Point-in-time fundamentals let you validate split and dividend adjustments independently of the bar provider. Delisted names remain queryable so you can test whether a restatement affects companies that no longer trade.
Every subscriber gets access to the FinzData strategies page and research, including the AI Trading Tournament. The Python client mirrors yfinance for fast adoption by teams already using pandas.
Free tier includes last 12 months of every dataset, 1,000 API calls a day, no card. Full history is a one-time purchase that is yours to keep.
Start free
Start with the free tier: last 12 months of every dataset, 1,000 API calls a day, no card. Full history is a one-time purchase that is yours to keep. Every subscriber gets access to the FinzData strategies page and research, including the AI Trading Tournament.
Use a second source market data check to validate provider restatements and keep your pipelines reproducible. Explore samples and pricing to plan your workflow.
Frequently asked questions
Why do providers restate historical market data?
Exchanges correct late trades, cancel erroneous prints or re-deliver feeds. Providers restate history to reflect the corrected record. As of October 2026, Databento is restating historical Nasdaq TotalView-ITCH data on 31 October 2026.
How do I know if a restatement broke my pipeline?
Compare row counts, missing sessions, split/dividend adjustments and OHLC differences beyond tolerance. A second source cross-check flags dates where close differs by more than 0.5%.
Is a second source a replacement for my primary provider?
No. A second source is a cross-check for validation, not a replacement. Use it to quantify impact and decide whether to re-run research after a restatement.
What does the free bar check tool do?
Upload a CSV of daily or minute bars with time/date or ts_event and open/high/low/close. It reports missing sessions and price differences against FinzData reference at /tools/bar-check.
What does FinzData provide beyond bars?
Point-in-time fundamentals, delisted names and a survivorship-free universe. 16,000+ US stocks since January 2000 including delisted names, daily to 1-minute bars, futures since 2007.