问题描述
解决方案
在PTrade量化交易平台的回测环境中,设置滑点(Slippage)是为了模拟真实交易中因市场波动、网络延迟或深度不足导致的成交价与下单价之间的偏差。
以下是固定值滑点和按比例滑点的区别、适用场景以及代码示例。
1. 区别对比
| 特性 | 固定值滑点 (set_fixed_slippage) |
按比例滑点 (set_slippage) |
|---|---|---|
| 定义 | 在成交价基础上增加或减少一个固定的金额(如0.01元)。 | 在成交价基础上增加或减少一个固定的百分比(如0.1%)。 |
| 计算公式 | 成交价 = 原价 ± (固定值 / 2) | 成交价 = 原价 ± (原价 × 比例 / 2) |
| 对低价股影响 | 极大。例如股价2元,滑点设为0.1元,成本增加5%。 | 恒定。股价2元,滑点0.1%,成本仅增加0.002元。 |
| 对高价股影响 | 极小。例如股价1000元,滑点0.1元,几乎无感。 | 恒定。股价1000元,滑点0.1%,成本增加1元。 |
| 适用性 | 适合价格波动不大,或模拟固定档位(如买一卖一价差)的策略。 | 适合跨度时间长、涉及多只不同价位股票的通用策略。 |
2. 我应该用哪个?
推荐使用:按比例滑点 (set_slippage)
理由如下:
- 适应性强:A股市场股票价格差异巨大(从2元到2000元不等)。使用固定值会导致低价股的回测绩效被严重低估,而高价股的滑点成本被忽略。按比例滑点能公平地衡量所有标的。
- 符合长期回测:如果你的回测跨度好几年,股票价格可能会发生翻倍或腰斩,固定滑点无法适应这种价格变化,而比例滑点始终保持相对合理的冲击成本。
- 行业标准:大多数机构和量化回测通常采用成交额的万分之二到千分之二(0.02% - 0.2%)作为滑点标准。
何时使用固定值?
- 当你专门研究Tick级别的高频策略,且明确知道你的交易总是损失固定的“一跳”(例如永远对手价下单,损失一个最小变动单位0.01元)时,使用固定值更为精确。
3. PTrade代码实现
这两个函数都必须在 initialize(context) 函数中调用。
方式一:设置按比例滑点(推荐)
通常设置为 0.002 (即0.2%) 或 0.001 (0.1%),具体视资金量大小而定。
def initialize(context):
# 设置回测标的
g.security = '600570.SS'
set_universe(g.security)
# 【推荐】设置按比例滑点
# 设为 0.002,代表双边滑点合计为 0.2%
# 实际买入价格 = 价格 * (1 + 0.001)
# 实际卖出价格 = 价格 * (1 - 0.001)
set_slippage(slippage=0.002)
def handle_data(context, data):
# 示例交易
order(g.security, 100)
方式二:设置固定值滑点
通常设置为 0.01 或 0.02(即1-2分钱)。
def initialize(context):
# 设置回测标的
g.security = '600570.SS'
set_universe(g.security)
# 【特定场景】设置固定值滑点
# 设为 0.02,代表每股成本增加 0.02元
# 实际买入价格 = 价格 + 0.01
# 实际卖出价格 = 价格 - 0.01
set_fixed_slippage(fixedslippage=0.02)
def handle_data(context, data):
# 示例交易
order(g.security, 100)
4. 总结
- 通用策略、多股轮动、长周期回测:请使用
set_slippage(按比例)。 - 超短线、Tick级微观结构研究:可考虑使用
set_fixed_slippage(固定值)。
Q&A 常见问题
Q: 滑点设置多少比较合理?
A: 对于普通A股策略,资金量不大的情况下,通常设置为 0.001 (0.1%) 或 0.002 (0.2%) 比较符合真实情况。如果资金量非常大(如上亿),需要设置更高的滑点或结合冲击成本模型。
Q: 回测里的滑点包含手续费吗?
A: 不包含。滑点是价格偏差,手续费是交易成本。在PTrade中,手续费需要单独使用 set_commission 进行设置。
Q: 为什么我的回测收益比模拟盘高很多?
A: 可能是因为回测未设置滑点(默认为0或很小),或者滑点设置过低。真实交易中,市价单往往成交在较差的价格,建议在回测中适当调大滑点以提高策略的鲁棒性。