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

聚宽涨停股池轮动策略:如何验证模拟盘收益并优化实盘逻辑?

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

问题描述

聚宽涨停股池轮动策略:如何验证模拟盘收益并优化实盘逻辑?
我在聚宽上运行涨停股池轮动策略时,模拟盘短期收益较高,应该从哪些方面检查策略逻辑、回测偏差和实盘可行性?

解决方案

在聚宽(JoinQuant)平台上,涨停股池轮动策略(如追涨、打板、强势股轮动)因其高波动性,在模拟盘中常能跑出极高的短期收益。然而,这类策略在实盘中极易遭遇“回测/模拟盘很丰满,实盘很骨感”的窘境。要验证其收益的真实性并优化实盘逻辑,建议从以下几个核心维度进行系统性排查:

一、 严防“未来函数”与数据偏差

涨停策略对时间极其敏感,稍有不慎就会引入未来数据:

  1. 开启避免未来数据模式:在策略初始化中,强烈建议设置 set_option("avoid_future_data", True)。开启后,若策略在盘中试图获取未收盘的未来数据(如当日收盘价),系统会直接抛出 FutureDataError,帮助你快速定位逻辑漏洞。
  2. 检查数据获取API
    • 使用 historyattribute_history 获取天数据时,默认是不包含当天的。但若在盘中(如14:50)使用 get_price 且未严格限制 end_date,可能会误拿当天收盘价。
    • 集合竞价数据:若使用 get_call_auction,需注意当日集合竞价数据最晚于 09:28 分返回,确保下单逻辑在此时间之后触发。

二、 评估撮合机制与成交量限制

模拟盘与实盘最大的偏差往往在于“能不能买进去”和“能不能卖出来”:

  1. 成交量比例限制(order_volume_ratio
    • 默认情况下,回测和模拟盘的成交量可能过于理想。对于涨停股,往往伴随着缩量板或极小的换手。你必须在 initialize 中设置 set_option('order_volume_ratio', 0.25)(甚至更低,如 0.1),限制单笔订单成交量不得超过当日全市场总成交量的 10%~25%,以模拟真实的资金吞吐量。
  2. 涨跌停撮合逻辑
    • 未启用盘口撮合时:若标的“最新价+滑点”已达涨停,市价买单会被系统撤销;限价单则会挂单等待。实盘中封板的股票极难排队买入,需检查策略是否在模拟盘中“强行挤进”了封死涨停的股票。
    • 启用盘口撮合:模拟盘可开启 set_option('match_with_order_book', True)。这会优先从买一/卖一档开始撮合,能更真实地反映盘口排队情况。

三、 必须开启“真实价格(动态复权)模式”

对于高频轮动的涨停策略,复权因子的变动对持仓股数和价格影响极大:

  • 传统前复权回测模式存在未来复权因子干扰。你必须在 initialize 中调用 set_option('use_real_price', True)
  • 开启后,策略在历史时刻将使用当时的真实价格撮合,并在发生分红送股时自动调整持仓数量,有效避免未来函数,使模拟盘表现无限逼近实盘。

四、 调高滑点与交易税费

涨停股在开盘或盘中拉升时,瞬时价格跳动剧烈,默认滑点往往无法覆盖真实摩擦成本:

  1. 设置合理的滑点
    • 默认滑点 PriceRelatedSlippage(0.00246) 对于追涨策略可能偏低。建议针对股票调高滑点,例如:set_slippage(PriceRelatedSlippage(0.005), type='stock'),甚至使用固定值滑点 FixedSlippage(0.02)(买入加2分钱,卖出减2分钱)。
  2. 严格设置佣金与印花税
    • 确保设置了符合你实盘券商的费率,特别是卖出单边千分之一的印花税和万分之三的佣金:
      set_order_cost(OrderCost(close_tax=0.001, open_commission=0.0003, close_commission=0.0003, min_commission=5), type='stock')
      

五、 优化实盘可行性逻辑

  1. 拒绝无成交量标的:模拟盘在下单时会检查开盘到下单时刻的累积成交量,若为0则拒绝交易。实盘中,对于一字涨停无成交量的标的,应在代码中主动过滤,避免无效申报。
  2. 避免开盘前过早下单:在 09:00 以前对股票下单,可能因未获取到当日涨跌停价而导致委托失败。建议将下单时间设在 09:25 集合竞价完毕后,或 09:30 正式开盘后。
  3. 利用性能分析(enable_profile:追涨策略对下单速度要求极高。在回测时最上方加入 enable_profile(),分析 handle_datarun_daily 中是否有耗时过长的代码(如频繁读取大容量历史数据),优化代码结构以减少实盘中的下单延迟。