只挑 tick 模型,却不理会 tick 来源
模型只是下拉框里的一行,来源却是另一个完全不同市场的记录。在上面那次 GBP/JPY 运行中,换掉来源让盈利因子少了 0.22,并把回撤翻了一倍,而在同一个来源上做真实 tick 升级只让它少了 0.02。一个点明了模型却不点明供应商的商品页,告诉你的是较小的那一半。
Tick 数据(逐笔数据)是一个品种上每一次单独价格变动的完整记录——每一笔都带有时间戳,并携带它自己的买价与卖价;MT5 在「基于真实 tick 的每个 tick」模型中回放的正是这份记录,而不是在 K 线之间编造一条路径。
亦称:tick 历史, 真实 tick 数据
更新于 · 审阅于
K 线数据每根蜡烛只保留四个价格:开盘价、最高价、最低价、收盘价。Tick 数据保留它们之间的一切——每一次价格变动,按顺序排列,并带着那一刻实际存在的点差。两者的差别只有在一笔交易于 K 线内部开仓又平仓时才决定什么,而那里恰恰是大多数 EA 营销所居住的地方。
回测只能用你递给它的价格去交易。K 线数据递给测试器每根蜡烛四个价格,并让它自行编造之间的路线,于是任何在 K 线内部进出的策略,回答的都是一条没有人记录过的路径。Tick 数据把这份编造换成了记录。而我们自己跑出来的运行还添上了一个令人不安的第二条发现:你从哪里取 tick,对结果的推动远大于把编造的 tick 换成记录下来的 tick。
一个 EA,一个区间,三次运行。TidewellSlack 从 2019-01-01 起在 M15 上交易 GBP/JPY,我们把它跑了三种方式,为的是拆开商品页习惯性揉在一起的两件事:tick 从哪里来,以及测试器是回放它们还是编造它们。
三次运行里有两次没能通过我们自己的关卡,而幸存的那一次跑在生成 tick 上。这正是为什么商品页公布的是自己的品种名与模型编号,而不是「真实」这个形容词。
计算 来源替换:盈利因子 −0.22,回撤 +8.26 个百分点。在此之上的真实 tick 升级:−0.02 与 +0.02。
结果 数据来源把结果推动的距离,是 tick 模型的十一倍
读 tick 数据时,先对照持仓时长,再对照数据来源。相对于 K 线,你的目标越细,结果中由路径决定的部分就越多——但这个结果能不能走到别处去,由来源决定。
| 区间 | 含义 |
|---|---|
| 日内或剥头皮 EA,真实 tick,点名了供应商 | 站得住脚的情形。路径是记录下来的,一个陌生人仅凭商品页就能复现这次运行。 |
| 持仓数天的波段系统,跑在由 K 线生成的 tick 上 | 通常够用。一根 K 线内部的走法,很少决定一笔持有一周的交易。 |
| 真实 tick,但只有单一来源 | 半个答案。我们的 GBP/JPY 运行在规则与区间完全相同的情况下,在一个来源上通过,在另一个来源上失败。 |
| 既没有供应商也没有模型编号的「真实 tick」 | 无法核实,而缺掉的这两项恰恰就是决定那个数字的两项。 |
本站公开的 23 次运行中,十一次使用 Model 4,十二次使用 Model 0,而每一次 Model 4 运行的品种名都带着 _DUKA 后缀,因为导入的 tick 只能活在自定义品种上。那十一次里有十次的清单文件,价格来源字段中至今仍写着经纪商的 M1 历史,这是它们迁移出来的那条血脉留下的残余。读模型编号和品种名;围绕它们的散文老得更快。
模型只是下拉框里的一行,来源却是另一个完全不同市场的记录。在上面那次 GBP/JPY 运行中,换掉来源让盈利因子少了 0.22,并把回撤翻了一倍,而在同一个来源上做真实 tick 升级只让它少了 0.02。一个点明了模型却不点明供应商的商品页,告诉你的是较小的那一半。
这个百分比衡量的是历史对区间的覆盖有多完整,而不是哪个模型产出了它。KestrelHover 背后那次 Model 0 的影子运行打印出 100%——与它那次真实 tick 的姊妹运行是同一个数字。一个两个模型都能达到的数字,无法把它们区分开。
在 Model 4 上,测试器按 tick 文件自身的卖价减买价成交,完全无视这个字段;把同一个 USD/JPY 测试先以 Spread=10、再以 Spread=100 跑一遍,返回的逐 tick 点差完全相同。这项设置在运行中什么也没改变,却悄悄改变了作者相信这次运行测量了什么。
在一个 tick 从 2019 年才开始的来源上从 2015 年测起,会把早期年份插值出来、把后期年份回放出来,再把两者当作一个结果报告。Ticks 选项卡会说明它持有的范围;测试器却从不警告你,你的区间越过了它。
它们填平的是价格那一半,成交那一半原封不动。延迟、重新报价、部分成交以及经纪商的政策都留在模拟之外,所以一次真实 tick 运行仍然是对成交会是什么样的一份乐观陈述——只不过是一份建立在真正发生过的路径之上的乐观陈述。
| TidewellSlack — GBP/JPY,M15,自 2019-01-01 起 | 交易数 | 盈利因子 | 最大回撤 | 历史质量 | 我们的关卡 |
|---|---|---|---|---|---|
| 经纪商 M1 历史,Model 0(已公开) | 303 | 1.35 | 9.92% | 99% | PASS |
| 导入的 tick,Model 0 | 351 | 1.13 | 18.18% | 99% | FAIL |
| 导入的 tick,Model 4 真实 tick | 345 | 1.11 | 18.20% | 100% | FAIL |
第一行到第二行只改了数据,别的什么都没动:规则相同、区间相同、测试器模型相同。 盈利因子掉了 0.22,回撤大致翻倍。第二行到第三行只改了模型,把同一份存档里生成的 tick 升级为记录下来的 tick,于是盈利因子掉了 0.02,回撤移动了 0.02 个百分点。两行 用导入 tick 的运行都没能通过我们的关卡;幸存下来的,是跑在生成 tick 上的那一次。
这个先后顺序并不普遍,而这正是诚实的那一部分。KestrelHover 走的是另一个方向:真实 tick 上 291 笔交易、盈利因子 1.33,对比经纪商生成 tick 上 292 笔交易、1.30,而且两次运行都通过了。有时来源就是故事的全部,有时它只是噪声 ——而你只有跑两遍才会知道。把 TidewellSlack 的商品页 放在那一份旁边读,这个要点会自己讲出来。
本站公开的 23 次运行中,十一次使用 Model 4,十二次使用 Model 0。每一次 Model 4
运行交易的品种,名字都以 _DUKA 结尾,因为导入的 tick 无法活在经纪商自己的品种
上——你要在 Symbols 窗口里创建一个自定义品种,再把存档导入进去。本目录中从来没有
一个经纪商原生的品种抵达过真实 tick 模型,这就是那么多公开回测不使用它的现实原因:
这个模式是免费的,它背后的库存不是。
这也打破了信赖一个百分比的惯常捷径。KestrelHover 背后那次 Model 0 的影子运行打印出 100% 的历史质量,与它那次真实 tick 的姊妹运行是同一个数字,所以这个数字分不出两者。 建模质量回答的是另一个问题——历史对区间的覆盖 有多完整——而且它对两个模型都作答。
tick 数据的第二份礼物是记录下来的买价与卖价,而它也是最常被扔掉的那一份。在 Model 4 上,测试器按每个 tick 自身的卖价减买价成交,并忽略你配置的点差:把同一个 USD/JPY 测试先以 Spread=10、再以 Spread=100 跑一遍,得到的逐 tick 点差完全相同,里面是 227 个从 10 到 350 点不等的不同值。这个字段看上去像一个开关,行为却像一条注释。
几乎也没有人去测量由此产生的成本。本站这 23 次运行中,恰好只有一次写明了实测的点差 均值——19.14 点,在测试器内部记录——而那次运行用的是 Model 0,不是真实 tick。所以对 大多数真实 tick 主张(包括我们自己的好几次)诚实的读法是:路径被记录下来了,而走这条 路径的成本从未被合计过。