问题描述
解决方案
在PTrade量化交易平台的回测环境中,手续费(佣金)和滑点是模拟真实交易成本的重要组成部分。系统提供了专门的API来设置这些参数,其计算逻辑如下:
PTrade回测手续费与滑点计算机制详解
1. 手续费(Commission)计算
在PTrade回测中,总手续费由佣金费和经手费两部分组成。
计算公式
$$总手续费 = 佣金费 + 经手费$$
- 佣金费:
$$佣金费 = \max(\text{交易总金额} \times \text{佣金费率}, \text{最低佣金})$$- 如果计算出的佣金低于设置的最低佣金,则按最低佣金收取。
- 经手费:
$$经手费 = \text{交易总金额} \times 0.0000487$$- 注:文档中规定经手费率为万分之0.487。
默认设置
如果不手动设置,PTrade回测的默认值为:
- 股票:佣金费率万分之三(0.0003),最低佣金5元。
- ETF/LOF基金:佣金费率万分之八(0.0008),最低佣金5元。
设置方法
使用 set_commission 函数进行设置。
2. 滑点(Slippage)计算
滑点用于模拟下单价格与实际成交价格之间的偏差。PTrade支持百分比滑点和固定滑点两种模式。
A. 百分比滑点(默认模式)
使用 set_slippage 设置。滑点值是一个比例。
- 计算公式:
$$\text{最终成交价} = \text{委托价格} \pm \frac{\text{委托价格} \times \text{滑点比例}}{2}$$- 买入时:成交价 = 委托价 + (委托价 * 滑点比例 / 2)
- 卖出时:成交价 = 委托价 - (委托价 * 滑点比例 / 2)
- 默认值:0.1(即10%)。注意:文档示例中提到默认滑点比例为0.1,这意味着成交价偏差为 $\pm 5%$,这个默认值在实际回测中可能偏大,建议根据实际需求调整(如设置为0.002)。
B. 固定滑点
使用 set_fixed_slippage 设置。滑点值是一个固定的金额(元)。
- 计算公式:
$$\text{最终成交价} = \text{委托价格} \pm \frac{\text{固定滑点值}}{2}$$- 买入时:成交价 = 委托价 + (固定滑点值 / 2)
- 卖出时:成交价 = 委托价 - (固定滑点值 / 2)
- 示例:若设置固定滑点为0.02元,则买入成交价会比委托价高0.01元,卖出成交价会比委托价低0.01元。
3. 代码实现示例
以下代码展示了如何在策略初始化阶段设置手续费和滑点:
def initialize(context):
# 设置股票池
g.security = '600570.SS'
set_universe(g.security)
# 1. 设置手续费
# 股票交易:佣金费率万分之三(0.0003),最低佣金5元
set_commission(commission_ratio=0.0003, min_commission=5.0, type='STOCK')
# 2. 设置滑点 (二选一)
# 方式A:设置百分比滑点
# 例如设置为0.2%,即0.002。
# 买入成交价 = 价格 + 价格 * 0.001
set_slippage(slippage=0.002)
# 方式B:设置固定滑点
# 例如设置为1分钱(0.01元)。
# 买入成交价 = 价格 + 0.005元
# set_fixed_slippage(fixedslippage=0.01)
def handle_data(context, data):
# 示例交易
order(g.security, 100)
Q&A 常见问题解答
Q1: 为什么滑点计算时要除以2?
A1: 在PTrade的设计中,滑点参数通常代表买一价和卖一价之间的价差(Spread)。实际成交时,假设是在盘口中间价成交,那么偏离中间价的幅度就是价差的一半。因此,最终成交价格是在基准价格的基础上加减滑点值的一半。
Q2: 经手费可以取消或修改吗?
A2: 根据API文档描述,set_commission 主要用于设置佣金费率和最低佣金。经手费是按照万分之0.487的固定费率计算的,API文档中未提供直接修改经手费率的参数,通常这部分被视为交易所收取的固定规费。
Q3: 回测中如果不设置滑点会有什么影响?
A3: 如果不设置滑点,PTrade可能会使用默认值(文档提及默认为0.1,即10%的比例,或者固定滑点默认为0.0)。如果默认为0.0,则回测成交价等于行情价,这会导致回测结果过于理想化,无法反映真实交易中因流动性不足或行情波动产生的成本。建议根据策略频率设置合理的滑点(如0.02元固定滑点或0.001比例滑点)。
Q4: set_commission 中的 type 参数支持哪些类型?
A4: 目前支持 'STOCK' (股票), 'ETF' (ETF基金), 'LOF' (LOF基金)。如果不传参,默认为 'STOCK'。不同品种可以分别设置不同的费率。