You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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()

问题根源

原代码存在两个限制:

  1. 未向Bloomberg请求全时段数据,默认仅返回常规交易时段数据;
  2. 末尾的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.12 22:14:51