请教回测中如何设定手续费:
第一是期货不同品种的手续费不一定根据%设定的;
第二是平金的手续费会double
回测模块中是否可以加载json文件设定?
请教回测中如何设定手续费:
第一是期货不同品种的手续费不一定根据%设定的;
第二是平金的手续费会double
回测模块中是否可以加载json文件设定?
在回测模块中,手续费的设定可以通过以下方式实现:
根据知识库内容,CtaBacktester支持以下手续费设置:
但默认配置不支持按品种动态调整手续费或平今仓手续费加倍,需通过自定义逻辑实现。
准备JSON配置文件
定义不同品种的手续费规则,例如:
{
"rb2401": {"open_fee": 3, "close_fee": 3, "close_today_fee": 6},
"cu2402": {"open_fee": 5, "close_fee": 5, "close_today_fee": 10}
}
在策略中加载JSON并应用
在策略初始化时读取配置,并根据合约代码动态设置手续费:
import json
class MyStrategy(CtaTemplate):
def __init__(self, name):
super().__init__(name)
# 加载手续费配置
with open("fee_config.json", "r") as f:
self.fee_config = json.load(f)
def on_tick(self, tick):
# 获取当前合约的手续费规则
contract = tick.symbol # 假设symbol为"rb2401.SHFE"
fee_rule = self.fee_config.get(contract, {"open_fee": 0, "close_fee": 0, "close_today_fee": 0})
# 根据订单类型应用手续费(需结合持仓判断是否为平今)
if self.is_open_order: # 判断是否为开仓
self.set_fee(fee_rule["open_fee"])
elif self.is_close_today: # 判断是否为平今
self.set_fee(fee_rule["close_today_fee"])
else:
self.set_fee(fee_rule["close_fee"])
关键点
is_close_today
的逻辑(如通过持仓记录判断是否为平今)。set_fee()
方法需参考回测引擎的API实现动态调整手续费。def on_tick(self, tick):
# 假设self.position记录当前持仓
if self.position > 0 and self.is_close_today(tick): # 判断平今
fee = self.fee_config[tick.symbol]["close_today_fee"]
else:
fee = self.fee_config[tick.symbol]["close_fee"]
self.send_order(price=tick.last_price, volume=1, direction="short", fee=fee)
需求 | 实现方式 |
---|---|
不同品种手续费 | 在策略中加载JSON配置,动态设置手续费 |
平今仓手续费加倍 | 在策略逻辑中判断平今条件,动态调整手续费 |
JSON配置文件支持 | 需通过策略代码实现,回测引擎默认不支持 |
如需更深度集成,可参考vnpy
的扩展开发文档修改回测引擎源码。