问题描述
解决方案
在 JoinQuant(聚宽)平台中,要为股票和期货设置不同的交易手续费,需要在 initialize(context) 函数中多次调用 set_order_cost 函数,并通过 type 参数来区分标的类型。
核心方法
使用 set_order_cost(cost, type, ref=None) 函数。
- cost: 传入
OrderCost对象,设置具体的费率(印花税、佣金、最低佣金等)。 - type: 指定资产类型。
'stock': 股票'index_futures': 金融期货(如股指期货)'futures': 商品期货
- ref (可选): 如果需要针对特定合约设置,可使用此参数。
代码示例
以下代码展示了如何在初始化函数中分别为股票(包含印花税和最低佣金)和金融期货(无印花税,无最低佣金,有平今仓优惠或惩罚)设置不同的费率。
# -*- coding: utf-8 -*-
def initialize(context):
# 1. 设置股票手续费
# 股票类每笔交易时的手续费是:
# 买入时佣金万分之三
# 卖出时佣金万分之三 + 千分之一印花税
# 每笔交易佣金最低扣5块钱
set_order_cost(OrderCost(
open_tax=0, # 买入印花税
close_tax=0.001, # 卖出印花税
open_commission=0.0003, # 买入佣金
close_commission=0.0003,# 卖出佣金
close_today_commission=0, # 平今仓佣金(股票不适用,设为0)
min_commission=5 # 最低佣金
), type='stock')
# 2. 设置金融期货手续费 (以股指期货为例)
# 期货类每笔交易时的手续费是:
# 买卖万分之零点二三
# 平今仓万分之二十三 (假设平今仓较贵的情况)
# 期货无印花税,通常无最低佣金限制
set_order_cost(OrderCost(
open_tax=0,
close_tax=0,
open_commission=0.000023,
close_commission=0.000023,
close_today_commission=0.0023,
min_commission=0
), type='index_futures')
# 3. 设置商品期货手续费 (如果策略涉及商品期货)
set_order_cost(OrderCost(
open_tax=0,
close_tax=0,
open_commission=0.0001,
close_commission=0.0001,
close_today_commission=0.0001,
min_commission=0
), type='futures')
参数详解 (OrderCost)
- open_tax: 买入时印花税(股票通常为0)。
- close_tax: 卖出时印花税(股票通常为0.001,即千分之一)。
- open_commission: 开仓(买入)佣金。
- close_commission: 平昨仓(卖出)佣金。
- close_today_commission: 平今仓佣金。对于股票该项无效;对于期货,某些品种平今仓手续费可能与平昨不同(例如股指期货平今仓通常较贵,而某些商品期货平今仓可能免费)。
- min_commission: 最低佣金(股票通常为5元,期货通常为0)。
常见问题 Q&A
Q: 如果我想对某个具体的期货合约(如 IF1709)单独设置手续费怎么办?
A: 可以在调用 set_order_cost 时,将 type 设置为对应的品种类型(如 'index_futures'),并将 ref 参数设置为具体的合约代码 'IF1709'。
Q: type='futures' 和 type='index_futures' 有什么区别?
A: 'index_futures' 专门指代金融期货(如沪深300 IF、中证500 IC 等);'futures' 通常指代商品期货。如果您的策略同时交易这两类,建议分别设置。
Q: 设置了手续费后,回测结果中的收益是扣除手续费后的吗?
A: 是的,回测系统会在每笔交易成交时根据您设置的 OrderCost 自动扣除相应的费用,最终的收益曲线是净收益。