30-minute historical stock data
30-minute OHLCV bars for 6,924 US stocks back to January 2000, built from our 1-minute record. 13 bars per regular session, starting exactly at the 9:30 open.
What 30-minute bars look like
| Time | Open | High | Low | Close | Volume |
|---|---|---|---|---|---|
| 09:30 | 340.77 | 344.90 | 340.12 | 344.64 | 3,853,031 |
| 10:00 | 344.63 | 346.00 | 344.51 | 345.20 | 2,338,747 |
| 10:30 | 345.19 | 345.44 | 343.64 | 343.99 | 1,245,287 |
| 11:00 | 343.96 | 344.04 | 342.37 | 343.10 | 1,530,915 |
| 11:30 | 343.10 | 343.13 | 341.90 | 341.96 | 1,159,553 |
13 30-minute bars cover a regular session; AAPL had 32 on October 19, 2026 counting pre-market and after-hours. A year of regular-session 30-minute bars is about 3,276 rows per stock. Download a free sample file.
Get 30-minute bars in Python
import finzdata as yf
# yfinance-style
df = yf.Ticker("AAPL").history(start="2015-01-01", end="2015-02-01", interval="30m")
# or the client, with split- and dividend-adjusted prices
c = yf.Client()
bars = c.minutes("AAPL", start="2015-01-02", end="2015-01-31", interval="30min", adjust="all")Or call the REST API directly:
curl -H "X-API-Key: $FINZDATA_API_KEY" "https://data.finzdata.com/v1/prices/minute?symbol=AAPL&start=2024-01-02&end=2024-01-05&interval=30min&format=csv"What 30-minute bars are used for
Half-hour seasonality
Study the open, lunchtime lull and closing auction run-up in 13 even half-hour steps.
Lower-frequency intraday signals
For signals that hold for hours, 30-minute bars cut noise and data size while keeping the shape of the day.
Overnight versus intraday returns
Separate the gap at the open from moves during the session, using pre-market and after-hours bars.
Portfolio-level intraday backtests
About 3,300 regular-session rows per stock per year, so a 20-year test across thousands of stocks fits on a laptop.
Coverage
6,924 US stocks listed on the NYSE and Nasdaq have intraday history. How many start by each year:
| Intraday history starting by | US stocks |
|---|---|
| 2000 | 1,070 |
| 2005 | 1,528 |
| 2010 | 2,393 |
| 2015 | 3,103 |
| 2020 | 4,320 |
| Today | 6,924 |
Daily bars go further: every one of 16,000+ US stocks since 2000, delisted names included. See historical stock data.
How the bars are built
Every intraday bar is built from FinzData's 1-minute record. Bars are aligned to the clock and stamped at the start of the interval in US Eastern time. Open is the first minute's open, close the last minute's close, high and low the extremes, volume the sum. Minutes with no trades are left out, never forward-filled. Sessions: pre-market 4:00 to 9:30, regular 9:30 to 4:00, after-hours 4:00 to 8:00 p.m. Prices are stored as traded; ask for split- and dividend-adjusted prices with adjust="all".
Plans
1-minute, 5-minute, 15-minute and 30-minute bars come with the 25-year ($575), 30-year ($670) and Institutional ($975) history bundles, or for a single stock from $19 in the shop. Tick-level trades come with Institutional.
Frequently asked questions
How many 30-minute bars are there per day?
13 in the regular session and up to 32 with pre-market and after-hours. AAPL had 32 on October 19, 2026.
Do 30-minute bars start at 9:30?
Yes. Bars are aligned to the clock, so regular-session bars start at 9:30, 10:00, 10:30 and so on, each stamped at its start.
How far back does 30-minute data go?
To January 2000 for 1,070 stocks and 2010 for 2,393; each stock starts with its 1-minute record.
Can I get 30-minute bars as CSV?
Yes: from the API with format=csv, through the Python client as a pandas DataFrame, or as bulk Parquet files on paid plans.
Other bar sizes
1-Minute bars · 5-Minute bars · 15-Minute bars · Hourly bars · Daily bars · Tick data