回测可以正确处理每一行数据,却仍然回答错误的问题,因为这些行描述的是错误的市场、跳过了部分样本,或将信息挂到了错误的时间上。因此,数据质量是策略设定的一部分。在解读收益之前,先记录每个观测值的含义、它在何时可用,以及它是如何获得的。

1. 明确具体的市场与K线

写下数据提供商与交易场所、确切交易代码、现货或衍生品合约、计价与结算资产、K线周期,以及时间戳标记的是K线的开盘还是收盘。“BTC 小时K线”遗漏了可能改变价格、成交量、资金费率和交易时段的细节。除非有明确记录的研究问题支持采用不同的拼接方式,否则应将某一合约的价格序列与该合约的资金费率历史放在一起。

检查合约元数据,了解样本期间的下架、迁移、合约乘数和交易代码变更。交易代码可能保持不变,但其市场定义已经改变。如果数据源修订了历史数据,请保留获取日期和原始副本,以便未来的运行能够解释差异。

2. 在计算指标之前审计时间索引

将时间戳统一为 UTC,同时保留数据提供商的原始表示形式。记录数值是秒还是毫秒。ISO 时间戳需要明确的 Z 或 UTC 偏移量才能确定某一时刻;诸如 2026-04-07 13:00 这样的本地时钟字符串在没有时区的情况下是有歧义的。检查排序和唯一性,然后将首尾时间与请求的窗口及预期间隔数进行比对。

对于一个从 UTC 10:00 开始、包含四个小时级观测值的样本,预期的开盘时间为 10:00、11:00、12:00 和 13:00。一个包含 10:00、11:00、11:00 和 13:00 的文件仍然有四行,但它有一个重复的 11:00,且缺少 12:00 的观测值。仅凭行数会同时漏掉这两个缺陷。应从权威数据源解决这些问题;不要对重复的K线取平均,也不要编造一根看起来普通的K线来填补空缺。如果某个空缺被排除,请报告日期、规则,以及它如何影响预热、交易和样本覆盖范围。

K线行数可能掩盖缺失的区间与重复数据对于 10:00、11:00、12:00 和 13:00 UTC 这四个预期的小时开盘,这份虚构文件有四行,但重复了 11:00 并遗漏了 12:00。应统计唯一时间戳,并将完整预期序列进行比对,而不仅仅是对比行数。四行并不能证明有四个不同的小时预期实际观测10:0011:0012:0013:0011:00 重复12:00 缺失4 行 · 3 个唯一时间 · 一个重复 · 一个缺失区间
对于 10:00、11:00、12:00 和 13:00 UTC 这四个预期的小时开盘,这份虚构文件有四行,但重复了 11:00 并遗漏了 12:00。应统计唯一时间戳,并将完整预期序列进行比对,而不仅仅是对比行数。 教学说明图 · 非实时市场数据

3. 检查数值与数据源覆盖范围

对于每根 OHLC K线,确认价格为正且有限,high ≥ max(open, close)、low ≤ min(open, close) 且 high ≥ low。成交量应使用声明的单位且为非负值。在开头、中间、结尾以及可疑波动附近,对照原始数据源绘制或检查若干原始行。留意长期不变的重复值、成交量单位的突然变化、重复的分页边界、未完成的最新K线以及缺失的间隔。一张看似合理的图表并不能证明市场身份正确或数据提供商来源可靠。

覆盖范围既是文件的属性,也是 API 的属性。以当前的 Hyperliquid 为例,其K线快照端点记录了支持的周期,并说明仅提供最近 5,000 根K线。K线响应会给出开盘和收盘时间戳,以及交易代码、周期、OHLC、成交量和成交笔数;其 WebSocket 架构将时间戳字段标注为毫秒。如果请求的历史数据超出了该端点可用的窗口,即使响应能够正常解析,也可能是不完整的。记录请求窗口,并验证返回的首尾K线是否与之匹配。对于更早的覆盖范围,请使用合适的存档或另一个明确标识的数据提供商。这些是 2026 年 9 月 25 日核查的 Hyperliquid API 细节,并非通用的交易所限制;请参阅 candle snapshot API 和 candle WebSocket schema。

4. 按实际含义对齐资金费率及其他事件数据

资金费率具有时间和合约特异性。保留其费率单位、符号、时间戳和结算惯例。缺失的费率是未知,而不是零支付。市场资金费率历史描述的是结算时点的费率;单个账户的分类账记录的是仓位大小和实际现金变动。二者回答的是不同的问题。例如,Hyperliquid 为其永续合约记录了每小时资金费率、一个历史费率端点,以及一个单独的用户资金费率分类账,其中包含时间、币种、费率、规模和 USDC 变动等字段。应将正确的记录与当时持有的仓位相匹配,而不是向前填充或将费率应用于每根K线。请查阅其当前的 funding rules 和 perpetual data endpoints,核查于 2026 年 9 月 25 日。

信号时点同样需要谨慎处理。一根K线的最终最高价、最低价和收盘价在其开盘时并非全部已知。如果规则需要已完成的收盘价,那么决策只能在该K线结束之后使用它。模拟入场随后必须在声明的惯例下使用更晚的可执行观测值。在同一根K线的开盘时测试基于收盘价的决策会泄露未来信息。检查指标预热、重采样边界、合并特征以及用于生成信号的确切数据行。

1小时K线何时对策略可用一根标注为 10:00 的1小时K线,其数值在 11:00 收盘前持续变化。使用其最终收盘价的规则,只能在 11:00 之后才做出决策;这个示意性的研究引擎评估前一根已完成的K线,并使用下一根K线的开盘价作为新的模拟入场点。基于收盘价的信号在K线开盘时无法得知10:00 K线正在形成最高价 · 最低价 · 收盘价仍可能变化收盘价已知于 11:00下一根K线开盘模拟执行点已完成K线信号 → 稍后观测在 10:00 使用 10:00 的最终收盘价会泄露未来信息引擎惯例示例 · 其他工具和委托可能采用不同的时点规则
一根标注为 10:00 的1小时K线,其数值在 11:00 收盘前持续变化。使用其最终收盘价的规则,只能在 11:00 之后才做出决策;这个示意性的研究引擎评估前一根已完成的K线,并使用下一根K线的开盘价作为新的模拟入场点。 教学说明图 · 非实时市场数据

5. 保留原始证据与每一次转换

原样保存原始响应或文件,并附上数据源名称、市场标识符、请求参数、获取时间戳、周期、时区、行数以及请求的开始/结束时间。记录软件或转换版本以及加密指纹。创建单独的清洗后数据集;对于每一次更正或排除,保留原始行、原因、替代来源和确切的转换过程。这样另一位研究者就能复现结果,并比较后续的数据源修订,而无需猜测“清洗后的数据”意味着什么。

研究运行应将其数据集指纹与策略版本、引擎版本、时间跨度、设置、警告和输出绑定在一起。哈希可以确认两个文件在所选方法下字节级或数值级一致;它不能证明任一文件是真实的。数据来源与数据准确性是相关但不同的检查。

保留一条从源文件到研究结果的可复现路径研究记录会保留原始响应与请求上下文,记录校验与转换过程,对已接受的数据集进行版本化管理,将该指纹与策略版本和引擎版本绑定,并在结果中附带警告信息。未通过的校验进入异常记录,而不是被悄然修复。保留原始记录,并将每个结果绑定到其输入01 · 原始来源数据提供方 · 市场请求 · 获取时间02 · 审计覆盖范围 · 计量单位记录的异常03 · 数据集转换 · 哈希时间跨度 · 版本04 · 精确运行策略 · 引擎设置 · 警告05 · 复核结果输出 · 局限性复现 · 比对指纹可证明这些输入的一致性 · 不证明其准确性保留失败行与修正原因以便查验;不得悄然改动原始文件
研究记录会保留原始响应与请求上下文,记录校验与转换过程,对已接受的数据集进行版本化管理,将该指纹与策略版本和引擎版本绑定,并在结果中附带警告信息。未通过的校验进入异常记录,而不是被悄然修复。 教学说明图 · 非实时市场数据

SuperQuant 验证的内容

SuperQuant 的 CSV 导入器要求时间戳、开盘价、最高价、最低价、收盘价和成交量字段,以及可选的 funding_rate。它要求至少 60 个按升序排列、唯一、连续的一小时 UTC 观测值,OHLC 价格为正且有限,成交量为非负,且K线关系有效。ISO 时间戳必须带有时区。缺失的资金费率保持为空值并会被报告;包含资金费率或依赖资金费率过滤器的策略需要资金费率观测值。这些检查会拒绝格式错误的结构,但导入器无法验证所声称的交易所,也无法证明经济上的准确性。

内置的历史数据是合成的教学示例,并非市场记录。导入的序列是具有自身来源和局限性的独立证据。请查看 historical-data CSV template 和 backtest audit checklist,然后阅读 cost guide 和 look-ahead bias review。良好的数据能让测试可解释;它们并不能证明存在持续的优势,也不能预示未来的结果。本指南为一般性教育内容,不构成投资建议。