如何用Python获取纽交所盘前盘后时段的Bloomberg日内Bar数据
修改Bloomberg日内Bar代码以获取盘前/盘后数据
我从Stack Overflow找到一段Python代码用于从Bloomberg获取Bar数据,但它仅返回纽交所常规交易时段的数据。如何修改代码以同时获取盘前(AM)和盘后(PM)延长时段的数据?当前代码如下:
from datetime import datetime,time #An intraday bar function which accepts multiple days def bdibMultiDay(ticker,start_date,end_date,typ,tz,interval=1,session_open=None, session_close=None): from xbbg.core import conn,process from pandas import DataFrame import pytz #If no explicit session times given, impute from input datetimes if(session_open is None): session_open = start_date.time() if(session_close is None): session_close = end_date.time() time_fmt = '%Y-%m-%dT%H:%M:%S' local = pytz.timezone(tz) req = process.create_request(service='//blp/refdata',request='IntradayBarRequest') req.set('security',ticker) req.set('eventType',typ) req.set('interval',interval) req.set('startDateTime',start_date.astimezone(pytz.utc).strftime(time_fmt)) req.set('endDateTime',end_date.astimezone(pytz.utc).strftime(time_fmt)) conn.send_request(request=req) data = ( DataFrame(process.rec_events(func=process.process_bar)) .set_index('time') .rename_axis(index=None) .rename(columns={'numEvents': 'num_trds'}) .tz_localize('UTC') .tz_convert(tz) ) def isInSession(dt) -> bool: t = dt.time() return (t >= session_open) and (t <= session_close) return data.loc[map(isInSession,data.index)] def testbdlMultiDay(): ticker = 'QQQ US Equity' start_date = datetime(2025,4,3,7,00) end_date = datetime(2025,4,3,18,30) typ = 'TRADE' tz='America/New_York' interval=5 df = bdibMultiDay(ticker,start_date,end_date,typ,tz,interval) return df df=testbdlMultiDay()
问题根源
原代码存在两个限制:
- 未向Bloomberg请求全时段数据,默认仅返回常规交易时段数据;
- 末尾的
isInSession过滤函数会筛掉指定时段外的数据,即便Bloomberg返回了盘前盘后数据也会被过滤。
修改方案
1. 添加Bloomberg全时段请求参数
在创建IntradayBarRequest后,添加sessionFilter参数并设置为"A",该参数指示Bloomberg返回包括盘前、常规交易、盘后在内的所有时段数据。
2. 调整时段过滤逻辑
- 如果需要保留所有获取到的时段数据,直接移除
isInSession过滤逻辑; - 如果需要自定义保留的时段范围,确保
session_open和session_close覆盖盘前盘后时间(比如7:00到18:30),避免误筛数据。
修改后的完整代码
from datetime import datetime, time # 支持多日的日内Bar数据获取函数 def bdibMultiDay(ticker, start_date, end_date, typ, tz, interval=1, session_open=None, session_close=None, include_all_sessions=True): from xbbg.core import conn, process from pandas import DataFrame import pytz # 若未指定时段,使用传入的起止时间作为默认时段 if session_open is None: session_open = start_date.time() if session_close is None: session_close = end_date.time() time_fmt = '%Y-%m-%dT%H:%M:%S' local = pytz.timezone(tz) req = process.create_request(service='//blp/refdata', request='IntradayBarRequest') req.set('security', ticker) req.set('eventType', typ) req.set('interval', interval) req.set('startDateTime', start_date.astimezone(pytz.utc).strftime(time_fmt)) req.set('endDateTime', end_date.astimezone(pytz.utc).strftime(time_fmt)) # 添加全时段请求参数 if include_all_sessions: req.set('sessionFilter', 'A') conn.send_request(request=req) data = (DataFrame(process.rec_events(func=process.process_bar)) .set_index('time') .rename_axis(index=None) .rename(columns={'numEvents': 'num_trds'}) .tz_localize('UTC') .tz_convert(tz)) # 若需要自定义过滤时段则保留,否则注释/移除这段 def isInSession(dt) -> bool: t = dt.time() return (t >= session_open) and (t <= session_close) return data.loc[map(isInSession, data.index)] if not include_all_sessions else data def testbdlMultiDay(): ticker = 'QQQ US Equity' # 直接指定时区,避免转换问题 start_date = datetime(2025, 4, 3, 7, 00, tzinfo=pytz.timezone('America/New_York')) end_date = datetime(2025, 4, 3, 18, 30, tzinfo=pytz.timezone('America/New_York')) typ = 'TRADE' tz = 'America/New_York' interval = 5 # 开启全时段获取 df = bdibMultiDay(ticker, start_date, end_date, typ, tz, interval, include_all_sessions=True) return df df = testbdlMultiDay()
关键说明
sessionFilter='A':Bloomberg官方定义的参数值,代表获取所有交易时段,涵盖纽交所盘前(7:00-9:30 ET)、常规交易(9:30-16:00 ET)和盘后(16:00-18:30 ET)数据。- 时区修正:创建起止时间时直接指定时区,避免后续时区转换可能引发的错误。
- 可选过滤:新增
include_all_sessions参数,方便快速切换是否保留自定义时段过滤逻辑。
内容的提问来源于stack exchange,提问作者quinn
相关产品推荐
相关产品推荐

