Missing DATA for AMT

python3 << 'EOF'
import os
from dotenv import load_dotenv
load_dotenv('somefile.')

from alpaca.data.historical import StockHistoricalDataClient
from alpaca.data.requests import StockBarsRequest
from alpaca.data.timeframe import TimeFrame
from alpaca.data.enums import DataFeed
from datetime import datetime, time as dtime
import pytz

ET = pytz.timezone("US/Eastern")
client = StockHistoricalDataClient(os.environ['API_KEY'], os.environ['API_SECRET'])

# Explicitly request SIP feed
req = StockBarsRequest(
symbol_or_symbols="AMT",
timeframe=TimeFrame.Minute,
start=datetime(2026, 6, 4, 9, 30, tzinfo=ET),
end=datetime(2026, 6, 4, 10, 30, tzinfo=ET),
feed=DataFeed.SIP,
)
bars = client.get_stock_bars(req)
df = bars.df

if df.empty:
print("No data even with explicit SIP feed!")
else:
df = df.reset_index()
df['timestamp'] = df['timestamp'].dt.tz_convert(ET)
print(f"First bar: {df.iloc[0]['timestamp']} | Bars: {len(df)}")
print(df.head(10)[['timestamp','open','high','low','close','volume']].to_string())
EOF

First bar: 2026-06-04 10:26:00-04:00 | Bars: 61
                  timestamp     open     high      low    close  volume
0 2026-06-04 10:26:00-04:00  185.210  185.370  185.170  185.260  3797.0
1 2026-06-04 10:27:00-04:00  185.250  185.430  185.250  185.430  3570.0
2 2026-06-04 10:28:00-04:00  185.520  185.525  185.520  185.525   583.0
3 2026-06-04 10:29:00-04:00  185.630  185.640  185.620  185.640  2038.0
4 2026-06-04 10:30:00-04:00  185.530  185.820  185.525  185.720  3405.0
5 2026-06-04 10:31:00-04:00  185.740  185.740  185.640  185.740  3448.0
6 2026-06-04 10:32:00-04:00  185.860  185.875  185.760  185.760  2998.0
7 2026-06-04 10:33:00-04:00  185.780  185.780  185.770  185.770  1773.0
8 2026-06-04 10:34:00-04:00  185.640  186.035  185.640  185.830  4355.0
9 2026-06-04 10:35:00-04:00  185.865  186.250  185.865  186.250  4601.0

Even with explicit feed=DataFeed.SIP, first bar is 10:26. Seems like a confirmed data gap on Alpaca’s side — they’re missing AMT data from 9:30 to 10:26 ET today even on SIP.


Hi Alpaca team,

I’m on the SIP data plan. Today (June 4, 2026) AMT (American Tower) has no 1-minute bar data before 10:26 AM ET, even when explicitly requesting feed=sip. The stock was actively trading from market open on NYSE (I can see the full tape on other platforms).

Can you check why SIP data is missing for AMT between 9:30-10:26 today?


This is a legit Alpaca bug — SIP should have every trade from every exchange starting at 9:30.

EDIT:
I ran the same code again(9:45 PM CDT) and Interesting — and it shows that Alpaca does have AMT data from 9:30 AM (13:30 UTC). First bar is right at market open with 59k volume. So right in the evening the data is there.

The issue was specific to morning day when I missed the alert. Alpaca had a temporary data gap on that particular session — the data came back later or simply wasn’t served during live hours.

This makes it harder to prove to Alpaca because if you check retroactively, the data might be backfilled. The real problem was that during live streaming that morning, the bars weren’t available. “data was missing during live market hours but may have been backfilled after the fact.” @Dan_Whitnable_Alpaca

@Angelo_Mendonca First, thank you very much for including your code. That greatly helped to solve the mystery.

The data is correct, and the Alpaca API returns all the bars as expected. The issue is that you are using pytz and have run into the notorious “LMT” (Local Mean Time) issue. By default, pytz timezone offsets are in Local Mean Time (LMT). This offset is not aligned with the standard time zones based on Coordinated Universal Time (UTC). The LMT offsets depend upon longitude and include minutes and not simply hours. Additionally, neither LMT nor UTC accounts for daylight saving time.

If you display pytz.timezone("US/Eastern") you will get something like this <DstTzInfo 'US/Eastern' LMT-1 day, 19:04:00 STD>. Notice the added 4 minutes. Also since LMT does not include daylight saving time, you are getting start=10:26 when you expected start=9:30. 10:26 LMT is equal to 9:30 EDT. The get_stock_bars method assumes the times are in UTC.

Do not use a pytz timezone directly in datetime, but rather use the localize method.

ET = pytz.timezone(“US/Eastern”)

# don't do this it will return a datetime in LMT
start = datetime(2026, 6, 4, 9, 30, tzinfo=ET)

# to get the UTC datetime with daylight saving time, use the localize method
correct_start = ET.localize(datetime(2026, 6, 4, 9, 30))

Actually, a probably better solution is not to use pytz at all. It was effectively deprecated with the release of Python 3.9 on October 5, 2020. Python now includes a native zoneinfo module. However, I find using pandas Timestamp and to_datetime to be much more flexible. You can enter dates as regular text.

import pandas as pd

start = pd.Timestamp("2026-06-04 9:30", tz="US/Eastern")

# or for more flexibility use to_datetime
start = pd.to_datetime("2026-06-04 9:30").tz_localize("US/Eastern")

Hope that explains things. Ensure your start and end times are in UTC, including daylight saving time, and you will get the data you expected.

1 Like