滑点概念:回测中最容易被低估的隐形杀手

做量化交易的朋友,尤其是刚接触vn.py回测的,往往会把精力全放在策略逻辑上。我见过太多人,策略回测曲线漂亮得不行,一上实盘就崩。为什么?滑点这个隐形杀手,十有八九是元凶。

今天我们就来聊聊滑点的定义、它怎么产生的,以及它对回测结果到底有多大影响。嗯,这部分内容,我个人觉得是回测模拟里最容易被忽视,但恰恰是最关键的一环。

滑点的定义:你看到的和实际成交的,不是一回事

滑点,说白了就是「预期成交价」和「实际成交价」之间的差值。

举个例子。你看到盘口上卖一价是10.00元,你下单买入。结果成交回来一看,成交均价是10.02元。这0.02元,就是滑点。

为什么会这样?因为市场是动态的。从你看到价格、到手指点击下单、再到订单到达交易所、最后撮合成交,这中间有延迟。这期间价格可能已经变了。

滑点公式:

滑点 = 实际成交价 - 预期成交价(买入时)

滑点 = 预期成交价 - 实际成交价(卖出时)

滑点通常用「最小变动价位」的倍数来表示,比如1跳、2跳、5跳。

在vn.py回测中,我们通常用固定滑点来模拟这个成本。比如设置滑点为1跳,那买入时就在成交价上加1跳,卖出时减1跳。这虽然是个简化模型,但比完全忽略滑点要靠谱得多。

滑点产生的原因:流动性、波动率、订单类型

滑点不是凭空产生的。我总结下来,主要有三个核心因素。

1. 流动性:市场的「深度」决定了你的冲击成本

流动性,说白了就是市场上有多少对手盘愿意跟你交易。

你想想看,一个股票每天成交额只有几百万,你一个10万的单子砸进去,盘口那薄薄几层挂单瞬间就被吃掉了。后面的单子只能去更差的价格成交。这就是流动性不足导致的滑点。

我在做商品期货回测时遇到过这种情况。某个冷门品种,平时盘口只有几十手的挂单。我的策略信号一来就是开仓50手。回测时我设了1跳滑点,结果实盘一跑,滑点经常跑到3-5跳。后来我不得不把滑点参数调高,回测结果才跟实盘对得上。

我的经验:

流动性越差的品种,滑点设置要越大。一般建议至少设为2-3跳。对于流动性极好的品种(比如股指期货、主流币种),1跳可能就够了。

2. 波动率:行情越剧烈,滑点越不可控

波动率大的时候,价格跳动的频率和幅度都很大。你下单的那一瞬间,价格可能已经跳了好几个tick。

我记得有一次做股指期货的回测,那天是重大数据公布日。策略在数据公布前5秒发出了信号。回测时我设了1跳滑点,结果实盘时滑点直接飙到了5跳以上。因为那一刻市场流动性瞬间枯竭,价格剧烈跳动,我的订单根本没法在预期价格附近成交。

所以,波动率大的时段(比如开盘、收盘、数据公布前后),滑点会显著放大。如果你的策略经常在这些时段交易,滑点设置一定要留足余量。

3. 订单类型:市价单 vs 限价单

这个比较好理解。市价单追求的是「成交」,不追求「价格」。所以滑点天然就大。限价单追求的是「价格」,但可能成交不了。

在回测中,我们通常用市价单来模拟,因为限价单的成交模拟非常复杂,涉及到排队、撤单、部分成交等细节。vn.py默认也是用市价单逻辑来做回测的。

但这里有个坑。如果你在回测里用市价单,滑点设得很小,那回测结果会非常乐观。实际上,市价单的滑点往往比你想的要大。我个人建议,回测时至少用2-3跳的滑点来模拟市价单的成本。

注意:

不要因为回测曲线好看就调小滑点。这是自欺欺人。我见过有人把滑点设为0,回测年化50%,实盘直接亏到怀疑人生。滑点设置一定要保守,宁可多估,不要少估。

滑点对回测结果的影响:一个真实的案例

我们来看一个具体的例子。假设你有一个简单的均线策略,在螺纹钢期货上做回测。

回测参数:

  • 品种:螺纹钢主力连续
  • 周期:2023年1月-2023年12月
  • 策略:5日均线上穿20日均线做多,下穿做空
  • 手续费:按交易所标准(万分之1)

我们分别用不同的滑点设置来跑回测,看看结果差异有多大。

滑点设置 年化收益率 最大回撤 夏普比率 交易次数
0跳(无滑点) 32.5% -8.2% 1.85 86
1跳 24.1% -11.3% 1.42 86
2跳 16.8% -15.7% 0.98 86
3跳 9.2% -21.4% 0.51 86
5跳 -3.7% -28.6% -0.22 86

看到没?仅仅是把滑点从0调到5跳,年化收益率就从32.5%变成了-3.7%。一个看起来赚钱的策略,因为滑点直接变成了亏钱。

这就是为什么我说滑点是回测里最容易被低估的隐形杀手。你想想看,如果回测时你设了0跳滑点,然后拿着这个结果去实盘,结果会怎样?

知识体系结构图

下面这张图,是我梳理的滑点知识体系。你可以把它当作一个快速索引。

滑点概念知识体系 滑点定义 预期价 vs 实际成交价 通常以tick/跳为单位 产生原因 流动性不足 波动率剧烈 订单类型影响 市价单滑点大 限价单可能不成交 对回测结果的影响 收益率、回撤、夏普比率全面恶化 回测建议 保守设置滑点(2-3跳起步)|流动性差/波动大时加大滑点 滑点设置直接影响回测结果的真实性 宁可多估,不要少估

总结一下

滑点这个东西,说白了就是交易成本的一部分。它不像手续费那样固定,而是随市场状态动态变化的。流动性越差、波动率越大、订单越急,滑点就越大。

在vn.py回测中,我建议你至少设2跳的滑点作为起步。如果你的策略交易频率高、或者品种流动性差,3-5跳也不过分。记住,回测的目的是模拟真实交易环境,而不是为了让自己开心。

我曾经因为滑点设置不当,在实盘上吃了大亏。从那以后,我每次回测都会做滑点敏感性分析——分别用1跳、2跳、3跳、5跳跑一遍,看看策略在不同滑点下的表现。如果3跳滑点下策略还能赚钱,那实盘才敢放心上。

一个小技巧:

在vn.py中,你可以通过设置不同的滑点参数,快速做敏感性分析。比如:

# 回测时设置滑点
engine.set_slippage(1)  # 1跳
engine.set_slippage(2)  # 2跳
engine.set_slippage(3)  # 3跳

跑完对比一下结果,你就能知道自己的策略对滑点有多敏感了。

好了,滑点的概念就聊到这里。记住一句话:回测时对滑点多一份敬畏,实盘时就能少一份意外。

专注资料整理