Support

Best bid, best offer, and midprice

Overview

In this example we will use the Historical client to retrieve the best bid and offer (BBO) and use these data to calculate the midprice. To do this we will request a subset of the entire order book data and then average the bid and ask prices to calculate the midprice.

Note that ask and offer are synonyms referring to the sell price.

TBBO schema

We'll use the TBBO schema to demonstrate this. This schema contains every trade execution event together with the best bid and offer immediately before the trade.

Example

import databento as db # Create a historical client client = db.Historical("YOUR_API_KEY") # Request TBBO data data = client.timeseries.get_range( dataset="GLBX.MDP3", start="2022-10-28T20:30:00", end="2022-10-28T21:00:00", symbols="ESH3", stype_in="raw_symbol", schema="tbbo", ) # Convert to DataFrame tbbo_data = data.to_df() # Calculate the midprice for each row tbbo_data["mid_px"] = tbbo_data[["ask_px_00", "bid_px_00"]].mean(axis=1) # We now have a DataFrame that contains execution price, BBO, and midprice print(tbbo_data[["symbol", "side", "price", "ask_px_00", "mid_px", "bid_px_00"]]) 

Result

 symbol side price ask_px_00 mid_px bid_px_00 ts_recv 2022-10-28 20:30:59.047138053+00:00 ESH3 B 3955.25 3955.25 3955.000 3954.75 2022-10-28 20:37:53.112494436+00:00 ESH3 A 3955.00 3955.75 3955.375 3955.00 2022-10-28 20:39:05.152071481+00:00 ESH3 A 3955.00 3955.75 3955.375 3955.00 2022-10-28 20:51:37.650473254+00:00 ESH3 B 3955.50 3955.50 3955.125 3954.75 2022-10-28 20:52:36.842346377+00:00 ESH3 A 3956.00 3956.25 3956.125 3956.00 2022-10-28 20:52:57.780797186+00:00 ESH3 B 3955.00 3955.00 3954.750 3954.50 2022-10-28 20:57:28.474236098+00:00 ESH3 A 3954.75 3956.25 3955.500 3954.75 2022-10-28 20:59:15.075191111+00:00 ESH3 A 3953.75 3956.00 3954.875 3953.75 2022-10-28 20:59:34.607239899+00:00 ESH3 A 3954.50 3956.00 3955.250 3954.50