供应商说“有 Tick 数据”,你怎么判断它能不能支撑你的业务?

Tick:逐笔与快照行情

约 11 分钟5 道自测更新于 2026-10-27

一句话记住先分清成交、订单事件和快照,再核对字段、单位、时间、顺序、完整性与使用范围;数据名称本身不能证明数据足够。

01学完你能做到

区分逐笔成交、订单事件和行情快照;读懂行情字段的身份、数值、时间与状态;用覆盖范围、单位、顺序和授权条件写一份可复查的数据验收清单。

02这课解决什么问题

供应商说“有 Tick 数据”,你怎么判断它能不能支撑你的业务?展示盘口、计算分钟 K 线、估算成交均价和重建订单簿,需要的数据粒度并不相同。

03三种常见行情数据

“Tick”在不同产品中可能代表不同粒度,必须写清具体类型。价格的最小变动单位也叫 tick size,是另一个概念。

类型一条记录回答什么能做什么单独使用时缺什么
逐笔成交哪个价格成交了多少汇总成交量额、研究成交价格路径未成交挂单及完整订单状态
订单事件哪个订单新增、撤销或更新在事件完整时维护订单状态初始状态、缺失事件和协议消息
行情快照某个时刻的价格、盘口或累计统计展示状态、计算部分汇总量两次快照之间的完整事件顺序

逐笔成交像收银小票,快照像收银系统定时显示的累计营业额。十档盘口也只是协议规定的档位,不等于全市场全部委托。

Level-1、Level-2 是行情产品分层,具体字段、频率、覆盖证券和使用权限取决于市场与产品协议。要确认是否包含集合竞价、特定交易方式、修正消息和异常状态,不能只看产品名称。

04一条记录要检查哪些字段

  • 身份:市场、稳定的证券标识、来源、消息类型和交易日。证券代码可能跨市场重复,也可能发生变更。
  • 数值:成交价、数量、金额及单位。数量可能是股、手或合约,金额可能有倍率;价格还要注明是否经过复权。
  • 时间与顺序:事件时间、接收时间、时区、精度、通道和序号。同一时间戳可能对应多条成交,高精度也不自动保证顺序完整。
  • 状态:新增、更正、撤销、交易阶段和重复重放标记,具体含义以协议为准。

交易 ID 和序号的唯一范围可能是“市场+日期+通道”等组合。时间戳不能直接当唯一键;重放消息和内容更正也不能简单删除。

金额累加可使用定点整数或 Decimal,避免二进制浮点误差。下面示例把价格存成“分”,只是教学中的价格刻度,不代表所有证券的实际刻度。

05一个 VWAP 样本

下表是同一虚构标的、同一人工交易日的成交,时间按上海本地钟面解释,数量单位为股,金额单位为元。B/S 是预先给出的主动方向标签,不能据此识别交易者身份。

ID时间价格数量金额主动方向
T109:30:00.12010.005005000B
T209:30:20.48010.033003009B
T309:30:45.0509.982001996S
T409:31:02.90010.02100010020B
T509:31:30.01010.054004020S
T609:33:10.50010.016006006S

总量为 3000 股,总额为 30051 元,全段 VWAP = 总额 ÷ 总量 = 10.017 元。VWAP 必须与覆盖的成交范围配套,不是把出现过的价格直接平均。

主动买量 1800 股、主动卖量 1200 股,只是按标签分类的成交规模。每笔成交都有买方和卖方,不能把主动买量解释为市场凭空增加的资金。方向未知时应保留未知类别。

如果快照同时给出同一范围的累计成交金额 A 和累计成交数量 V,且 V 大于 0,则累计 VWAP = A ÷ V。只有最新价与累计量时,缺少成交金额,不能恢复真实 VWAP;“最新价 × 新增量”只能作为明确标注的估算。

06代码:用定点价格计算并按时间分桶

from datetime import datetime
from decimal import Decimal

rows = [
    ("T1", "2026-10-26 09:30:00.120", 1000, 500, "B"),
    ("T2", "2026-10-26 09:30:20.480", 1003, 300, "B"),
    ("T3", "2026-10-26 09:30:45.050", 998, 200, "S"),
    ("T4", "2026-10-26 09:31:02.900", 1002, 1000, "B"),
    ("T5", "2026-10-26 09:31:30.010", 1005, 400, "S"),
    ("T6", "2026-10-26 09:33:10.500", 1001, 600, "S"),
]
rows = sorted(rows, key=lambda r: (r[1], r[0]))
quantity = sum(r[3] for r in rows)
amount_fen = sum(r[2] * r[3] for r in rows)
print(Decimal(amount_fen) / Decimal(quantity) / 100)

# 用完整日期时间分桶,避免不同分钟的相同秒数冲突。
buckets = {}
for trade_id, ts, price_fen, qty, side in rows:
    t = datetime.fromisoformat(ts)
    start = t.replace(second=(t.second // 3) * 3, microsecond=0)
    buckets.setdefault(start, []).append(trade_id)
print(len(buckets))

代码中的快照应理解为按边界人为采样的累计状态,不是某个交易所的真实快照格式。真正按时钟发布的快照,即使没有新成交,也可能继续输出状态。

07选择数据前要问什么

  1. 数据类型、市场、证券范围和交易阶段是什么?
  2. 字段单位、精度、时间语义和唯一键是什么?
  3. 历史与实时数据是否同口径,修正怎样传递?
  4. 序号在哪个范围连续,怎样发现缺失并恢复?
  5. 正常日和异常日能提供什么对账样本与覆盖证据?
  6. 展示、接口、内部研究、存储和再分发分别允许到哪一步?技术上拿得到,不等于所有用途都被允许。

08延伸阅读

09一分钟讲给别人

试着用自己的话讲一遍选行情数据,先问每条记录究竟代表成交、订单事件还是快照。字段足够时,快照也能算某段 VWAP,但不能还原完整路径。做数据产品,要同时交代单位、时间、覆盖范围、更正和使用权,让使用者知道哪些结论有证据。

想一想

5 道自测

先在心里答一遍,再展开对照。能说清理由,比答对数字更重要。

  1. 01逐笔成交和快照分别保留了什么信息?

  2. 02总成交额 30051 元、总成交量 3000 股时,VWAP 是多少?

  3. 03只有最新价与累计成交量,为什么不能恢复真实 VWAP?

  4. 04为什么不能把时间戳直接当作唯一键?

  5. 05主动买量 1800 股能否直接解释为“资金净流入 1800 股”?

已看 0/5 题

练动手练习

任务:去掉 T4,重新计算总量、总额和 VWAP,并说明为什么新结果不能再代表完整样本。再写一份行情数据契约,至少包含数据类型、证券标识、唯一键、单位、时间、交易阶段、修正、缺失状态和允许用途。

完成这一课

完成这一课

读完讲义、看完自测答案,这一课就算学完了。

  • 读完讲义
  • 看完全部自测

本课为投资者教育内容,案例数字均为示意,不构成任何投资建议,也不承诺收益。规则和费率会变,实际操作前请以交易所、监管机构和产品的最新公告为准。