行情数据
行情数据 (Market Data),是指与时间高度关联、与用户自身无关的信息标注 (Annotation)。代表着用户在某个时间之后获悉了某种信息,这种信息可能是某个时间点的价格,也可能是某个时间段内的统计数据。行情数据的种类繁多,包括 OHLC-V,逐笔成交,产品行情摘要,订单簿和财经事件等数据。
根据标注时间的类型,行情数据分为瞬时行情数据 (Instant Market Data) 和范围行情数据 (Range Market Data)。其中,瞬时行情数据仅表示某一时刻的行情数据,而范围行情数据则表示某一时间段内的行情数据。瞬时行情数据可以简单认为是起止时间点完全相同的范围行情数据。大部分情况下,范围行情数据是指范围结束时间点之后回顾过去一个时间范围内的统计数据,因此本质上范围行情数据也是一种特殊的瞬时行情数据。但是我们仍然在概念上予以区分,显得比较符合直觉。
根据数据的时效性,行情数据分为实时行情数据 (Real-time Market Data) 和历史行情数据 (Historical Market Data)。实时行情数据是指实时获取的行情数据,而历史行情数据则是指过去某个时间段内的行情数据。实时数据会用于实盘交易,监控等场景,而历史数据则会用于回测、分析等场景。并不是所有的实时数据都会被保存为历史数据,因此历史数据的获取方式可能会有所不同(录制或者从数据源拉取)。
数据的可变性是指数据是否会随着时间的推移而发生变化。如果系统中所有的数据都要求不可变,那么对于计算资源的要求是非常高的,同时对数据源的质量要求也非常高,事实上是很难实现的。那么,行情数据作为一种可变信息,就必备标识符 (id
),并且关键的时间点包括:产生的时间 (created_at
)、冻结的时间 (frozen_at
)、观测的时间 (updated_at
)。
对于数据量大、重叠度高、结构复杂的行情数据,可以使用快照 (Snapshot) 和补丁 (Patch) 进行信息压缩编码。快照是指某个时间点的完整数据,而补丁是指某个时间点之后的数据变化。快照和补丁的组合,可以还原一个完整的数据流。例如订单簿数据,就很适合使用这种方式进行传输。
具体的行情数据
OHLC-V
OHLC-V 是一种行情数据格式,包含了开盘价 (Open)、最高价 (High)、最低价 (Low)、收盘价 (Close) 和成交量 (Volume)。
可视化方面,OHLC-V 数据可以用于绘制 K 线图 (Keisen Chart),或者美国线 (OHLC Chart),是最常用的技术分析工具。
OHLC-V 的时间段可以是任意的,例如 1 分钟、5 分钟、15 分钟、30 分钟、1 小时、4 小时、1 天、1 周、1 月等。不同的时间段会影响 OHLC-V 的粒度,例如 1 分钟的 OHLC-V 会显示更多的价格波动,而 1 天的 OHLC-V 则会显示更多的长期趋势。1 小时以上的 OHLC-V 开始与时区有关,因此在不同的时区下,同一时间段的 OHLC-V 序列可能会有所不同。
字段名称 | 描述 | 示例值 |
---|---|---|
product_id | 产品 ID | "XAUUSD" |
duration | OHLC-V 的周期,以 RFC3339 Duration 格式定义 | "PT5M" |
opened_at | OHLC-V 开盘的时间戳 (Unix 毫秒格式) | 1630000000000 |
closed_at | OHLC-V 收盘的时间戳 (Unix 毫秒格式) | 1630000060000 |
open | 开盘价 | 1490.23 |
high | 最高价 | 1500.45 |
low | 最低价 | 1480.52 |
close | 收盘价 | 1495.46 |
volume | 范围内的成交量 | 100 |
一般来说,开盘时间点 + 周期长度 = 收盘时间。但是,由于交易所的交易时间可能会有所不同,因此在某些情况下,开盘时间点和收盘时间点的差额不等于周期长度。因此,为了保证数据的准确性,我们同时需要周期、开盘时间和收盘时间。
例如,某个交易所的交易时间是每周一到周五上午时段 9:30-11:30,下午时段 13:00-15:00。 对于 1 小时的 K 线来说,每天开盘的第一个 K 线是 9:30 到 10:00,而不是 9:30 和 10:30。
同样的,由于这种特殊的情况,我们也无法准确地通过开盘和收盘时间来计算周期长度,因此我们需要周期字段来明确指定周期长度。
逐笔成交
逐笔成交 (Tick) 是指金融市场中每笔交易的成交信息。逐笔成交包含了成交的时间、价格、数量等信息。逐笔成交的数据量非常大,通常会用于高频交易场景。逐笔成交的数据可以用于分析市场的流动性、价格走势等信息。
逐笔成交的数据通常是实时获取的,因此逐笔成交数据的时效性非常重要。逐笔成交数据的获取方式通常是通过交易所的 API 接口获取,但是不同的交易所可能会有不同的数据格式和数据接口。
字段名称 | 描述 | 示例 值 |
---|---|---|
product_id | 产品 ID | "XAUUSD" |
updated_at | 信息的时间戳 (Unix 毫秒格式) | 1630000000000 |
price | 成交价格 | 1490.23 |
volume | 成交数量 | 100 |
产品行情摘要
产品行情摘要 (ProductMarketSummary) 是指金融市场中某个产品的行情信息。产品行情摘要包含了产品的最新成交价格、结算价格、持仓量、买卖盘信息、利率信息等。产品行情摘要的数据可以用于分析市场的走势、市场的风险等信息。产品行情摘要并不是逐笔成交数据,而是对整个市场的一个概览快照,更新频率没有逐笔数据高。产品行情摘要的历史数据可以存入数据库,用于回测、分析等场景。
字段名称 | 描述 | 示例值 |
---|---|---|
product_id | 产品 ID (必填) | "XAUUSD" |
updated_at | 信息的时间戳 (Unix 毫秒格式) (必填) | 1630000000000 |
last_price | 最新成交价格 | 1490.23 |
settlement_price | 结算价格 (标记价格, 清算价格),用于持仓的估值 | 1490.25 |
open_interest | 市场总持仓量 | 212847 |
ask_price | 要价,最优卖一价格 | 1490.25 |
ask_volume | 最优卖一数量 | 100 |
bid_price | 竞价,最优买一价格 | 1490.23 |
bid_volume | 最优买一数量 | 100 |
interest_rate_for_long | 多头持仓利率 (按持仓价值) | 0.0001 |
interest_rate_for_short | 空头持仓利率 (按持仓价值) | -0.0001 |
settlement_scheduled_at | 下次结算时间戳 (Unix 毫秒格式) | 1722104965015 |
订单簿
订单簿 (Order Book) 是指金融市场中的买卖盘信息。订单簿包含了买单和卖单的价格和数量信息。订单簿的数据可以用于分析市场的买卖盘情况、市场的支撑和阻力位等信息。
订单簿的数据通常是实时获取的,因此订单簿数据的时效性非常重要。订单簿数据的获取方式通常是通过交易所的 API 接口获取,但是不同的交易所可能会有不同的数据格式和数据接口。
- 订单簿快照 (Order Book Snapshot) 是指某个时间点的订单簿信息。
- 订单簿补丁 (Order Book Patch) 是指某个时间点之后的订单簿信息变化。
快照和补丁共用同一个数据结构。
字段名称 | 描述 | 示例值 |
---|---|---|
product_id | 产品 ID (必填) | "XAUUSD" |
updated_at | 信息的时间戳 (Unix 毫秒格式) (必填) | 1630000000000 |
prev_updated_at | 上次消息的时间戳 (Unix 毫秒格式) | 1630000001000 |
asks | 卖单信息 (必填) | [{price: 1490.25, volume: 100}, ...] |
bids | 买单信息 (必填) | [{price: 1490.23, volume: 100}, ...] |
- 订阅订单簿补丁频道。
- 收到第一个补丁数据,开始缓存到列表中。
- 请求订单簿快照。
- 丢弃目前缓存到的补丁信息中早于快照的部分。
- 用快照替换本地副本,并从剩余未丢弃的补丁中开始继续更新本地副本。
- 如果补丁流的
prev_updated_at
不等于上一个补丁的updated_at
,说明可能出现了丢包,抛出异常。 - 每一个快照中的挂单量代表这个价格目前的挂单量绝对值,而不是相对变化。
- 如果某个价格对应的挂单量为 0,表示该价位的挂单已经撤单或者被吃,应该移除这个价位。