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线用于策略回测和技术分析;指标用于信号生成和风险预警。下图展示了五类数据从采集到应用的流转关系。

金融时序数据流转与建模关系 交易所/行情源 逐笔·快照·行情 采集与清洗 去重·对齐·补全 ClickHouse 存储 MergeTree 系列表 分区 + 排序键 物化视图 K线聚合 指标计算 实时监控看板 行情·快照 策略回测 K线·逐笔 信号与风控 指标·快照 微观结构研究 逐笔·快照 事实数据(逐笔/快照/行情)→ 存储 → 派生数据(K线/指标)→ 业务应用 建模核心:排序键匹配查询路径,物化视图降低重复计算

四、常见误区与复盘建议

误区一:所有数据都用一张宽表。逐笔和K线的粒度、频率、查询模式完全不同,混在一张表会导致分区膨胀、排序键失效,查询性能急剧下降。

误区二:K线用普通 MergeTree 且不处理重复。补数或重算时会产生重复行,回测结果失真。应使用 ReplacingMergeTree 并配合 FINAL 或去重查询。

误区三:指标每次查询实时计算。MACD、RSI 等指标在大量标的和长时间范围下计算成本极高,应通过物化视图预聚合,查询时只做轻量过滤。

复盘建议:建模前先列出三类问题——数据写入频率是多少?最常用的查询过滤条件是什么?数据是否需要更新或去重?答案分别决定分区键、排序键和表引擎。对于逐笔和快照,优先保证写入吞吐和按标的+时间的范围扫描;对于K线和指标,优先保证去重和增量聚合效率。

掌握这五类数据的差异与建模方法后,你就能在 ClickHouse 中为不同金融时序场景选择合适的数据结构与引擎,为后续的写入优化、查询加速和物化视图设计打下坚实基础。