🚀 AI 一键生成 joinquant 策略代码

JoinQuant回测中快速获取当天所有股票最高价、最低价和成交量的方法

joinquant | 发布时间: 2026/5/25
以下内容由 EasyQuant 生成。

问题描述

回测中如何快速获取到当天所有股票的最高,最低,成交量的数据

采用get_price,使用分钟级的数据,需要把开盘到当前时间分钟级的数据都获取到,然后再计算。

当有4000多只股票的时候,这一步的回测时间就比较慢,大概要1分钟。每天都要一分钟的话,回测就相当慢了。

请问有什么快速的方法,可以获取到当前所有股票的到当前时间的最高价,最低价,成交量数据?

解决方案

在 JoinQuant 回测中,如果通过 get_price 获取所有股票当天的分钟级数据再进行聚合计算,由于数据量庞大(4000多只股票 * 几百根分钟Bar),确实会导致回测速度极慢。

为了快速获取到当前时刻当天的最高价(high)最低价(low)累计成交量(volume),强烈建议使用 get_bars 函数,并配合 include_now=True 参数。

核心解决方案:使用 get_bars

get_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'])

为什么这种方法快?

  1. 避免了海量数据传输:不需要把每只股票的每一分钟数据都拉取到 Python 层,只拉取了一行当天的汇总数据。
  2. 底层引擎加速get_bars 在底层 C++ 引擎中已经维护了日内的极值和累计量,直接读取快照即可,省去了 Python 层的循环和 max()min()sum() 计算。

注意事项

  • get_bars 获取的数据是不包含停牌数据的,如果某只股票当天停牌,返回的结果中可能不包含该股票当天的 Bar,或者返回的是上一个交易日的 Bar(取决于具体参数和停牌情况),处理数据时请注意对齐。
  • 如果你需要复权数据,可以通过设置 fq_ref_date 参数来获取前复权或后复权数据(例如 fq_ref_date=context.current_dt 获取动态复权数据)。