Data quality & methodology
What is actually in the files: adjustment math, session rules, roll handling, missing-bar policy, the QA gates every file passes before it is published, and a public correction changelog. The OHLCV data itself -- what is in the archive and how to read it -- is described on the historical market data page. Stocks & ETFs current through 2026-10-23 · futures through 2026-10-23.
Sources & provenance
Bars are licensed from an institutional market-data vendor that builds them from exchange trade feeds; we do not scrape prices or synthesize bars ourselves. Every timeframe (1-minute, 5-minute, 30-minute, 1-hour, daily) is delivered natively by the vendor and published as-is -- we never resample one timeframe into another, which avoids the precision drift and session-boundary bugs that resampling introduces.
Active tickers are refreshed every trading day after the close. Recently delisted tickers are merged in from a separate delisted feed weekly, with a checkpointed merge ledger so an interrupted merge can resume without dropping or duplicating rows.
Universe & survivorship bias
The daily archive covers over 21,000 distinct symbols across stocks, ETFs, and futures. Roughly 10,000 of those no longer trade -- they were delisted, acquired, or merged -- and their full history stays in the archive. A single recent trading day contains about 6,500 active stocks; a single day in 2010 contains thousands of tickers that no longer exist.
Delisted tickers are marked with a -DELISTED suffix on the
symbol, so one file gives you the tradeable universe exactly as it
existed on that date while still letting you separate live from dead
listings with a single filter. The 2010-01-04 daily file alone contains
3,516 suffixed symbols. This is what "survivorship-bias-free" means
concretely: a momentum screen run on 2010 data sees the stocks that
later went to zero, not just the winners that survived to today.
Sessions & timestamps
- All timestamps are US/Eastern, stored timezone-naive. The
timestampcolumn is the bar open time. - Stock and ETF intraday files cover the extended session: first bar 04:00 (premarket), last 1-minute bar opens 19:59 (post-market). Regular-session bars open 09:30–15:59.
- Futures intraday files cover the near-24-hour Globex-style session: bars from 00:00 through 23:59 Eastern.
- Daily files carry one row per symbol per trading day. Files written since 2026-03-27 use a
date(DATE) column; older archive files use a midnighttimestampinstead -- see the changelog below and the docs for a one-lineCOALESCEpattern that reads both.
Corporate actions: split adjustment
Stock and ETF prices are split-adjusted: when a company splits its stock, all historical prices are divided (and volumes multiplied) by the split ratio, so price series are continuous and percentage returns are correct across the split.
A worked example you can verify in the archive: AAPL closed at $214.01 on 2010-01-04 as traded. Apple has since split 7-for-1 (2014) and 4-for-1 (2020), a combined factor of 28. The 2010-01-04 daily file shows AAPL close = 7.6432 -- exactly 214.01 ÷ 28.
Dividends are not embedded in the price series. Prices are the levels at which the stock actually traded (divided by later split factors), not a total-return series. This is deliberate: dividend ("adjusted close") smoothing rewrites the prices your stops, limits, and percentage moves would have executed at, and it silently changes the entire history every time a new dividend is paid -- which breaks backtest reproducibility. If your strategy needs total returns, apply a dividend series on top; the price files stay stable underneath.
What the split basis includes. The split-only series is the data source's, and its split factors also cover stock dividends (a 5% stock dividend is treated as a 21-for-20 split: CBSH in 2025-12, TR in 2025-04 and 2026-04, the stock component of RYN's 2025-12 special dividend) and, case by case, a large spin-off distribution (DD's Qnity spin-off of 2025-11-03: DD prices before that date carry a 0.418 factor). Cash dividends are never embedded; mergers and the other spin-offs in the archive are left as traded. We document these adjustments rather than reversing them, so the files match the source's own full-history series and never change again later.
Futures methodology
Futures are delivered as continuous, ratio back-adjusted
contracts under root symbols (ES,
CL, GC, ZN, ...), about 130
active roots per day. The data source chains front-month contracts and
rolls before expiry, when trading volume migrates to the next
contract; it does not publish the exact roll dates. At a roll the
entire earlier series is multiplied by the ratio of the new front
contract's open to the expiring contract's close, which preserves
percentage returns and never produces negative prices deep
in the history. Two consequences to be aware of: far-history price
levels differ from what the then-front contract printed (true
of any continuous series), and volume is the traded volume of the
underlying contract, not interpolated. Daily futures bars follow each
contract's official trading day (for most CME contracts 6:00 PM ET on
the previous calendar day to 5:00 PM ET); intraday files roll at
midnight ET.
Roll table. Every roll the nightly build observes is
recorded with its date and ratio and published as
meta/futures_rolls.parquet (root, roll_date, ratio), and
the source's contract-by-day calendar as
meta/futures_contract_calendar.parquet (root, date,
contract, roll), so you can re-base any era yourself or build an
unadjusted series from the files.
Basis. Every futures file sits on the data source's
current ratio-adjusted basis (history re-based from the source's
full-history files on 2026-10-03); the trailing 30-day window is re-based
nightly as rolls happen and each roll is recorded. Two source-side
quirks remain: the micro contracts MCL, MNQ and
MGC lack a handful of sessions near expiries that the
full-size roots have, and the G (long gilt) and
SO3 (three-month SONIA) daily bars occasionally carry an
open outside the day's high-low range; both are passed through as
received.
Missing bars & zero volume
Intraday files contain a bar only for minutes in which the symbol actually traded. No synthetic bars are inserted and nothing is forward-filled: AAPL has 741 one-minute bars on 2024-01-03 out of a 960-minute extended session, because it did not trade in every premarket and post-market minute. Illiquid small-caps have far fewer. If your pipeline needs a dense time grid, reindex against the session calendar and decide explicitly how to fill -- the data will not make that decision for you.
A small number of zero-volume bars do occur (about 0.1% of rows in a typical 1-minute file); they come from the vendor feed (indicative or odd-lot-only prints) and are passed through unmodified rather than being silently deleted.
QA gates every file passes
Before a Parquet file is published, the ingestion pipeline enforces:
- Feed integrity -- vendor responses are validated as real ZIP archives; an HTML error or maintenance page can never masquerade as an empty-but-successful update.
- Symbol-count floors -- a day's file is rejected and retried if it contains fewer than 4,000 stocks (2,500 ETFs / 20 futures roots), which catches partial vendor builds.
- Trailing-edge re-pull -- the most recent 4 trading days are re-downloaded on every nightly run, so a day first captured while the vendor was still assembling it is replaced by the complete version.
- Split-adjustment heal -- every nightly run diffs the vendor's full trailing 30-day window against the published files and rewrites any date where a symbol's prices or volumes changed, so retroactive split re-basing and vendor corrections land in the archive instead of being skipped; symbols the source carries that a published day lacks (new listings, a day captured before the source finished it) are added. Splits reaching further back are verified against an independent data source and back-adjusted through full history, automatically for unambiguous cases. Daily futures are diffed the same way, and each contract roll is recorded in the roll table.
- Regular-session check -- before a daily stock or ETF date is published, the bars of its 50 most liquid symbols are compared with the regular session (09:30-16:00 ET) of our own 1-minute file for that date and with an independent daily source's closes. A date whose bars include pre-market or after-hours trading is withheld and retried at the next run. (Daily bars are the official regular session; see the open correction below.)
- Continuity monitoring -- adjacent-session close ratios are scanned nightly for split-shaped jumps (including early "pre-applied" adjustments the vendor occasionally publishes before a split's effective date, which we quarantine until the split is real).
- Duplicate resolution -- exact duplicate rows are dropped; conflicting rows for the same (timestamp, symbol) key keep the vendor's latest correction; a symbol delivered in both the stock and the ETF bundle is kept only in its canonical class; a ticker's bare rows are dropped on days where its
-DELISTEDhistory is already stored. - Trading calendar -- stock and ETF files are written only for NYSE sessions; rows dated on weekends or market holidays are discarded. Futures trade on most US holidays and are exempt.
- Ticker changes -- a symbol that stops trading while a new one starts at the same price, or a symbol that reappears after a long gap at a very different level (a reused ticker), is flagged for a human decision before any rename.
- Schema enforcement -- every file is written against a fixed Arrow schema (typed columns, microsecond timestamps, Snappy compression) and deterministically sorted by time then symbol.
- Price sanity -- rows with a zero or negative price are dropped; rows whose open or close falls outside the day's own high-low range are counted and named in the nightly report and passed through unmodified. As of 2026-10-02 the only known such rows are the G and SO3 futures bars noted above.
Corrections & changelog
Vendor-side corrections inside the trailing 30-day window are picked up by the nightly re-pull. Anything older is rebuilt from the source's full-history files -- or, for regular-session daily bars, from an independent daily source confirmed by our own 1-minute bars -- on a staging copy of the archive, verified there, and promoted in one pass. Changes that alter published files are recorded here; the affected tickers are listed on the changelog:
- 2026-10-25 -- Full history re-based across every timeframe for MBRX (1-for-20) and REVB (1-for-7) -- effective 2026-10-20 to 2026-10-20. The table lists every ticker adjusted to date. [tickers]
- 2026-10-25 -- FRGT's daily file had its 1-for-2.2 reverse split of 2022-02-15 applied twice to every bar before that date (prices 2.2 times too high, volume 2.2 times too low); the 1-minute to 1-hour files were right. The daily bars from 2017-08-09 to 2022-02-14 now match them. The 1-for-10 of 2026-10-19 follows separately. [tickers]
- 2026-10-25 -- Complete price history added for tickers that stopped trading, stored under the -DELISTED suffix across all five stock timeframes. This week: ACVA, ATKR, BZH, PERF, SDST. [tickers]
- 2026-10-25 -- BNY's daily file now has the seven sessions from 2026-06-01 to 2026-06-09 that were missing. The bars are Alpha Vantage's as-traded regular-session bars, checked against the stored closes on both sides of the gap (same basis, no split in between). BNY's intraday files for those days are unchanged. [tickers]
- 2026-10-24 -- Full history re-based across every timeframe for AMTD (1-for-60), CAPS (1-for-30), GP (1-for-5) and OBAI (1-for-20) -- effective 2026-10-19 to 2026-10-19. The table lists every ticker adjusted to date. [tickers]
- 2026-10-21 -- KNDI's 1-for-10 reverse split (effective 2026-10-16) is now applied across its full history in every timeframe. [tickers]
- 2026-10-20 -- Full history re-based across every timeframe for BTOC (1-for-16) and DXJ (3-for-1) -- effective 2026-10-09 to 2026-10-15. The table lists every ticker adjusted to date. [tickers]
- 2026-10-19 -- SKIN's 1-for-20 reverse split (effective 2026-10-14) is now applied across its full history in every timeframe. [tickers]
- 2026-10-18 -- FMFC's 1-for-40 reverse split (effective 2026-10-13) is now applied across its full history in every timeframe. [tickers]
- 2026-10-18 -- Complete price history added for tickers that stopped trading, stored under the -DELISTED suffix across all five stock timeframes. This week: CCO, GWHT. [tickers]
- 2026-10-17 -- Full history in every timeframe now carries every 2026 reverse split: CDT's 1-for-25 of 2026-03-27, NIVF's splits up to the 1-for-4 of 2026-10-12 (bars before 2026-09-16), NXGL's 1-for-20 of 2026-10-12 (bars before 2026-10-09) and the 1-for-10 of 2026-10-05 for VJET, formerly VTAK. [tickers]
- 2026-10-17 -- Full history re-based across every timeframe for DFLI (1-for-8), MDCX (1-for-50), POAS (1-for-15) and ZBAO (1-for-50) -- effective 2026-10-12 to 2026-10-12. The table lists every ticker adjusted to date. [tickers]
- 2026-10-16 -- Full history re-based across every timeframe for CDT (1-for-25), GCDT (1-for-6), GMEX (1-for-9), KUST (1-for-10) and RETO (1-for-20) -- effective 2026-09-28 to 2026-10-07. The table lists every ticker adjusted to date. [tickers]
- 2026-10-14 -- GLE's 1-for-10 (effective 2026-10-08) and BSFC's 1-for-1600 (effective 2026-10-08) are now applied across each stock's full history in every timeframe: GLE's bars before 2026-09-14 and BSFC's bars before 2026-09-09 were still on the pre-split basis, and GLE's 2026-09-14 to 10-06 bars were 100 times too high. [tickers]
- 2026-10-13 -- Full history re-based across every timeframe for MGF (1-for-5) and MIN (1-for-6) -- effective 2026-10-08 to 2026-10-08. The table lists every ticker adjusted to date. [tickers]
- 2026-10-12 -- SUGP's 1-for-6 reverse split (effective 2026-10-07) is now applied across its full history in every timeframe. [tickers]
- 2026-10-12 -- Complete price history added for tickers that stopped trading, stored under the -DELISTED suffix across all five stock timeframes. This week: BLFS, DRCT, FSEA, NSTS, QRVO, SLP, TWOD, WBD. [tickers]
- 2026-10-11 -- Full history re-based across every timeframe for GPMT (1-for-10) and ITOC (1-for-16) -- effective 2026-10-06 to 2026-10-06. The table lists every ticker adjusted to date. [tickers]
- 2026-10-10 -- Full history re-based across every timeframe for CMND (1-for-8), GUTS (1-for-12), SCNX (1-for-25) and VIVK (1-for-15) -- effective 2026-10-05 to 2026-10-05. The table lists every ticker adjusted to date. [tickers]
- 2026-10-07 -- ZCMD's 1-for-2 reverse split (effective 2026-10-02) is now applied across its full history in every timeframe. [tickers]
- 2026-10-06 -- Full history re-based across every timeframe for BGM (1-for-30) and MYPS (1-for-10) -- effective 2026-10-01 to 2026-10-01. The table lists every ticker adjusted to date. [tickers]
- 2026-10-05 -- Full history re-based across every timeframe for DHY (1-for-10) and SHFS (1-for-12) -- effective 2026-09-30 to 2026-09-30. The table lists every ticker adjusted to date. [tickers]
- 2026-10-05 -- Complete price history added for tickers that stopped trading, stored under the -DELISTED suffix across all five stock timeframes. This week: AMZE, DBRG, GBTG, GETY. [tickers]
- 2026-10-04 -- Full history re-based across every timeframe for AGRZ (1-for-20), ONMD (1-for-10), TRUG (1-for-10) and VRME (1-for-10) -- effective 2026-09-29 to 2026-09-29. The table lists every ticker adjusted to date. [tickers]
- 2026-10-04 -- The 1-minute to 1-hour stock and ETF files now match the daily files: tickers stored in both the stock and ETF files live in one class, BNY's fund history is BNY-DELISTED and BK's bars carry BNY, bare rows beside their -DELISTED history, one-row files on market holidays and zero-price rows are removed. [tickers]
- 2026-10-03 -- Full history re-based across every timeframe for BTLN (1-for-8), DLXY (1-for-5), FBGL (1-for-10), IMMP (1-for-20) and MTNB (1-for-15) -- effective 2026-09-28 to 2026-09-28. The table lists every ticker adjusted to date. [tickers]
- 2026-10-03 -- Duplicate rows are gone from ten ETF daily files; tickers stored in both the stock and ETF files now live in one class; bare rows beside their -DELISTED history and one-row files on market holidays are removed; every futures file now sits on the source's current ratio-adjusted basis. [tickers]
- 2026-10-03 -- Every daily stock and ETF file since 2025-10-01 now carries the data source's full symbol set for the day: about 100 stocks and 60 to 125 ETFs a day were missing before mid-2026, and 2026-03-27 through 2026-05-08 also lacked most preferred-share tickers. The 32 rebuilt dates carry the source's regular-session bars. [tickers]
- 2026-10-03 -- Daily stock and ETF files for 2026-03-27 through 2026-05-08 (ETF file only on 04-09) now contain regular-session bars and the symbols they lacked; 2025-12-04 and 2026-03-26 are complete. The BNY fund's history is now BNY-DELISTED and BK's rows join BNY Mellon's. New listings are back-filled from their first session. [tickers]
- 2026-10-01 -- Full history re-based across every timeframe for JAGX (1-for-35) and WHLR (1-for-4) -- effective 2026-04-30 to 2026-08-27. The table lists every ticker adjusted to date. [tickers]
- 2026-09-30 -- Full history re-based across every timeframe for ALP (1-for-50), AVXX (1-for-3), BNRG (1-for-6), CANG (1-for-10), HUBC (1-for-20), ICCM (1-for-30), IDXG, INLF, JAGX, KITT, MGN, MSTU, NCT, PHGE, RPGL, SUGP, SXTC, WHLR and WYHG -- effective 2026-03-23 to 2026-10-07. The table lists every ticker adjusted to date. [tickers]
- 2026-09-29 -- Full history re-based across every timeframe for HLSQ (1-for-10) and KRSA (1-for-7) -- effective 2026-09-09 to 2026-09-09. The table lists every ticker adjusted to date. [tickers]
- 2026-09-28 -- Full history re-based across every timeframe for IBO (1:12.6) and MSGY (1-for-8) -- effective 2026-07-20 to 2026-08-26. The table lists every ticker adjusted to date. [tickers]
- 2026-09-27 -- Full history re-based across every timeframe for AXTX (1-for-4), CRMX (1-for-4), LITZ (1-for-4), NBIZ (1-for-4), QBTX (1-for-4), QUBX (1-for-4), UNX (4-for-1) and VWAV (1-for-20) -- effective 2026-09-22 to 2026-09-22. The table lists every ticker adjusted to date. [tickers]
- 2026-09-27 -- Complete price history added for tickers that stopped trading, stored under the -DELISTED suffix across all five stock timeframes. This week: SAT. [tickers]
- 2026-09-23 -- EPOW's 1-for-25 reverse split (effective 2026-09-18) is now applied across its full history in every timeframe. [tickers]
- 2026-09-21 -- MPU's 1-for-20 reverse split (effective 2026-09-16) is now applied across its full history in every timeframe. [tickers]
- 2026-09-20 -- Full history re-based across every timeframe for IZM (1-for-5) and OPTT (1-for-30) -- effective 2026-09-14 to 2026-09-15. The table lists every ticker adjusted to date. [tickers]
- 2026-09-20 -- Complete price history added for tickers that stopped trading, stored under the -DELISTED suffix across all five stock timeframes. This week: ATAI, BRNS, FEED. [tickers]
- 2026-09-19 -- Full history re-based across every timeframe for CPOP (1-for-15), IPDN (1-for-30), NFE (1-for-50), NRSN (1-for-20) and NXXT (1-for-10) -- effective 2026-09-14 to 2026-09-14. The table lists every ticker adjusted to date. [tickers]
- 2026-09-18 -- XCH's 1-for-20 reverse split (effective 2026-08-21) is now applied across its full history in every timeframe. [tickers]
- 2026-09-16 -- Full history re-based across every timeframe for GAUZ (1-for-20) and GOSS (1-for-80) -- effective 2026-09-11 to 2026-09-11. The table lists every ticker adjusted to date. [tickers]
- 2026-09-15 -- Full history re-based across every timeframe for ASTN (1-for-4), LFT (1-for-10), LGHL (1-for-20), LNOK (2-for-1), OKLL (1-for-5), OSCX (3-for-1), QBTZ (1-for-5), RGTZ (1-for-5) and SMCZ (1-for-2) -- effective 2026-09-09 to 2026-09-10. The table lists every ticker adjusted to date. [tickers]
- 2026-09-14 -- Full history re-based across every timeframe for IONZ (1-for-10), RKLZ (1-for-5) and UCAR (1-for-20) -- effective 2026-09-09 to 2026-09-09. The table lists every ticker adjusted to date. [tickers]
- 2026-09-14 -- Complete price history added for tickers that stopped trading, stored under the -DELISTED suffix across all five stock timeframes. This week: APGE, CRNX. [tickers]
- 2026-09-13 -- Full history re-based across every timeframe for AIXI (1-for-7), BRTX (1-for-20), CTSO (1-for-20), GTBP (1-for-25), IGR (1-for-3), LRHC (1-for-6), SFWL (1-for-15), TNMG (1-for-8), TXXD (1-for-10) and WCT (1-for-5) -- effective 2026-09-08 to 2026-09-08. The table lists every ticker adjusted to date. [tickers]
- 2026-09-10 -- Full history re-based across every timeframe for GPUS (1-for-5) and ZCMD (1-for-2) -- effective 2026-08-17 to 2026-10-02. The table lists every ticker adjusted to date. [tickers]
- 2026-09-09 -- Full history re-based across every timeframe for ARTL (1-for-9), CALC (1-for-5), CLGN (1-for-10), FGL (1-for-100), KAPA (1-for-7), NIVF (1-for-3) and TANH (1-for-50) -- effective 2026-08-31 to 2026-09-04. The table lists every ticker adjusted to date. [tickers]
- 2026-09-08 -- APH's 2-for-1 split (effective 2026-09-03) is now applied across its full history in every timeframe. [tickers]
- 2026-09-06 -- Full history re-based across every timeframe for RUSHA (1.5:1) and RUSHB (1.5:1) -- effective 2026-09-01 to 2026-09-01. The table lists every ticker adjusted to date. [tickers]
- 2026-09-06 -- Complete price history added for tickers that stopped trading, stored under the -DELISTED suffix across all five stock timeframes. This week: ALOT, BCAB, BGICF. [tickers]
- 2026-09-03 -- PN's 1-for-20 reverse split (effective 2026-04-13) is now applied across its full history in every timeframe, and WLDS's 1-for-3 (effective 2026-06-22) across history through that date. The table lists every ticker adjusted to date. [tickers]
- 2026-09-02 -- Full history re-based across every timeframe for CURX (1-for-20), CYCU, ELAB, GAME, IMCC (1-for-30), INCR, LGVN, LIMN (1-for-50), NVX, SCNI, SKYE, VCIG, WHLR and YMT -- reverse splits effective 2026-08-20 to 2026-08-28. [tickers]
- 2026-08-31 -- REAX completed its combination with RE/MAX and now trades as Real REMAX Group; its 1-for-10 share consolidation (effective 2026-08-25) is applied across REAX's full history in every timeframe. VMAR's 1-for-10 reverse split (effective 2026-08-26) likewise applied across full history. [tickers]
- 2026-08-28 -- GLMD daily bars before 2023-05-15 now carry its 1-for-15 reverse split (intraday bars already did). BRNX 2026-07-27 re-based for its 1-for-6 (effective 08-13). BTOG 1-for-5 and SMTK 1-for-50 (both effective 08-21): full history re-based across every timeframe. [tickers]
- 2026-08-27 -- Full history re-based across every timeframe for CDT, CIIT, CISS (1-for-40), CPOP, CRIS, FTFT, GLMD (1-for-8), HKIT, JEM, LBGJ, MSS, NIVF, NUWE, PAVS, SFBS (2-for-1), SGLY, WHLR and ZNB, mostly reverse splits effective 2026-07-06 to 2026-08-21. The table lists every ticker adjusted to date. [tickers]
- 2026-08-25 -- The 1-minute to 1-hour bars for 2026-07-22, 07-23 and 07-24 now match the daily bars for NRDY (1-for-15), CISS (1-for-40) and GLMD (1-for-8); those three sessions had stayed at pre-split prices after the daily bars were adjusted. [tickers]
- 2026-08-20 -- Splits announced but not yet effective (SFBS 2-for-1 on 2026-08-21, IESC 2-for-1 on 08-24, RUSHA/RUSHB 3-for-2 on 09-01, LNOK 2-for-1 on 09-10). Daily bars for 2026-08-03 to 08-06 (LNOK 07-27 to 08-10) and intraday bars through 08-18 are as-traded again; each history is adjusted once its split takes effect. [tickers]
- 2026-08-19 -- XCH's announced 1-for-20 reverse split has not taken effect yet. Those 20 sessions carry as-traded prices and volumes again, continuous with 2026-08-17 onward; the history is adjusted once the split is effective. [tickers]
- 2026-08-19 -- Full history re-based for 22 further tickers, mostly reverse splits effective 2026-07-20 to 2026-08-14 (e.g. MVIS 1-for-15, BYND 1-for-30). Also re-based: AEHL, ELPW, SXTC, THH for 2026-07-13 to 2026-07-17; IPW, LABX, SNDQ through their split dates. The table lists every ticker adjusted to date, newest first. [tickers]
- 2026-08-16 -- Complete price history added for tickers that stopped trading, stored under the -DELISTED suffix across all five stock timeframes. This week: CCIX, ELSE, EA, GVHGF, STRS, VSEE. Runs every Sunday; the table below is regenerated after each run. [tickers]
- 2026-08-15 -- Complete price history added for tickers that stopped trading, stored under the -DELISTED suffix across all five stock timeframes. [tickers]
- 2026-08-12 -- Prices and volumes re-based across full history for 221 tickers, so each series is continuous through its split. Ratio reads new-for-old: 4-for-1 is a forward split, 1-for-10 a reverse split. Every ticker adjusted to date is listed in the table under the newest split entry. [tickers]
- 2026-07-27 -- All tickers delisted in the trailing year merged across every stock timeframe. [tickers]
- 2026-03-27 -- Daily files switched from a midnight timestamp column to a typed date column. Files written before that date keep the legacy column; both read cleanly with union_by_name / COALESCE. [tickers]
- Ongoing -- weekly delisted merges (Saturdays) append final history for newly delisted tickers with the
-DELISTEDsuffix; the nightly pipeline re-pulls the vendor's trailing 30-day window and rewrites any published day whose values changed.
Check files yourself
Every claim above is verifiable locally -- the checks below run in milliseconds with DuckDB:
import duckdb
con = duckdb.connect()
checks = con.execute("""
SELECT
COUNT(*) AS rows,
COUNT(DISTINCT symbol) AS symbols,
COUNT(DISTINCT CASE WHEN symbol LIKE '%-DELISTED'
THEN symbol END) AS delisted_symbols,
SUM(CASE WHEN high < low THEN 1 ELSE 0 END) AS bad_ranges,
SUM(CASE WHEN volume = 0 THEN 1 ELSE 0 END) AS zero_volume,
MIN(timestamp) AS first_bar,
MAX(timestamp) AS last_bar
FROM 'stock_1min_2024-01-03.parquet'
""").fetchdf()
Expected on that file: 1,280,735 rows, 7,180 symbols, 1,194 delisted symbols, 0 bad ranges, first bar 04:00, last bar 19:59.
Related
OHLCV data · stock data hub · browse stock daily · delisted stock data · continuous futures · DuckDB guide · pricing