看到FCA前几天又发了个关于零售外汇点差透明度的咨询文件,突然想起自己前两年踩过的那个大坑。当时跑了一个镑美的M15均值回归EA,回测两年夏普1.8,实盘三个月回撤了22%,差点把账户心态搞崩。后来逐笔对账才发现,问题根本不在策略逻辑上,全出在回测环境跟实盘环境的摩擦成本假设不一致。今天就把我踩过的这五个点差与滑点的坑捋一遍,算是个自查清单吧。
第一点,固定点差假设 vs 浮动点差现实。很多老哥回测的时候图省事,直接在MT4策略测试器里把点差设成固定1.2点跑镑美。但真实情况是伦敦盘前点差能到2.5甚至3.0,非农前后瞬间拉到8个点我当时的EA在回测里每天能抓十几笔小利润,实盘一跑,光点差成本就吃掉了六成预期收益。后来我把回测改成用浮动点差模型,导入Dukascopy的tick级历史数据,让测试器按实际点差波动来撮合,结果那个EA的夏普直接从1.8掉到0.4。所以第一个要检查的就是:你回测用的点差数据源,跟实盘经纪商的报价是不是同一套。
第二点,滑点参数的默认值陷阱。MT4策略测试器里有个滑点设置,默认是0,意思是理想成交。但实盘挂单成交价跟请求价差个0.5到2个点是家常便饭,尤其是黄金这种波动大的品种。我习惯在回测里手动加2个点的固定滑点做压力测试,如果加上之后策略直接从盈利变亏损,那实盘基本没戏。更细一点的做法是分时段设置滑点:亚盘流动性薄的时候设3点,欧美重叠时段设1点。这个在MT5里可以用自定义佣金函数实现,MT4就只能靠脚本批量跑多组参数了。
第三点,佣金和隔夜利息别漏算。有些ECN账户点差看着低,但每手收7美金佣金,折合镑美大概0.7个点。回测的时候如果只设点差不设佣金,等于白送经纪商一笔钱。隔夜利息更隐蔽,尤其是做波段持仓过夜的策略。我有个做美日利差的EA,回测年化24%,实盘一算掉期,周三三倍利息加上负carry,直接砍到9%。所以回测参数里commission per lot和swap rate这两个字段必须填真实值,别偷懒。
第四点,订单执行延迟的建模。这个最容易被忽略。回测里信号一出立刻成交,实盘从EA发单到经纪商撮合,中间有50到200毫秒的延迟。镑美在重要数据公布那几秒,价格能跑出去十几个点。我的做法是在回测逻辑里加一个100毫秒的延迟队列,用下一根tick的开盘价作为成交价,而不是当前tick的收盘价。虽然不能完全模拟,但至少能把那些靠抢帽子吃一个点利润的策略筛掉。顺便说一句,VPS的地理位置也影响延迟,我后来把VPS从法兰克福换到伦敦LD4机房,平均执行延迟从80毫秒降到12毫秒,滑点明显改善。
第五点,历史数据质量与tick缺失。很多论坛下载的历史数据是M1合成tick,中间缺档严重。回测的时候看着曲线平滑,实盘一跑,那些缺失的tick里藏着的剧烈波动全冒出来了。我现在固定用Tickstory导出Dukascopy的原始tick,再用TickDataSuite做点差和滑点的二次校准。这套流程跑下来,回测跟实盘的偏差能控制在15%以内。如果懒得搞这么复杂,至少把MT4的“每笔tick”模式打开,别用“仅开盘价”模式自欺欺人。
说到底,EA回测盈利实盘亏损,九成不是策略信号的问题,而是摩擦成本假设太乐观。我现在的习惯是,任何EA上实盘前,先把上面五个参数按最悲观情况跑一遍,如果还能微利或者打平,才敢用最小手数试水。你们平时回测的时候,滑点一般设多少?有没有遇到过回测跟实盘偏差特别离谱的案例?评论区聊聊。
第一点,固定点差假设 vs 浮动点差现实。很多老哥回测的时候图省事,直接在MT4策略测试器里把点差设成固定1.2点跑镑美。但真实情况是伦敦盘前点差能到2.5甚至3.0,非农前后瞬间拉到8个点我当时的EA在回测里每天能抓十几笔小利润,实盘一跑,光点差成本就吃掉了六成预期收益。后来我把回测改成用浮动点差模型,导入Dukascopy的tick级历史数据,让测试器按实际点差波动来撮合,结果那个EA的夏普直接从1.8掉到0.4。所以第一个要检查的就是:你回测用的点差数据源,跟实盘经纪商的报价是不是同一套。
第二点,滑点参数的默认值陷阱。MT4策略测试器里有个滑点设置,默认是0,意思是理想成交。但实盘挂单成交价跟请求价差个0.5到2个点是家常便饭,尤其是黄金这种波动大的品种。我习惯在回测里手动加2个点的固定滑点做压力测试,如果加上之后策略直接从盈利变亏损,那实盘基本没戏。更细一点的做法是分时段设置滑点:亚盘流动性薄的时候设3点,欧美重叠时段设1点。这个在MT5里可以用自定义佣金函数实现,MT4就只能靠脚本批量跑多组参数了。
第三点,佣金和隔夜利息别漏算。有些ECN账户点差看着低,但每手收7美金佣金,折合镑美大概0.7个点。回测的时候如果只设点差不设佣金,等于白送经纪商一笔钱。隔夜利息更隐蔽,尤其是做波段持仓过夜的策略。我有个做美日利差的EA,回测年化24%,实盘一算掉期,周三三倍利息加上负carry,直接砍到9%。所以回测参数里commission per lot和swap rate这两个字段必须填真实值,别偷懒。
第四点,订单执行延迟的建模。这个最容易被忽略。回测里信号一出立刻成交,实盘从EA发单到经纪商撮合,中间有50到200毫秒的延迟。镑美在重要数据公布那几秒,价格能跑出去十几个点。我的做法是在回测逻辑里加一个100毫秒的延迟队列,用下一根tick的开盘价作为成交价,而不是当前tick的收盘价。虽然不能完全模拟,但至少能把那些靠抢帽子吃一个点利润的策略筛掉。顺便说一句,VPS的地理位置也影响延迟,我后来把VPS从法兰克福换到伦敦LD4机房,平均执行延迟从80毫秒降到12毫秒,滑点明显改善。
第五点,历史数据质量与tick缺失。很多论坛下载的历史数据是M1合成tick,中间缺档严重。回测的时候看着曲线平滑,实盘一跑,那些缺失的tick里藏着的剧烈波动全冒出来了。我现在固定用Tickstory导出Dukascopy的原始tick,再用TickDataSuite做点差和滑点的二次校准。这套流程跑下来,回测跟实盘的偏差能控制在15%以内。如果懒得搞这么复杂,至少把MT4的“每笔tick”模式打开,别用“仅开盘价”模式自欺欺人。
- 回测前先确认经纪商真实点差分布,别用固定值
- 滑点至少设2点做压力测试,分时段更佳
- 佣金和隔夜利息必须计入成本模型
- 加100毫秒执行延迟,用下一tick开盘价成交
- 历史数据用原始tick,别用M1合成
说到底,EA回测盈利实盘亏损,九成不是策略信号的问题,而是摩擦成本假设太乐观。我现在的习惯是,任何EA上实盘前,先把上面五个参数按最悲观情况跑一遍,如果还能微利或者打平,才敢用最小手数试水。你们平时回测的时候,滑点一般设多少?有没有遇到过回测跟实盘偏差特别离谱的案例?评论区聊聊。
