本文目录与来源 4 节

文章要点

  • nearest 可能匹配决策之后的数据;本次案例提前使用了 10 毫秒。
  • 向前查找旧数据仍需限制数据年龄,并核对是否属于同一资产。
  • 同刻匹配与缺失值处理都需要明确规则,合并成功不代表数据可用。

相差 10 毫秒,也不能提前使用

本次合成案例把 BTC 决策设在 10000 毫秒,右表的 BTC 记录则在 9000、10010 与 30000 毫秒可用。nearest 匹配到 10010,只差 10 毫秒,却已经晚于决策。改用 backward,结果才是 9000。这些时间都是同一起点之后的毫秒数,没有真实行情。

pandas 官方文档要求两表先按合并时间升序排列。本文用 decision_ms 与 available_ms 分别保存决策时间、数据可用时间,再用 by='symbol' 限定同一资产。数据可用时间应有实际接收或处理记录支持;直接把交易所事件时间改名,并不能补出传输延迟。[1]

不读未来,仍可能拿到过旧的数据

BTC 在 20000 毫秒决策时,backward 匹配到 10010,数据已经过去了 9990 毫秒。加上 tolerance=2000,这条结果变成缺失值。2000 毫秒只是本次教学的容许上限,并非任何市场的推荐设置。

同一份数据还有 ETH 在 8000 毫秒的记录与 10000 毫秒的决策。保留 by='symbol' 时匹配到 ETH 的 8000;省略分组后,实际匹配到 BTC 的 9000。时间方向正确,资产却错了。实际研究还应将交易场所、交易对和产品类型纳入标识,不能只靠 BTC 这样的缩写。

同一时刻能否使用,需要明确规则

BTC 在 30000 毫秒决策时,默认允许同刻匹配,因此拿到 30000 的记录。保持 backward 与 tolerance=2000,再设 allow_exact_matches=False,这条就变成缺失值:同刻记录被排除,更早的记录又超过上限。相同时间戳未必足以证明先后,是否允许必须根据数据精度和处理顺序决定。

合并后保留两个时间字段,逐条计算 decision_ms 减 available_ms,核对资产、负时间差及超龄记录。缺失值需要单独标记,不能直接补零后当作观测值。若来源会修订,另存当时的版本与获取时间;本次案例没有测试修订数据或重复时间戳。

复现这个小案例

左表为 BTC10000、ETH10000、BTC20000、BTC30000;右表为 ETH8000、BTC9000、BTC10010、BTC30000,数字均为整数毫秒。两表分别按时间排序,以 left_on='decision_ms'、right_on='available_ms' 调用 pd.merge_asof。依次比较 nearest、backward、backward 加 tolerance=2000,再排除同刻;最后另跑省略 by 的版本。每次只改对应设置,就能查到哪个条件改变了匹配。

本次在 Windows、Python 3.14.6、pandas 3.0.1、NumPy 2.5.4 下运行四条对四条、五种设置,五项结果断言通过。官方 3.0 系列文档查阅于 2026 年 11 月 5 日,当时页面标示 3.0.6;查阅日并非软件发布日期。这是数据合并教学,未运行交易策略、成交成本或滑点测试,不能用于推估收益。本文由 AI 辅助研究、撰写与审稿,封面为 AI 概念插画,无赞助或联盟链接,不构成投资建议。

资料来源与延伸阅读

(1)

核对数据时,请一并确认来源日期、统计期间与适用条件;部分链接会持续更新。

  1. pandas — merge_asof(3.0 系列官方文件) (在新标签页打开)

本文为信息与教育用途,不构成投资建议。加密资产可能大幅波动,请独立核实。

作者与编辑说明 ↗本文有错误?告诉我们 ↗
继续读这个栏目 ↗