Top pre-market movers
Overview
This example demonstrates how to use the Historical client to retrieve OHLCV-1m bar aggregate data to analyze the largest movers in the Nasdaq pre-market. Equities which are trading in the early pre-market may be reacting to recent events or news announcements, relevant to a single stock, an industry, or an entire sector. This notable pre-market activity usually manifests in large price changes and volume, which significantly exceed the normal range, and may be indicative of subsequent moves after the session open.
For our purposes we'll define the pre-market as 4:00 AM to 9:30 AM in the 'US/Eastern' time zone, which accounts for changes for daylight savings.
You can find more information on Nasdaq trading hours here.
Nasdaq dataset
For this example, we'll use the Nasdaq TotalView-ITCH dataset, whose dataset ID is XNAS.ITCH. You'll need to pass this in as the dataset parameter of any API or client method.
OHLCV-1m schema
The data we need will come from the OHLCV-1m schema. The OHLCV family of schemas contain the opening, high, low, and closing prices, as well as the aggregated volume of trades occurring within each time interval. Since we are interested in a specific market session, we'll use an interval of one minute, which is specified by the suffix -1m.
Example
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33
import databento as db
import pandas as pd
# Create a historical client
client = db.Historical(key="$YOUR_API_KEY")
# Next, request OHLCV-1m bars for the time range we're interested in
data = client.timeseries.get_range(
dataset="XNAS.ITCH",
schema="ohlcv-1m",
symbols="ALL_SYMBOLS",
start=pd.Timestamp("2023-06-06T04:00", tz="US/Eastern"),
end=pd.Timestamp("2023-06-06T09:30", tz="US/Eastern"),
)
# We need to obtain the symbology mappings for 'ALL_SYMBOLS'
symbology = data.request_symbology(client)
# This allows us to populate the 'symbol' column when we convert to a DataFrame
data.insert_symbology_json(symbology)
# Convert to dataframe with timestamps in the US/Eastern timezone
df = data.to_df(tz="US/Eastern")
# Combine the first open, last close and volume sum into a DataFrame
df_moves = df.groupby("symbol").agg({"open": "first", "close": "last", "volume": "sum"})
# Calculate the change from start to end of pre-market
df_moves["change"] = (df_moves["close"] - df_moves["open"]) / df_moves["open"]
df_moves = df_moves.sort_values(by="change", ascending=False)
# Display the top 10 largest movers
print(df_moves.head(10)) Result
1 2 3 4 5 6 7 8 9 10 11 12
open close volume change symbol CRGOW 0.1564 0.3200 1977 1.046036 ZVZZT 13.0200 25.0000 369 0.920123 MLECW 0.0974 0.1798 3394 0.845996 HOTH 2.0300 3.5400 1600550 0.743842 BOAC+ 0.0458 0.0782 700 0.707424 RCRT 0.1918 0.2953 575273 0.539625 ATMCR 0.1489 0.2237 400 0.502351 SBFMW 0.5938 0.8915 305 0.501347 RCRTW 0.0229 0.0302 300 0.318777 TCBPW 0.0436 0.0573 300 0.314220