同一策略,两个平台回测对不上?排查指南

✍️ 听雨量化 ·

同一策略,两个平台回测对不上?排查指南

同一策略在两个平台走出两条不同的曲线

做跨平台策略移植这几年,被问得最多的一类问题就是:「同一个策略,我在A平台跑年化28%,搬到B平台只剩12%,是不是代码写错了?」

我的回答每次都一样:先别急着改代码,大概率不是策略的事。

两个平台结果对不上,原因无非两大类:数据不一样,或者算法不一样。而排查顺序是死的:

先对齐数据,再对齐算法。数据不一致时,讨论算法没有意义。

这是全文最重要的一句话。记住它,能省掉大量无效折腾。

第零步:把原始K线拉出来对一遍

两个平台各导一份CSV,逐行对比OHLCV

在怀疑任何算法之前,先确认两个平台拿到的是不是同一份行情。

选一段确定的时间范围,同一标的、同一周期,对比五个字段:开盘价、最高价、最低价、收盘价、成交量;期货再加一个持仓量。两个平台各导出一份CSV,逐行比对。

三个细节别漏:

  • 起始和结束日期是否一致——有的平台会截掉首尾不完整的K线,一来一回就少几根
  • K线总数是否一致——数量不一样,说明中间有缺K或补K
  • 别用复权数据对——后面会说,复权本身就是差异源

如果原始数据就不一致,恭喜,问题定位在数据层,直接看下面三个元凶,代码一行都不用查。如果数据完全一致,跳到算法部分。

元凶一:复权方式不一样

不复权、前复权、后复权对同一段价格的影响

股票分红送配会让价格出现跳空,复权就是抹平这些跳空的手段。麻烦在于,各平台默认的复权方式不一样:

  • 不复权:原始价格,真实但有跳空,技术指标在除权日失真
  • 前复权:以最新价为基准往回调整,当前价格真实,适合看图
  • 后复权:以历史某日为基准向后调整,适合算长期收益

两个平台一个默认前复权、一个默认不复权,同一段行情就是两条线,策略信号自然分道扬镳。

更隐蔽的是:即使都叫”前复权”,算法也可能不同。有的平台除权日当天一次性调整;有的把影响分摊到前后若干天;多次分红送配的累积计算还有精度差异。名字对上了,数没对上。

排查建议:先用不复权数据对比,把复权这个变量彻底排除,确认平台裸数据一致后,再逐级打开复权对比。

元凶二:期货主力合约的合成规则不一样

两个平台主力合约在不同日期换月,拼接出不同曲线

期货每个品种有一堆到期合约,平台提供的”主力连续”是合成的,而各家合成规则完全不同:

  • 换月依据:按成交量最大换,还是持仓量最大换,还是两者结合?
  • 换月时机:盘中实时切,收盘后切,还是提前N天切?
  • 换月处理:保留换月跳空,还是做价差平滑、比例复权?

加权指数同理:等权还是成交量加权?新合约何时纳入?每一条都能让曲线不一样。

排查建议:别用主力连续对数据,改用具体月份合约(比如IF2412、RU2501)对比。具体合约是真实成交出来的,没有合成规则差异。具体合约一致、主力连续不一致,那就是平台合成规则的事,不是你的问题。

元凶三:分钟K线的切割规则不一样

同一时段的3分钟K线,两个平台切出的第一根起点不同

日线以上的周期没什么争议,分钟线就不一样了。同样是3分钟K线:

平台A从09:00开始切:09:00、09:03、09:06…… 平台B从09:01开始切:09:01、09:04、09:07……

起点错一根,后面每根K线的内容都不一样,指标自然全错位。

时段处理的差异更常见:

  • 夜盘归属:夜盘行情算”当天”还是”次日”?
  • 集合竞价:开盘竞价单独成一根K,还是并进第一根?
  • 午间休市:休市时段填空K线还是直接跳过?

排查建议:对比两个平台第一根K线的时间戳和K线总数。如果涉及分钟级,最省事的路是先用日线排查,把切割问题隔离掉。

数据一致了,再查算法

MA、EMA、WMA对同一序列算出三条不同的线

确认两边的OHLCV一根不差之后,才轮到算法。这一层的头号坑,是均线家族。

很多人以为”MA就是均线”,但叫法相近的均线,算法完全是三回事:

  • MA / SMA:简单移动平均,N个周期等权重,对近期价格不敏感
  • EMA:指数移动平均,越近的数据权重越大,反应快
  • WMA:加权移动平均,线性递增权重,介于两者之间
  • KAMA:考夫曼自适应均线,根据市场效率自动调平滑系数

在A平台写MA(CLOSE, 20),在B平台写EMA(CLOSE, 20),结果必然不同。更坑的是,即使都叫EMA,初始种子值的处理也可能不同——有的用前N个价格的均值起步,有的直接用第一个价格,开局阶段就是两条线。

排查建议:对比指标时,自己用代码实现一遍算法,两边跑同一个实现,别依赖平台内置函数。

其他几个高频算法陷阱,一并列出:

  • 标准差:样本标准差(除以N-1)还是总体标准差(除以N)?布林带直接受影响
  • 收益率:简单收益率还是对数收益率?累计方式完全不同
  • 年化收益:A股约242个交易日,美股约252,年化系数不一样
  • 夏普比率:无风险利率取多少?用总收益还是超额收益算?
  • 回测引擎:撮合规则(现价成交还是下根K线开盘价成交)、滑点、手续费,任何一项不同,回测结果都会漂

六步排查流程

从数据到算法的六步排查漏斗,逐层定位

按顺序来,不要跳步:

  1. 用不复权日线对比原始OHLCV——不一致,查数据源
  2. 一致后,对齐复权方式,对比复权后数据
  3. 涉及分钟级,对比K线切割规则和时段归属
  4. 确认指标算法完全一致——MA ≠ EMA ≠ SMA,别混用
  5. 检查内置函数的参数默认值和边界处理
  6. 最后查回测引擎:撮合、滑点、手续费

快速自查清单

  • 两个平台的标的代码指向同一个合约?
  • 复权方式一致?(建议先用不复权排查)
  • 期货用的是同一类合约?(具体合约 vs 主力连续)
  • K线周期和切割起点一致?
  • 指标名称和算法完全对应?(MA ≠ EMA ≠ SMA)
  • 指标参数(周期N等)相同?
  • 数据起始日期一致?
  • 手续费、滑点设置一致?

八条过一遍,绝大部分”不一致”当场就能定位。

最后说句实话:跨平台结果完全一致是例外,不一致才是常态。排查的目标不是强行让两边一样,而是搞清楚差异来自哪里——是数据口径问题,就统一口径;是算法实现问题,就对齐算法。搞清楚之后,你会同时理解两个平台的脾气,这比”两边跑出同一个数”值钱得多。

碰到实在对不上、又吃不准哪层出问题的,微信找我:traderByAI,备注「公众号」,帮你把两个平台的数据和算法逐层对一遍。


💼 AI 量化培训 · 策略生成 · 代码代写 —— 微信 traderByAI 联系。