Delisted stock data for survivorship-bias-free backtesting

Updated every trading day -- stock data current through 2026-09-09.

Why delisted tickers matter

MarketParquet stock history includes delisted securities, so a backtest is not limited to companies that survived until today. Stock files cover 1-minute, 5-minute, 30-minute, 1-hour, and daily bars back to January 2000.

Stock and ETF prices are split-adjusted: historical prices are retroactively divided by later split factors so series remain continuous and directly comparable. Dividends are deliberately not embedded in the price series -- see the methodology page for why.

Terminal-date workflow

Files are partitioned by trading date under by_date/stock_{timeframe}/YYYY/YYYY-MM-DD.parquet. Each file contains all symbols for that trading day, including names that later disappear from active listings.

  import polars as pl

  df = pl.scan_parquet("by_date/stock_daily/2024/*.parquet")
  by_symbol = (
      df.group_by("symbol")
        .agg([
            pl.col("date").min().alias("first_seen"),
            pl.col("date").max().alias("last_seen"),
        ])
        .collect()
  )

Available stock files

TimeframeFilesDate Range
1-Min6,7982000-01-03 .. 2026-09-09
5-Min6,7982000-01-03 .. 2026-09-09
30-Min6,7982000-01-03 .. 2026-09-09
1-Hour6,7982000-01-03 .. 2026-09-09
Daily6,8262000-01-03 .. 2026-09-09

Related

stock data hub · browse stock daily · pricing · intraday stock data · yfinance limitations