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

JoinQuant 平台如何使用 batch_submit_orders 进行一篮子股票批量下单?

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

问题描述

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

Title: joinquant 一篮子股票交易:batch_submit_orders 高效下单指南

Question: 如何使用聚宽的 batch_submit_orders 接口进行多只股票的批量委托?

解决方案

JoinQuant 一篮子股票交易:batch_submit_orders 高效下单指南

在量化交易中,尤其是执行多因子选股策略或指数套利策略时,我们经常需要同时对多只股票进行调仓。如果使用循环调用单股下单函数(如 order),不仅代码冗长,还会因为多次网络请求或引擎处理导致下单存在时间差。

聚宽(JoinQuant)提供了 batch_submit_orders 接口,支持对一系列标的进行批量委托(即“一篮子下单”),从而大幅提升下单效率。


一、接口定义与参数详解

1. 接口原型

batch_submit_orders(orders)

2. 参数说明

  • orders:一个 list,列表中的每个元素是一个包含订单信息的 dict。每个字典可以包含以下字段:
字段名 类型 是否必填 说明
security str 标的代码,例如 '000001.XSHE'
amount int 交易数量。正数表示买入,负数表示卖出
style OrderStyle 下单类型,支持市价单 MarketOrderStyle() 或限价单 LimitOrderStyle(price)。默认为 None(代表市价单)
side str 操作多单还是空单。默认为 'long'(多单)。股票、基金暂不支持开空单
pindex int 子账户索引。在使用 set_subportfolios 创建了多个仓位时指定,从 0 开始,默认为 0
close_today bool 平今字段。对上海国际能源中心、上期所、中金所标的,True 表示只平今仓,False 优先平昨仓

3. 返回值

  • 返回一个包含 Order 对象的 list。如果批量委托创建失败,则返回空列表或抛出异常。

二、核心注意事项(极重要)

  1. “一损俱损”的校验机制
    batch_submit_orders 在委托时会对列表中的每一个委托进行验资验券。若其中任意一个委托校验失败(例如资金不足、持仓不足或股票停牌),则整个批量委托都会宣告失败,所有订单均不会报单。因此,在调用前请务必做好资金和持仓的预算控制。
  2. 交易规则限制
    批量下单同样需要遵守 A 股交易规则(如每次交易数量只能是 100 的整数倍,卖光除外;科创板 200 股起等)。
  3. 适用场景
    适用于每日开盘调仓、多因子组合构建、一篮子股票一键止损等需要高度同步交易的场景。

三、经典代码示例

以下是一个完整的聚宽策略,展示了如何在开盘时使用 batch_submit_orders 批量买入一篮子股票:

# 导入聚宽函数库
import jqdata

def initialize(context):
    # 设定沪深300作为基准
    set_benchmark('000300.XSHG')
    # 开启动态复权模式(真实价格)
    set_option('use_real_price', True)
    
    # 设定手续费
    set_order_cost(OrderCost(close_tax=0.001, open_commission=0.0003, close_commission=0.0003, min_commission=5), type='stock')
    
    # 每天 09:30 运行
    run_daily(market_open, time='09:30')

def market_open(context):
    # 定义我们想要批量买入的一篮子股票
    stock_basket = ['000001.XSHE', '600660.XSHG', '000002.XSHE']
    
    # 构建批量订单列表
    orders_list = []
    for stock in stock_basket:
        # 封装每个股票的下单字典,此处以买入 100 股为例
        order_info = {
            'security': stock,
            'amount': 100,
            'pindex': 0,
            'style': MarketOrderStyle() # 使用市价单
        }
        orders_list.append(order_info)
    
    log.info("开始批量提交一篮子订单...")
    
    # 调用批量下单接口
    submitted_orders = batch_submit_orders(orders_list)
    
    # 打印下单结果
    if submitted_orders:
        for ord in submitted_orders:
            log.info("股票 %s 委托成功,订单ID: %s, 委托数量: %d" % (ord.security, ord.order_id, ord.amount))
    else:
        log.error("批量委托失败!可能由于资金不足或其中某只股票停牌导致整体校验未通过。")

四、常见问题解答 (FAQ)

Q:为什么我调用 batch_submit_orders 返回了空列表,且没有任何股票成交?
A:这通常是因为触发了“全成功或全失败”的校验保护。请检查:

  1. 账户可用资金(context.portfolio.available_cash)是否足够支付一篮子股票的总买入金额及手续费。
  2. 列表中是否有股票处于停牌状态(可以使用 get_current_data() 查询 paused 属性进行过滤)。
  3. 卖出操作时,卖出数量是否超过了可卖持仓(closeable_amount)。