3 分钟快速生成代码
输入想法,AI 即刻生成可运行代码
在 JoinQuant 回测中,如果通过 get_price 获取所有股票当天的分钟级数据再进行聚合计算,由于数据量庞大(4000多只股票 * 几百根分钟Bar),确实会导致回测速度极慢。
为了快速获取到当前时刻当天的最高价(high)、最低价(low)和累计成交量(volume),强烈建议使用 get_bars 函数,并配合 include_now=True 参数。
get_barsget_bars 函数支持返回当前时刻所在 bar 的未完成数据(即快照数据)。当你将时间单位 unit 设置为 '1d'(日线),并将 include_now 设置为 True 时,它会直接返回包含当天从开盘到当前时刻的最高价、最低价、最新价和累计成交量等信息的日 Bar,底层由 C++ 引擎直接聚合,速度极快。
def handle_data(context, data):
# 获取全市场股票列表(假设你已经有了一个股票池,比如 context.universe 或所有A股)
# 这里以获取沪深300成分股为例,实际中可以传入4000只股票的列表
stock_list = get_index_stocks('000300.XSHG')
# 使用 get_bars 获取当天到当前时刻的日线级别快照数据
# count=1 表示只获取当前这1根日线Bar
# include_now=True 是关键,表示包含当天未结束的Bar数据
# df=True 表示返回 pandas.DataFrame 格式,方便处理
current_day_data = get_bars(stock_list, count=1, unit='1d',
fields=['high', 'low', 'volume'],
include_now=True, df=True)
# current_day_data 是一个 MultiIndex 的 DataFrame
# 我们可以重置索引,方便按股票代码提取数据
current_day_data = current_day_data.reset_index(level=0)
# 打印查看某只股票的数据
# log.info(current_day_data.loc['000001.XSHE'])
get_bars 在底层 C++ 引擎中已经维护了日内的极值和累计量,直接读取快照即可,省去了 Python 层的循环和 max()、min()、sum() 计算。get_bars 获取的数据是不包含停牌数据的,如果某只股票当天停牌,返回的结果中可能不包含该股票当天的 Bar,或者返回的是上一个交易日的 Bar(取决于具体参数和停牌情况),处理数据时请注意对齐。fq_ref_date 参数来获取前复权或后复权数据(例如 fq_ref_date=context.current_dt 获取动态复权数据)。