2. 金融时序数据基础
在金融时序数据平台中,数据并不是单一形态。行情、逐笔、快照、K线与指标数据分别对应不同的市场信息粒度、更新频率和计算语义。理解它们的差异,是设计 ClickHouse 表结构、选择排序键、划分分区以及确定物化视图策略的前提。本节从数据特点、模型设计与典型场景三个维度展开,帮助你在后续实战中做出正确的建模决策。
一、五类数据的核心特点
金融时序数据可以按“原始程度”和“聚合程度”排成一条谱系:逐笔最原始,快照是某一时刻的截面,行情是连续报价流,K线是区间聚合,指标则是在K线或快照之上二次计算的结果。它们的写入频率、数据量级和查询模式差异极大。
- 逐笔数据(Tick/Trade):每一笔成交或委托产生一条记录,包含时间戳、价格、数量、方向等。频率可达每秒数万条,是数据量最大的类型,通常用于微观结构分析和回测。
- 快照数据(Snapshot):按固定周期(如3秒、500毫秒)采集的盘口截面,包含买卖一至十档价格与量。频率稳定,适合重建订单簿和计算盘口指标。
- 行情数据(Quote):以买卖报价为核心的实时推送流,强调最新价、买卖价和成交量。更新频率介于逐笔与快照之间,是实时监控的主要来源。
- K线数据(OHLCV):按时间窗口聚合的开高低收与成交量,如1分钟、5分钟、日线。数据量小、查询频繁,是策略研究和可视化的基础。
- 指标数据(Indicator):在K线或快照上计算出的衍生值,如MA、MACD、RSI、波动率。通常由物化视图或批处理生成,服务于信号判断和风控。
关键认知:逐笔和快照是“事实数据”,K线和指标是“派生数据”。在 ClickHouse 中,事实数据用 MergeTree 系列表承载,派生数据优先用物化视图增量维护,避免每次查询都全量重算。
二、数据模型与 ClickHouse 表设计要点
五类数据在 ClickHouse 中的建模思路不同,但共享一个原则:排序键必须匹配最高频的查询过滤路径。下面给出典型建表示例,突出分区、排序键和引擎选择。
-- 逐笔成交:按日期分区,排序键为 (symbol, trade_time)
CREATE TABLE tick_trade (
symbol LowCardinality(String),
trade_time DateTime64(3),
price Decimal(18, 4),
volume UInt64,
direction Int8
) ENGINE = MergeTree()
PARTITION BY toYYYYMMDD(trade_time)
ORDER BY (symbol, trade_time);
-- 快照:按日期分区,排序键为 (symbol, snap_time)
CREATE TABLE snapshot (
symbol LowCardinality(String),
snap_time DateTime64(3),
bid_price Array(Decimal(18, 4)),
bid_volume Array(UInt64),
ask_price Array(Decimal(18, 4)),
ask_volume Array(UInt64)
) ENGINE = MergeTree()
PARTITION BY toYYYYMMDD(snap_time)
ORDER BY (symbol, snap_time);
-- K线:按年月分区,排序键为 (symbol, interval, bar_time)
CREATE TABLE kline (
symbol LowCardinality(String),
interval LowCardinality(String),
bar_time DateTime,
open Decimal(18, 4),
high Decimal(18, 4),
low Decimal(18, 4),
close Decimal(18, 4),
volume UInt64
) ENGINE = ReplacingMergeTree()
PARTITION BY toYYYYMM(bar_time)
ORDER BY (symbol, interval, bar_time);
逐笔和快照表通常使用 MergeTree,因为数据只追加不更新;K线表若存在重算或补数,可用 ReplacingMergeTree 按排序键去重。指标表则建议用 AggregatingMergeTree 或物化视图直接写入聚合状态。
| 数据类型 | 典型频率 | 单日量级(单标的) | 推荐引擎 | 主要查询模式 |
|---|---|---|---|---|
| 逐笔成交 | 毫秒级 | 数万至百万条 | MergeTree | 按标的+时间范围明细 |
| 快照 | 500ms~3s | 数千至数万条 | MergeTree | 盘口重建、截面统计 |
| 行情 | 实时推送 | 数万条 | MergeTree | 最新价、涨跌幅 |
| K线 | 1min~1day | 数百至数千条 | ReplacingMergeTree | 区间聚合、策略回测 |
| 指标 | 随K线 | 与K线同量级 | AggregatingMergeTree | 信号筛选、风控监控 |
三、典型应用场景与数据流
不同数据服务于不同业务。逐笔用于成交明细查询和微观结构研究;快照用于订单簿重建和盘口压力分析;行情用于实时看板;K线用于策略回测和技术分析;指标用于信号生成和风险预警。下图展示了五类数据从采集到应用的流转关系。
四、常见误区与复盘建议
误区一:所有数据都用一张宽表。逐笔和K线的粒度、频率、查询模式完全不同,混在一张表会导致分区膨胀、排序键失效,查询性能急剧下降。
误区二:K线用普通 MergeTree 且不处理重复。补数或重算时会产生重复行,回测结果失真。应使用 ReplacingMergeTree 并配合 FINAL 或去重查询。
误区三:指标每次查询实时计算。MACD、RSI 等指标在大量标的和长时间范围下计算成本极高,应通过物化视图预聚合,查询时只做轻量过滤。
复盘建议:建模前先列出三类问题——数据写入频率是多少?最常用的查询过滤条件是什么?数据是否需要更新或去重?答案分别决定分区键、排序键和表引擎。对于逐笔和快照,优先保证写入吞吐和按标的+时间的范围扫描;对于K线和指标,优先保证去重和增量聚合效率。
掌握这五类数据的差异与建模方法后,你就能在 ClickHouse 中为不同金融时序场景选择合适的数据结构与引擎,为后续的写入优化、查询加速和物化视图设计打下坚实基础。