3 分钟快速生成代码
输入想法,AI 即刻生成可运行代码
在量化交易中,尤其是执行多因子选股策略或指数套利策略时,我们经常需要同时对多只股票进行调仓。如果使用循环调用单股下单函数(如 order),不仅代码冗长,还会因为多次网络请求或引擎处理导致下单存在时间差。
聚宽(JoinQuant)提供了 batch_submit_orders 接口,支持对一系列标的进行批量委托(即“一篮子下单”),从而大幅提升下单效率。
batch_submit_orders(orders)
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 优先平昨仓 |
Order 对象的 list。如果批量委托创建失败,则返回空列表或抛出异常。batch_submit_orders 在委托时会对列表中的每一个委托进行验资验券。若其中任意一个委托校验失败(例如资金不足、持仓不足或股票停牌),则整个批量委托都会宣告失败,所有订单均不会报单。因此,在调用前请务必做好资金和持仓的预算控制。以下是一个完整的聚宽策略,展示了如何在开盘时使用 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("批量委托失败!可能由于资金不足或其中某只股票停牌导致整体校验未通过。")
Q:为什么我调用 batch_submit_orders 返回了空列表,且没有任何股票成交?
A:这通常是因为触发了“全成功或全失败”的校验保护。请检查:
context.portfolio.available_cash)是否足够支付一篮子股票的总买入金额及手续费。get_current_data() 查询 paused 属性进行过滤)。closeable_amount)。