3 分钟快速生成代码
输入想法,AI 即刻生成可运行代码
在使用 JoinQuant(聚宽)平台时,使用 order_value() 函数下单却出现了非整数股(如 2333 股),这通常与交易标的的特殊交易规则或底层计算逻辑有关。以下是导致该现象的几个主要原因及相应的解决方案:
如果你交易的股票是科创板股票(代码以 688 开头),那么出现 2333 股是完全正常的。
当底层引擎检测到标的为科创板股票时,order_value() 会根据你的资金和限价,计算出最大可买入的精确股数(只要大于等于 200 股),而不再强制向下取整到 100 的倍数。
如果你是在卖出(即 order_value 传入负值),A 股规则允许卖出非 100 整数倍的股票。特别是当你的持仓本身因为分红送转(在真实价格模式下)产生了零股,或者你要清仓时,卖出数量可以是任意精确股数。
order_value(security, value, style) 的内部逻辑是:
实际委托数量 = value / 价格 / 保证金率 / 乘数
如果你希望无论什么板块,都严格按照 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 的整数倍。