用于回测的外汇 Tick 数据:数据来源、质量检查与常见陷阱 1 11 月, 2026 – Posted in: 外汇交易, 套利软件
BJF TRADING GROUP · 外汇回测
用于回测的外汇 Tick 数据:数据来源、质量检查与常见陷阱
回测的可信程度取决于输入的价格数据。对于剥头皮、套利以及任何在几个点以内运作的策略,一分钟K线是不够的:您需要真实的买价(bid)和卖价(ask)报价序列。本指南将说明外汇 tick 数据从何而来、为什么同一货币对的两份数据集永远不会完全一致、在信任回测结果之前应进行哪些质量检查,以及如何把原始 tick 转化为接近实盘交易的测试。
本指南内容
什么是外汇 tick 数据
简短回答:外汇 tick 数据是一个货币对每一次报价变化的记录:时间戳(通常精确到毫秒)、买价、卖价,有时还包括每一侧的报价量。K线数据只保留每个周期的开盘价、最高价、最低价和收盘价,而 tick 数据保留了每一次价格更新的顺序、时间和点差——这正是短线策略实际交易所依据的内容。
一行典型数据如下:
依次为时间、买价、卖价,以及买价和卖价一侧的可用量(如果数据源提供,单位为百万)。这一 tick 的点差为 0.7 点。一秒之后可能还有五行数据,也可能一行都没有。
在其他一切之前,有一点必须理解:现货外汇市场没有中央成交记录。股票和期货有交易所发布官方的成交序列。外汇则在众多银行、ECN 和经纪商之间进行场外交易,每一方都推送自己的报价。因此,每一份外汇 tick 数据集都只是某一个交易场所或某一个聚合商眼中的市场。两个数据源在同一时刻可能相差零点几个点、相差数十毫秒,而且对各自的交易场所来说都可能是正确的。
本指南的大部分内容都源于这一事实。”这份 tick 数据准确吗?”是一个错误的问题。有用的问题是:对哪个执行场所而言准确、如何记录、如何清洗?
报价 tick 与成交 tick
大多数外汇数据集是报价 tick:最优买价或最优卖价的变化。它们不是成交。一个报价可能变化十次而没有一笔成交,而一笔大额成交也可能完全不改变最优报价。一些基于期货或交易所交易的外汇数据包含成交 tick(最新价和成交量),但对于现货外汇回测,您需要的是买价和卖价报价,因为您的订单正是按照它们成交的:买入按卖价成交,卖出按买价成交。
Tick 数据与K线数据:插值掩盖了什么
许多声称测试”每一个 tick”的回测工具实际上根本没有使用记录下来的 tick。它们取一分钟K线,在每根K线内部生成合成的 tick,通常是一条从开盘价到最高价和最低价、再到收盘价的平滑路径。结果看起来像 tick 数据,但其中没有任何K线本身不具备的信息。

这为什么重要?以一根 EUR/USD 一分钟K线为例:开盘 1.08500,最高 1.08540,最低 1.08480,收盘 1.08520。一笔多头持仓的止盈设在 1.08530,止损设在 1.08485。两个价位都在这根K线范围内。这笔交易是盈利还是亏损?
- 如果最低价先出现,止损在 1.08485 被触发,交易亏损 1.5 点。
- 如果最高价先出现,止盈在 1.08530 被触发,交易盈利 3 点。
K线无法告诉您答案。生成器会选择一种顺序(通常按固定规则,例如”阳线先到最低价”),回测给出一个看似确定、实则部分靠抛硬币的结果。对于目标为 100 点的波段策略,这很少有影响。但对于止盈止损距离入场仅几个点的策略,它决定了很大一部分交易的结果。
插值还会抹去记录 tick 所保留的三类信息:
| 策略需要的信息 | 记录的 tick | 根据K线生成的 tick |
|---|---|---|
| 一分钟内最高价和最低价的先后顺序 | 精确 | 按规则猜测 |
| 价格跳动(单次报价变动 1.5 点) | 保留 | 被平滑为小步变化 |
| 每个报价的点差 | 保留(买价和卖价) | 通常为一个固定点差或每根K线一个值 |
| 报价之间的时间间隔(平静与繁忙的秒) | 保留 | 均匀分布或臆造 |
| 新闻和隔夜展期前后的报价活动 | 保留 | 丢失 |
对于延迟套利而言,跳动是关键:信号就是跳动本身。一条用十五个小步从 1.08500 走到 1.08515 的合成路径根本不会产生信号,因此一个在实盘中会交易的策略在测试中看起来毫无动静,或者一个逢回调买入的策略看起来比实际更好。
外汇 tick 数据从何而来
现实中有五类数据来源。它们在成本、深度上各不相同,最重要的是,它们与您实际交易价格的接近程度不同。
| 来源 | 您得到的数据 | 优势 | 局限 |
|---|---|---|---|
| 自行记录(通过经纪商的 API 或 FIX 会话) | 您的账户收到的每一个报价,带有本地接收时间 | 与您的执行场所完全一致;时间戳和格式由您控制 | 只能从开始记录时算起;需要稳定的机器;连接中断时会出现缺口 |
| 经纪商历史数据下载 | 来自经纪商自身行情源的历史买价/卖价 | 接近您的执行场所;通常有多年历史 | 质量参差不齐;部分经纪商会稀疏化或过滤旧 tick;时间戳可能为服务器时间 |
| 免费公开存档(由部分 ECN 经纪商和聚合商提供,例如 Dukascopy、TrueFX、HistData.com) | 主要货币对的买价/卖价 tick,通常可追溯到 2000 年代 | 免费、历史长,适合研究和稳健性测试 | 只是某一场所或聚合商的视角,而非您的;点差和报价频率与您的经纪商不同;需核实每个来源的时区约定 |
| 商业数据供应商 | 经过清洗、标准化的多场所 tick 历史 | 方法有文档说明、格式一致、提供支持 | 价格昂贵;仍然不是您经纪商的行情源 |
| 参考/快速行情源(例如来自伦敦、东京和纽约节点的 BJF Feed tick 历史) | 快速、独立的参考价格流 | 测试比较慢速行情源与快速行情源的策略时必不可少 | 用于套利测试时必须与经纪商自身的 tick 配合使用 |
实用规则:研究时使用您能获得的最长的干净历史数据,最终决策时使用最接近您执行场所的数据。一个只在某个免费存档上有效、在您经纪商记录的 tick 上失效的策略,就是无效的。一个在两者上都站得住、并且计入了真实成本的策略,才算通过了有意义的测试。
如果您计划让一个策略运行数月,请从今天就开始记录您自己经纪商的 tick,即使策略还没有完成。对于最终检验,三个月您自己的行情数据比十年别人的数据更有价值。
经纪商行情源与参考行情源
由于每个场所都推送自己的报价,同一时刻从不同地方看会略有不同。这些差异是有规律的:
- 价格偏差。在流动性充足的时段,中间价通常相差不到一点,而在清淡市场、隔夜展期和新闻前后会拉开差距。
- 时间偏差。从流动性提供商聚合价格、加上自身加价并进行风控检查的经纪商,显示行情变动的时间往往晚于快速参考行情源。延迟可能是几毫秒,也可能是几百毫秒。
- 报价频率。有些行情源推送每一次变化,另一些则会限流(例如每个品种每 100 毫秒最多更新一次)。限流的行情源 tick 更少、跳动更大。
- 点差特征。原始 ECN 行情源与带加价的零售行情源,平均点差可能相差整整一点,在隔夜展期时差距更大。

对大多数策略而言,这意味着您应该在将要交易的行情源上进行测试。对延迟套利而言,意义更进一步:策略的优势就是两个行情源之间的差异,因此您需要两路数据流,并用同一时钟记录时间戳。只用一家供应商的 tick 测试套利策略是没有意义的。我们在关于外汇套利与高频交易中的 tick 比较的文章中介绍了如何逐 tick 比较行情源,并在套利用快速数据源指南中说明了为什么参考一侧必须足够快。
时间戳、时区与夏令时
时间戳问题造成的隐性回测错误比错误价格更多。需要检查四点:
1. 数据使用哪个时区?
常见约定有 UTC/GMT、美国东部时间(含或不含夏令时)以及经纪商”服务器时间”——许多经纪商冬季设为 GMT+2、夏季设为 GMT+3,使交易日在纽约时间 17:00 收盘。如果您的策略设定”在 08:00 伦敦开盘时交易”,一小时的偏差意味着它交易的是另一种市场状态。
2. 是否应用了夏令时?按谁的规则?
欧洲和美国在不同日期调整时钟。在三月约三周以及十月末至十一月初约一周的时间里,伦敦与纽约之间的时差是四小时而不是五小时。用错误规则转换的数据集会在这几周内让基于交易时段的逻辑偏移一小时。这种误差很小、具有季节性,并且很难在资金曲线中察觉。
3. 时间戳是在哪里记录的?
一个 tick 可能携带的是场所生成报价的时间、报价离开场所服务器的时间,或者您的机器接收到它的时间。对于趋势策略,这种区别无关紧要。对于延迟敏感型策略,这就是问题的全部:只有当两个行情源都用同一时钟打时间戳时才能进行比较,最好是用 NTP 或 PTP 同步的您自己的接收时间。
4. 精度与顺序
秒级时间戳不足以支持短线工作:同一秒内可能有数十个报价,排序后它们在这一秒内的顺序可能丢失。请使用毫秒级(或更高)精度,并保留原始文件顺序作为同时间排序的依据。
信任数据集之前的质量检查
原始 tick 数据总会包含错误。目标不是完美,而是了解数据中有什么,并去除会扭曲测试的部分。以下是我们在把任何新数据集用于优化之前所做的检查:
| 检查项 | 需要关注的情况 | 常见处理 |
|---|---|---|
| 时间单调性 | 时间戳倒退 | 只有在原因明确时才重新排序;否则标记该文件 |
| 重复数据 | 完全相同的行(相同时间、买价、卖价) | 删除完全重复的行;保留时间不同但价格重复的行 |
| 倒挂或零点差 | 卖价 ≤ 买价 | 删除;频繁出现说明数据源损坏或行情源被混合 |
| 异常点差 | 在已知事件之外,点差超过例如每小时中位数的 10 倍 | 标记;若与隔夜展期或新闻相符则保留,若孤立出现则删除 |
| 价格尖峰 | 中间价跳动达到近期波动率的许多倍,并在几个 tick 内反转 | 删除孤立尖峰;绝不过滤真实的新闻行情 |
| 缺口 | 流动性时段内超过 60 秒没有 tick | 标出缺口;将这些时段排除在测试之外,或标记其中的交易 |
| 陈旧报价 | 其他来源在变动时,同一买价/卖价重复数分钟 | 按缺口处理 |
| 周末和节假日 tick | 周五收盘与周日开盘之间的报价 | 删除;若整整一小时出现在该时段,则检查时区 |
| Tick 密度 | 每小时 tick 数与其他日期同一小时的对比 | 突然下降说明存在限流或记录问题 |
| 价格刻度与小数位 | 4 位与 5 位报价,JPY 货币对为 3 位小数 | 合并来源前先标准化 |
一个简单而稳健的尖峰规则:计算最近 200 个 tick 中间价变化的滚动中位数绝对偏差(MAD);如果某个 tick 的变化超过约 15 倍 MAD,并且在接下来的三个 tick 内大部分被回吐,就将其标记。真实的新闻行情不会在三个 tick 内反转;错误报价通常会。请针对每个货币对调整阈值,并查看您删除了什么,因为过于激进的过滤器恰恰会删掉套利或新闻策略所需要的行情。
分步说明:为回测准备 tick 数据

1
2
3
4
5
6
7
8
可变点差:固定点差所掩盖的成本
许多测试使用单一点差值,例如 EUR/USD 为 0.8 点。真实点差全天都在变化:在伦敦与纽约重叠时段较窄,在亚洲时段较宽,在每日隔夜展期和重大数据公布前后的几分钟内会扩大到数个点。原因请参阅我们的指南外汇点差为何扩大。
固定点差的错误是系统性的,因为策略并不是在随机时间交易的。突破策略往往在波动率上升时触发,而这正是点差扩大的时候。在平静的亚洲时段交易的均值回归策略,遇到的点差高于日均水平。使用记录的买价/卖价 tick,每笔交易支付的都是当时实际报出的点差。
计算示例(示意数字)。一个剥头皮策略每月在 EUR/USD 上进行 400 次往返交易,每次 1 标准手(每点约 $10)。
1.1 点这一数字只是用于说明机制的示例,并非任何经纪商的实测值。请在 tick 数据中测量您的策略交易实际遇到的平均点差。
数据假设对结果的影响有多大
为了展示每项假设的影响,下图选取一个假设的短线策略,只改变数据和执行模型。这些数字是示意性的,旨在反映我们从基于K线的测试转向带真实执行的基于 tick 的测试时经常看到的影响方向和大致幅度。它们不是某个具体策略的结果。

重要的是规律。每一项现实假设都会削去一部分优势,而最后一步——执行时间——对短线策略的削减往往最大。如果一个策略在全部四个步骤后仍有正结果且交易次数合理,就值得进行小规模实盘测试。如果它只在第一列看起来不错,那么优势属于数据模型,而不是市场。
Tick 是必要条件,而非充分条件:执行时间
即使是完美的 tick 数据集,如果每笔订单都按触发信号的那个 tick 的价格成交,测试结果也会过于乐观。在实盘中,从决策到成交之间总有延迟:您的平台、网络、经纪商的处理。在此期间市场继续变动。在平静的日子里,影响只有零点几个点;在快速行情中,它决定了交易是盈利还是亏损。
正确的模型是在 tick 流中按执行时间的请求部分向前推进,并按那个较晚时刻报出的买价或卖价成交。这样可以得到真实的滑点(有正有负),而无需猜测一个滑点数值。我们在关于延迟套利回测中的执行时间差距的文章中解释了这一模型、四个延迟组成部分以及计算示例,并在外汇滑点详解中介绍了如何测量实盘成交的滑点。
这也是”为什么我的实盘结果与回测不同?”这一问题最常见的答案。数据没有问题;问题在于成交模型假设了零延迟。一个好的经验法则是:先按实测执行时间测试,再按该值的 1.5 到 2 倍测试。在较高延迟下崩溃的策略是脆弱的。
存储、格式与处理
Tick 数据体量很大,您选择的格式既影响磁盘空间,也影响优化器回放数据的速度。以一个活跃的主要货币对为例的粗略估算:
数量级估算。压缩的列式格式通常还能将 tick 文件再缩小数倍。
- 以点为单位将价格存储为整数(1.08512 → 108512)。这样比较价格时可避免浮点舍入误差,并使体积减半。
- 按品种和日期分区。每个品种每天一个文件,使缺口检查、部分重新加载和并行优化都变得简单。
- 保持原始文件不变。将清洗结果存为单独的数据集并保留清洗日志,以便能够复现任何结果。
- 使用 CSV 进行数据交换。包含时间戳、买价和卖价的纯文本格式是大多数工具都能导入的格式。例如,SharpTrader Optimizer 接受您自己的 CSV 格式 tick 数据,包含时间戳、买价和卖价。
常见陷阱
- 把插值K线称为”tick 数据”。检查您的工具是回放记录的报价,还是根据K线生成报价。
- 用中间价测试。只有中间价的数据集完全忽略了点差;成本必须来自买价和卖价。
- 在一次测试中混合多个数据源。拼接两家供应商的文件会在接缝处产生人为跳动,并在同一时期内出现不同的点差状态。
- 忽略时区和夏令时。交易时段过滤和每日隔夜展期逻辑会悄无声息地发生偏移。
- 用臆造的价格填补缺口。策略可能在一次从未有过真实报价的中断期间”交易”。应当排除缺口。
- 过度清洗。删除每一次大幅波动,会去掉某些策略专门用来交易的新闻尖峰和跳动。
- 零延迟成交。在信号 tick 上完美成交,几乎会让任何短线策略看起来都有利可图。
- 在全部数据上优化。如果没有样本外时段和前向分析检验,庞大的参数网格只会找到一条拟合过去、别无他用的曲线。
SharpTrader Optimizer 中的 tick 数据
我们正是围绕本指南中的要点构建了 SharpTrader Optimizer。它回放真实的历史买价/卖价 tick,而不是插值K线;点差取自每一个 tick;并允许您以毫秒为单位设置订单执行时间,使每笔成交都来自该延迟之后的 tick 流。您可以使用在伦敦、东京和纽约节点记录的 BJF Feed tick 历史,也可以以 CSV 格式导入您自己经纪商的 tick。参数网格在所有 CPU 核心上运行——当一个货币对一年的数据就有数千万个 tick 时,这一点非常重要。
如果您已经有自己的策略,关于在 SharpTrader 中测试您自己的交易机器人的文章展示了从代码到 tick 级优化的完整流程。
在您的策略真正会遇到的 tick 上进行测试
真实的买价/卖价 tick、每个报价的可变点差,以及以毫秒计的经纪商执行时间:这三项输入决定了短线策略能否在实盘交易中存活。
常见问题
什么是外汇 tick 数据?
外汇 tick 数据是一个货币对每一次报价变化的记录,包含时间戳、买价、卖价,有时还有报价量。它保留了价格更新的精确顺序、时间和点差,而这些是K线数据所丢失的。
在哪里可以获得免费的外汇 tick 数据?
一些 ECN 经纪商和聚合商会发布主要货币对的免费历史买价/卖价 tick,许多经纪商也允许您下载其自身的历史数据。免费存档适合研究,但它们显示的是某一个场所的价格,因此请在您自己经纪商记录的 tick 上确认最终结果。
回测时 tick 数据比 1 分钟数据更好吗?
对于止盈止损在几个点以内的策略、剥头皮、新闻交易和套利,是的:一分钟K线掩盖了最高价和最低价的先后顺序、价格跳动以及真实点差。对于止损较宽的波段策略,带有真实点差的干净一分钟数据通常就足够了。
为什么我在两个数据源上得到不同的回测结果?
现货外汇没有中央成交记录,因此每个数据源都是不同场所的视角。点差、报价频率、时区、夏令时处理和清洗规则都各不相同。比较两份数据集的每小时价格和点差以找出原因,并信任最接近您执行场所的数据源。
一年的外汇 tick 数据需要多少存储空间?
对于一个活跃的主要货币对,每年大约有数千万个 tick:CSV 文本格式约 2 GB,紧凑二进制格式在压缩前约 0.6 GB。多个货币对、多年数据很快就会达到数十 GB。
为什么我的 tick 数据回测显示完美成交?
因为测试按产生信号的那个 tick 成交每笔订单。真实订单需要时间才能到达经纪商,期间价格会变动。应通过在 tick 流中向前推进、按较晚的买价或卖价成交来模拟执行时间,并按实测延迟的 1.5 到 2 倍进行测试。
我需要同时有买价和卖价,还是中间价就够了?
两者都需要。买入按卖价成交,卖出按买价成交,因此点差是每笔交易的真实成本。只有中间价的数据集去掉了这一成本,使短线策略看起来比实际更好。
本文仅供教育用途,不构成财务建议。标注为示意的示例、图表和数字并非对任何特定经纪商或策略的测量;数据来源、约定和成本因提供商而异,并会随时间变化。