问题描述
解决方案
在 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: 这通常有两个原因:
- 订单尚未成交(
filled为 0),此时不会产生手续费。 - 您可能没有设置费率,或者设置的费率过低(如模拟比赛中某些特定费率设置)。建议在
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')