🚀 AI 一键生成 joinquant 策略代码
立即体验

joinquant 集合竞价选股:如何利用 get_call_auction API 获取 09:25 快照数据进行早盘选股?

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

问题描述

请根据以下 SEO 主题生成完整页面内容:

Title: joinquant 集合竞价选股:利用 get_call_auction 获取 09:25 快照数据

Question: 如何在 joinquant 策略中获取早盘 09:25 的集合竞价数据并进行选股?

解决方案

joinquant 集合竞价选股:利用 get_call_auction 获取 09:25 快照数据

在 A 股市场中,早盘 09:25 的集合竞价数据反映了市场主力资金在开盘前夕的博弈结果,蕴含了高开、高量爆板等强烈的股价异动信号。利用聚宽(JoinQuant)量化平台的 get_call_auction 函数,我们可以精确获取指定股票池在 09:25 的集合竞价 Tick 快照数据,并在盘中(如 09:30 开盘瞬间)实现自动下单交易。


一、get_call_auction API 核心参数解析

get_call_auction 用于获取指定时间区间内交易日 09:25 的集合竞价 Tick 数据(支持股票、场内基金、指数及期权)。

函数语法

from jqdata import *
get_call_auction(security, start_date=None, end_date=None, fields=None)

参数说明

  • security: 标的代码或标的代码列表,例如 '000001.XSHE'['000001.XSHE', '000002.XSHE']
  • start_date: 开始日期,格式为字符串 'YYYY-MM-DD'
  • end_date: 结束日期,格式为字符串 'YYYY-MM-DD'
  • fields: 选择要获取的字段,默认为 None(获取全部字段)。常用字段包括:
    • time: 时间(如 2023-01-02 09:25:03
    • current: 集合竞价最终撮合成交价
    • volume: 集合竞价成交量(股)
    • money: 集合竞价成交额(元)
    • a1_v~a5_v / a1_p~a5_p: 五档卖量与卖价
    • b1_v~b5_v / b1_p~b5_p: 五档买量与买价

二、早盘集合竞价选股策略逻辑

常见的早盘集合竞价选股逻辑如下:

  1. 高开幅度过滤:挑选竞价开盘价(current)相对于昨日收盘价上涨 2% ~ 5% 之间的个股。
  2. 爆量过滤:竞价成交额(money)或成交量(volume)达到历史日均的一定比例(如高爆量开盘)。
  3. 挂单匹配:检查买一量(b1_v)与卖一量(a1_v),确保资金封板或抢筹意愿强烈。

三、完整 Python 策略源码示例

以下是一个在 JoinQuant 平台上运行的早盘集合竞价选股与交易示例:

import datetime
from jqdata import *

def initialize(context):
    # 开启动态复权模式(真实价格)
    set_option('use_real_price', True)
    # 设置基准
    set_benchmark('000300.XSHG')
    # 设置股票手续费
    set_order_cost(OrderCost(open_commission=0.0003, close_commission=0.0003, close_tax=0.001, min_commission=5), type='stock')
    
    # 选股目标股票池(以沪深300成分股为例)
    g.stocks = get_index_stocks('000300.XSHG')
    
    # 定时运行:每天 09:30:00 开盘即刻运行撮合交易
    run_daily(market_open, time='09:30')

def market_open(context):
    today_str = context.current_dt.strftime('%Y-%m-%d')
    
    # 1. 获取选股池股票昨日收盘价
    last_df = history(1, '1d', 'close', g.stocks)
    
    # 2. 获取今日 09:25 的集合竞价数据
    auction_df = get_call_auction(g.stocks, start_date=today_str, end_date=today_str,
                                 fields=['time', 'current', 'volume', 'money', 'b1_v', 'a1_v'])
    
    if auction_df.empty:
        log.info("未获取到集合竞价数据")
        return
    
    buy_list = []
    
    # 3. 遍历分析竞价数据
    for security in g.stocks:
        sub_df = auction_df[auction_df['code'] == security]
        if sub_df.empty:
            continue
            
        auction_price = sub_df['current'].values[0]
        auction_money = sub_df['money'].values[0]
        last_close = last_df[security][0]
        
        # 过滤无效价格
        if last_close == 0 or auction_price == 0:
            continue
            
        # 计算竞价涨跌幅
        pct_change = (auction_price - last_close) / last_close
        
        # 选股条件:竞价高开 2% 至 5% 且集合竞价成交额大于 500 万元
        if 0.02 <= pct_change <= 0.05 and auction_money > 5000000:
            buy_list.append(security)
            log.info("选中股票: %s, 竞价涨幅: %.2f%%, 竞价成交额: %.2f万" % (security, pct_change * 100, auction_money / 10000))
    
    # 4. 执行调仓(均仓买入选中的股票)
    if buy_list:
        cash_per_stock = context.portfolio.available_cash / len(buy_list)
        for stock in buy_list:
            order_value(stock, cash_per_stock)

四、注意事项与最佳实践

  1. 数据可获取时间:当日 09:25 的集合竞价快照数据,在回测及实盘模拟中,最晚于 09:28 分后即可稳定调用。
  2. 避免未来函数:请确保 start_dateend_date 参数设置为当日(或当前逻辑时间 context.current_dt),切勿获取未发生交易日的数据。
  3. 数据条数限制get_call_auction 单次调用的最大返回行数为 5000 行,如果股票池过大(如全 A 股 4000+ 只),建议按行业或板块分批次查询。