开发指南

币圈多源数据为什么经常对不上?K线、OI、资金费率和成交数据必须先对齐时间

把K线、OI、资金费率和成交数据直接按时间字段拼起来,很容易产生隐藏的前视偏差。采样频率、时间戳含义、时区和数据发布时间必须先统一。

核心解答

币圈量化越来越少只看OHLC。

很多策略会同时使用K线、成交量、Open Interest、资金费率、Mark Price、主动买卖和清算数据。

数据源变多以后,一个非常隐蔽的问题开始出现:这些字段虽然都有时间戳,但它们的时间含义并不一定相同。

15分钟K线的时间到底代表什么

有的数据源把K线时间标记为区间开始时间。

例如12:00这一根15分钟K线实际包含的是12:00到12:14:59之间的数据。

当你看到它完整的最高、最低、收盘和成交量时,这根K线实际上已经结束。

如果策略在12:00这个时间点就读取完整收盘值并下单,相当于提前知道未来15分钟发生了什么。

这是非常典型的前视偏差。

OI快照和K线不是同一种数据

Open Interest可能按固定周期采样,也可能来源于某个接口查询时点。

一个12:15的OI值究竟表示12:15瞬间的持仓量,还是12:00到12:15统计结果,需要看数据定义。

如果简单用pandas按最近时间向前填充,很可能把稍晚才公布的OI值填回更早K线上。

表格看起来非常整齐,策略实际上已经偷看未来。

资金费率更容易被错位

资金费率通常在特定结算时点发生,但研究数据还可能同时存在预测费率、当前费率和实际结算费率。

如果策略使用“最终实际结算值”决定结算之前的仓位,就已经使用了当时还不知道的信息。

所以字段名称里不能只写funding_rate,还要记录它到底是什么类型、对应哪个周期,以及什么时候真正变成可用信息。

成交数据的时间精度又不同

逐笔成交可能精确到毫秒甚至更细,而K线只有分钟级。

当策略把逐笔主动买卖聚合成5分钟指标时,需要明确窗口是左闭右开还是其他定义,并保证这5分钟统计值只能在窗口结束以后用于下一次决策。

否则一边用12:00到12:05全部成交统计,一边又假设自己12:00已经知道结果。

统一使用UTC仍然不够

统一时区可以消除本地时间和夏令时问题,但不能解决“事件什么时候可知”。

真正重要的是同时保存event_time和available_time。

event_time表示市场事件属于哪个时间,available_time表示你的系统最早什么时候能够拿到这个数据。

回测只能使用决策时刻之前已经available的数据。

不同交易所的数据不能默认完全同步

BTC在多个交易所有各自订单簿、指数和合约规则。

一个平台的OI、另一个平台的成交价、第三个平台的资金费率直接拼接,可能产生时间和市场结构上的不一致。

如果确实需要跨交易所因子,应明确每个字段来源,并考虑网络延迟、接口刷新频率和交易所自身发布时间。

缺失值不能无脑forward fill

OI接口短暂失败、某个时间段没有返回数据,不代表真实OI一定保持不变。

无限向前填充会把一个陈旧快照伪装成连续有效数据。

更好的做法是设置最大可接受陈旧时间,超过阈值以后把因子标记为缺失,并规定策略在关键数据缺失时是否禁止交易。

建立一张Data Contract表

每个字段至少记录来源、单位、时区、时间戳含义、采样周期、发布时间、缺失规则和历史是否会修订。

例如同样叫volume,也要区分币本位数量、USDT名义金额和成交笔数。

只有先把数据语义写清楚,回测和实盘才可能使用同一套定义。

回测和实盘必须复用同一套对齐逻辑

研究阶段如果用一套离线脚本对齐数据,实盘又自己写一套实时逻辑,很容易出现“回测信号和实时信号始终差一点”。

更稳妥的方法是把时间归一化、窗口聚合、陈旧数据判断和因子生成做成共享模块。

然后用历史数据重放实时处理流程,验证同一时刻能够得到相同因子。

资料依据

主流加密货币衍生品交易平台的官方API通常分别定义Kline、Open Interest、Funding Rate、Mark Price等数据接口,并明确各自时间字段和采样方式。

研究时应以实际使用交易所的最新API定义和历史数据说明为准。

风险提示

历史数据和回测结果不代表未来收益。本文讨论的是量化数据工程方法,不构成投资建议。

结论

多因子策略最危险的前视偏差,往往不是代码里明显写了shift(-1),而是几张不同时间语义的数据表被“漂亮地”合并在一起。先定义数据什么时候发生、什么时候可知,再谈策略有没有预测能力。

RELATED GUIDES

继续了解这个主题

项目咨询

淄博卓亚网络科技服务有限公司
电话:15269365953
地址:山东省淄博市张店区体育场街道办事处华光路2号泽泉消防市场三楼S18