🚀 AI 一键生成 joinquant 策略代码

为什么在 JoinQuant 使用 order_value 下单会买入非整数股(如2333股)?

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

问题描述

关于一创下单

这个问题我还是没有想明白。上周一创发了通知,说市价单有问题,要加上保护性限价。好,这个我先不管。 我按照系统消息,就把老策略里的市价单换成了限价单。理论上应该不会出错了吧?限价单我设置的滑点千2。 但是,问题来了呀,我用的order_value()下单函数,理论上根据我下单价值自动调节为整数股,对吧? 但是竟然出现了非整数股,比如2333股?wtf?这是怎么会出现的?

解决方案

在使用 JoinQuant(聚宽)平台时,使用 order_value() 函数下单却出现了非整数股(如 2333 股),这通常与交易标的的特殊交易规则底层计算逻辑有关。以下是导致该现象的几个主要原因及相应的解决方案:

1. 交易标的为科创板股票(最可能的原因)

如果你交易的股票是科创板股票(代码以 688 开头),那么出现 2333 股是完全正常的。

  • 主板/创业板规则:买入必须是 100 股的整数倍(即 1 手)。
  • 科创板规则:单笔申报数量应当不小于 200 股,超过 200 股的部分,可以以 1 股为单位递增。例如,买入 201 股、2333 股都是合法的。

当底层引擎检测到标的为科创板股票时,order_value() 会根据你的资金和限价,计算出最大可买入的精确股数(只要大于等于 200 股),而不再强制向下取整到 100 的倍数。

2. 卖出时的零股规则

如果你是在卖出(即 order_value 传入负值),A 股规则允许卖出非 100 整数倍的股票。特别是当你的持仓本身因为分红送转(在真实价格模式下)产生了零股,或者你要清仓时,卖出数量可以是任意精确股数。

3. order_value() 的内部计算逻辑

order_value(security, value, style) 的内部逻辑是:
实际委托数量 = value / 价格 / 保证金率 / 乘数

  • 对于主板股票,引擎会自动将计算结果向下取整到 100 的倍数。
  • 对于科创板,引擎只会向下取整到 1 股(前提是总数 >= 200)。

解决方案:如何强制只买入 100 的整数倍?

如果你希望无论什么板块,都严格按照 100 股的整数倍进行交易,建议放弃直接使用 order_value(),改为自己计算股数后使用 order() 函数下单

你可以封装一个自定义的下单函数:

def my_order_value(security, value, limit_price):
    # 1. 计算理论上可以买入的股数
    amount = value / limit_price
    
    # 2. 强制向下取整到 100 的倍数
    # 例如:2333 -> 2300
    amount = int(amount / 100) * 100
    
    # 3. 如果计算后股数大于 0,则使用 order() 按股数下单
    if amount > 0:
        return order(security, amount, LimitOrderStyle(limit_price))
    else:
        log.info(f"资金不足以买入100股 {security}")
        return None

在策略中调用:

# 假设你要买入价值 50000 元的股票,限价为 21.4 元
my_order_value('688001.XSHG', 50000, 21.4)

总结

出现 2333 股大概率是因为你交易了科创板股票,引擎按照科创板“200股起,1股递增”的规则为你计算了最大可买股数。通过自己计算股数并使用 order() 替代 order_value(),可以完美规避这个问题,确保所有订单都是 100 的整数倍。