🚀 AI 一键生成 joinquant 策略代码

JoinQuant 策略中如何获取每一笔订单的实际手续费(commission)?

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

问题描述

成交后,我怎么在代码里查看这笔订单具体扣了多少手续费?

解决方案

在 JoinQuant(聚宽)中,查看一笔订单成交后具体扣除的手续费,可以通过访问 Order 对象commission 属性来实现。

commission 属性包含了该笔订单产生的交易费用总和(包含佣金、印花税等)。

以下是具体的实现方法和代码示例:

方法一:下单后直接获取(适用于市价单或按天回测)

如果在按天回测中下市价单,订单通常会立即成交,可以直接通过下单函数的返回值获取 Order 对象并打印手续费。

def handle_data(context, data):
    # 下单买入 100 股平安银行
    # order 函数会返回一个 Order 对象
    my_order = order('000001.XSHE', 100)
    
    # 判断订单是否创建成功
    if my_order is not None:
        # 打印该笔订单的手续费
        log.info(f"订单ID: {my_order.order_id}")
        log.info(f"交易费用: {my_order.commission}")
        log.info(f"成交均价: {my_order.price}")

方法二:收盘后批量查看(适用于所有场景)

对于限价单或分钟/Tick 级回测,订单可能不会立即全部成交。建议在 after_trading_end(收盘后)函数中,通过 get_orders() 获取当日所有订单并查看手续费。

# 每日收盘后运行
def after_trading_end(context):
    # 获取当天所有订单
    orders = get_orders()
    
    for order_id, order_obj in orders.items():
        # 仅查看有成交的订单 (filled > 0)
        if order_obj.filled > 0:
            log.info("--------------------------------")
            log.info(f"标的: {order_obj.security}")
            log.info(f"订单ID: {order_id}")
            log.info(f"操作: {order_obj.side} - {order_obj.action}") # 买/卖 - 开/平
            log.info(f"成交数量: {order_obj.filled}")
            log.info(f"手续费总额: {order_obj.commission}")

关键属性说明

  • order.commission: 浮点数。表示该订单产生的总交易费用(佣金 + 印花税 + 其他杂费)。
  • order.filled: 整数。表示该订单已成交的数量。如果 filled 为 0,则 commission 通常也为 0。

Q&A

Q: 为什么我打印的 commission 是 0?
A: 这通常有两个原因:

  1. 订单尚未成交(filled 为 0),此时不会产生手续费。
  2. 您可能没有设置费率,或者设置的费率过低(如模拟比赛中某些特定费率设置)。建议在 initialize 中使用 set_order_cost 明确设置手续费标准。

Q: commission 包含印花税吗?
A: 是的,commission 是该笔订单所有费用的总和。对于股票卖出操作,它包含了券商佣金和印花税;对于买入操作,通常只包含佣金(A股买入无印花税)。

Q: 如何设置手续费标准?
A: 在 initialize 函数中使用 set_order_cost。例如设置股票买卖万分之三,最低5元:

def initialize(context):
    set_order_cost(OrderCost(open_tax=0, close_tax=0.001, open_commission=0.0003, close_commission=0.0003, min_commission=5), type='stock')