Stock data documentation
File formats, columns, timestamps, adjustments and loading examples.
File formats
Parquet
Typed columns you can read selectively with pandas, Polars or DuckDB. Timestamps are integer nanoseconds in UTC.
CSV
Plain text. Check the types your loader infers, especially for timestamps and identifiers.
Column order
Bars hold prices, volume and trade count for each interval. Trades are single executions. Quotes are bid and ask updates.
1-minute bars
| Dataset | Columns, in file order |
|---|---|
| minute | symboltimestampopenhighlowclosevolumetrade_count |
Daily bars
| Dataset | Columns, in file order |
|---|---|
| day | symboltimestampopenhighlowclosevolumetrade_count |
Trades (tick data)
| Dataset | Columns, in file order |
|---|---|
| trades | symbolts_eventts_sippricesizeexchangesequence_numbertrade_idconditionscorrectiontapetrf_idts_trf |
Quotes (tick data)
| Dataset | Columns, in file order |
|---|---|
| quotes | symbolts_eventts_sipbid_priceask_pricebid_sizeask_sizebid_exchangeask_exchangesequence_numberconditionsindicatorstapets_trf |
Timestamps and trading hours
Parquet timestamps are integer nanoseconds since the Unix epoch, in UTC. Convert them explicitly. Sample tables on this site show Eastern Time.
A bar’s timestamp marks the start of its interval. 1-minute bars cover pre-market, regular session and after-hours. Convert with America/New_York so daylight saving is handled.
Bars come in 1-minute, 2-minute, 5-minute, 1-hour and daily timeframes. The 2-minute, 5-minute and 1-hour bars are built from the 1-minute bars. Each starts on a round clock time, Eastern, such as 10:00, 10:05 and 10:10. It takes the first open, the last close, the highest high and the lowest low, and adds up volume and trade count. A stretch with no trades has no bar.
Tick rows carry two timestamps. ts_event comes from the exchange and ts_sip from the SIP. They can differ.
Price adjustments
Prices come unadjusted and adjusted for splits and dividends. Pick one series and stay with it.
The split and dividend files are included. Check them, and ticker changes, when comparing prices across years.
Loading examples
Replace SYMBOL_minute.parquet or SYMBOL_minute.csv with your file path. pandas needs a Parquet engine such as pyarrow.
pandas
import pandas as pd
bars = pd.read_parquet("SYMBOL_minute.parquet")
bars["timestamp"] = pd.to_datetime(
bars["timestamp"], unit="ns", utc=True
)
print(bars.head())import pandas as pd
bars = pd.read_csv("SYMBOL_minute.csv")
print(bars.dtypes)
print(bars.head())Polars
import polars as pl
bars = pl.scan_parquet("SYMBOL_minute.parquet")
print(
bars.select("symbol", "timestamp", "close")
.head(5).collect()
)import polars as pl
bars = pl.scan_csv("SYMBOL_minute.csv")
print(bars.head(5).collect())DuckDB
SELECT
symbol,
make_timestamp_ns("timestamp") AS bar_start_utc,
open, high, low, close, volume, trade_count
FROM read_parquet('SYMBOL_minute.parquet')
ORDER BY "timestamp"
LIMIT 5;SELECT *
FROM read_csv_auto('SYMBOL_minute.csv')
LIMIT 5;Trades and quotes load the same way. Convert ts_event and ts_sip from UTC nanoseconds.
Delisted and reused symbols
Delisted stocks are filed under the symbol that traded on each date. Symbols get reused, so one symbol can cover more than one company.