🚀 AI 一键生成 joinquant 策略代码

如何让 JoinQuant 模拟交易更贴近实盘?详解盘口撮合模式

joinquant | 发布时间: 2025/12/8
以下内容由 EasyQuant 生成。

问题描述

怎么让模拟交易的成交方式更像真实炒股软件那样,根据买卖盘来成交?

解决方案

在聚宽(JoinQuant)的模拟交易中,默认的撮合方式是基于 Bar(分钟线或日线)的统计数据进行的。如果您希望模拟交易的成交逻辑更接近真实的炒股软件(即根据买一/卖一等盘口数据进行撮合),您需要在策略初始化时开启 盘口撮合模式

核心设置

您需要在 initialize 函数中调用 set_option 函数,并将 match_with_order_book 参数设置为 True

此外,为了获得最真实的模拟体验,强烈建议同时开启 动态复权(真实价格)模式

代码实现

以下是一个完整的策略初始化代码示例:

# -*- coding: utf-8 -*-
def initialize(context):
    # 开启盘口撮合模式
    # 开启后,模拟交易将根据买卖盘口(Tick数据)进行撮合,而非简单的分钟Bar撮合
    # 这意味着如果盘口流动性不足,大额订单可能无法成交或只能部分成交
    set_option('match_with_order_book', True)

    # 强烈建议:开启动态复权模式(真实价格)
    # 开启后,您看到的价格和账户资产将与真实市场一致,处理分红派息更准确
    set_option('use_real_price', True)

    # 设置基准,例如沪深300
    set_benchmark('000300.XSHG')
    
    # 设置手续费(可选,模拟真实交易成本)
    # 股票类每笔交易时的手续费是:买入时佣金万分之三,卖出时佣金万分之三加千分之一印花税, 每笔交易佣金最低扣5块钱
    set_order_cost(OrderCost(close_tax=0.001, open_commission=0.0003, close_commission=0.0003, min_commission=5), type='stock')

    # 打印日志确认设置成功
    log.info("已开启盘口撮合模式与真实价格模式")

def handle_data(context, data):
    # 您的交易逻辑
    pass

盘口撮合模式详解

开启 set_option('match_with_order_book', True) 后,模拟交易的撮合逻辑会有以下变化:

  1. 数据源:不再仅使用分钟 Bar 的开高低收价格,而是使用实时的 Tick 数据(买一至买五、卖一至卖五)进行撮合。
  2. 成交价格
    • 市价单:会根据对手盘的挂单情况,从一档开始逐级吃单,直到订单全部成交。成交价是加权均价。
    • 限价单:只有当盘口价格满足您的限价条件,且有足够的量时才会成交。
  3. 流动性限制
    • 未开启时:通常只要价格触及,且不超过设定的成交量比例(如 order_volume_ratio),系统就会判定成交。
    • 开启后:严格受限于盘口挂单量。如果您的下单量超过了盘口的挂单量,可能会出现部分成交或者无法成交的情况,这与真实实盘交易非常相似。
  4. 适用范围:此选项仅在模拟交易中生效,回测中无法使用(回测通常使用 Bar 数据或 Tick 回测模式,但机制略有不同)。

Q&A

Q1: 开启盘口撮合后,回测速度会变慢吗?
A: set_option('match_with_order_book', True) 这个选项主要针对模拟交易(实盘模拟)。在历史回测中,如果您使用的是分钟级回测,该选项通常不生效或退化为 Bar 撮合。如果您进行的是 Tick 级回测,系统本身就是基于 Tick 数据撮合的,速度会比分钟级回测慢很多,但精度更高。

Q2: 为什么开启后我的大单买入成交价变高了?
A: 这是正常的。在盘口撮合模式下,市价买入大单会“吃掉”卖一、卖二甚至卖三的挂单。成交价是这些不同价格档位的加权平均价,因此会比单纯按最新价成交要高(滑点效应)。这正是真实交易环境的体现。

Q3: 开启盘口撮合后,order_volume_ratio(成交量比例限制)还有用吗?
A: 在启用盘口撮合时,盘口撮合逻辑优先。系统会根据对手盘的实际挂单量来决定能否成交,不限制成交量(即不再强制受限于 order_volume_ratio 设定的比例),而是受限于真实的盘口深度。如果盘口没有数据,则会回退到未启用盘口撮合时的逻辑。

Q4: 模拟交易中,如果股票涨停或跌停,盘口撮合怎么处理?
A:

  • 涨停时:若您市价买入,如果卖一档没有挂单(即封死涨停),您的订单将无法成交,或者排队等待(取决于模拟盘的具体排队逻辑,通常模拟盘难以模拟真实的排队顺序,往往直接无法成交)。
  • 跌停时:若您市价卖出,如果买一档没有挂单,同样无法成交。
  • 这比默认的 Bar 撮合(只要 Bar 的最高/最低价触及涨跌停价有时可能误判成交)要严谨得多。