跳到正文
AllTick
接入教程

行情数据如何落库:时间戳、去重与缺口

设计行情数据存储表结构,统一时间戳与精度,用唯一约束去重,并检测与补齐 K 线缺口,同时注意数据存储授权。

更新时间:
维护方:AllTick 官方技术团队
适用对象:负责行情数据管道与存储的数据工程师

核心结论 · 30秒开发速览

行情数据落库有三条原则:所有时间以 UTC 毫秒或带时区的时间类型保存,用“代码 + 周期 + 时间”作为唯一键实现幂等写入,并定期按交易日历检测缺口后用 REST 补齐。在长期存储之前,还要确认数据授权是否允许落库。

01

表结构建议

PostgreSQL 示例sql
CREATE TABLE kline (
code text NOT NULL,
period text NOT NULL,
bar_time timestamptz NOT NULL,
open numeric(20, 8) NOT NULL,
high numeric(20, 8) NOT NULL,
low numeric(20, 8) NOT NULL,
close numeric(20, 8) NOT NULL,
volume numeric(28, 4),
turnover numeric(28, 4),
source text NOT NULL DEFAULT 'alltick',
ingested_at timestamptz NOT NULL DEFAULT now(),
PRIMARY KEY (code, period, bar_time)
);
  • 价格使用 numeric/decimal,避免浮点误差累积。
  • bar_time 使用 timestamptz,入库前把毫秒时间戳转换为 UTC 时间。
  • 保留 source 与 ingested_at,便于追溯数据来源和排查问题。

02

幂等写入与去重

sqlsql
INSERT INTO kline (code, period, bar_time, open, high, low, close, volume, turnover)
VALUES ($1, $2, to_timestamp($3 / 1000.0), $4, $5, $6, $7, $8, $9)
ON CONFLICT (code, period, bar_time)
DO UPDATE SET open = EXCLUDED.open, high = EXCLUDED.high, low = EXCLUDED.low,
close = EXCLUDED.close, volume = EXCLUDED.volume, turnover = EXCLUDED.turnover;

当前未收盘的 K 线会不断变化,使用 upsert 让最新值覆盖旧值。重连补数据、翻页重叠时也不会产生重复记录。

03

缺口检测

1根据交易日历生成某时间段内“应当存在”的 K 线时间点。
2与数据库中已有时间点求差集,得到缺口列表。
3剔除休市、午间休市和节假日,避免误报。
4对真实缺口用 REST K 线接口按截止时间补齐。
5记录补齐结果;仍无法补齐的缺口交由人工确认。

04

存储前确认授权

行情数据的长期存储、再分发和对外展示通常受服务条款约束。上线前请确认你的套餐与协议是否允许落库保存、是否允许展示给终端用户。企业场景建议直接与供应商确认使用范围。

规范来源与验证记录 · 2026-10-13

已根据下方一手资料核对相关端点、字段与交易所规则。

本轮未使用真实 Token 执行 AllTick 请求,也未完成生产端到端测试。复现时请记录套餐、依赖版本、交易时段、ret/trace 与实际结果。

上线前建议复现

  • 重复写入一批数据,确认记录数稳定;再写入修订 K 线核对 upsert,并模拟事务中断回滚。
  • 保留时间单位和十进制精度,区分休市与缺口;随序列保存来源、复权口径及品种身份。