4. 数据库选型与数据存储:时序数据库与关系型数据库的混合使用

做量化交易,数据就是命根子。这话一点都不夸张。

我见过不少团队,策略写得漂漂亮亮,一到实盘就崩在数据层。要么查询太慢,要么存储爆炸,要么数据对不上。说白了,就是数据库没选对。

今天咱们聊聊这个核心问题:时序数据库(InfluxDB / ClickHouse)和关系型数据库(PostgreSQL)怎么搭配着用

4.1 为什么不能只用一种数据库?

你想想看,量化交易的数据其实分两类。

一类是高频行情数据。比如Level-2快照、逐笔成交、Tick级数据。这些数据的特点是:写入量大、时间戳密集、几乎不修改。我曾在项目中一天写入超过200亿条Tick数据,用PostgreSQL直接写崩了——索引重建花了整整6个小时。

另一类是业务与元数据。比如订单记录、持仓信息、策略参数、用户账户。这些数据的特点是:结构复杂、需要事务支持、经常更新。

所以,没有一种数据库能同时完美搞定这两类需求。混合使用才是正解。

核心原则:

  • 时序数据 → 时序数据库(InfluxDB / ClickHouse)
  • 业务数据 → 关系型数据库(PostgreSQL)
  • 两者通过时间戳和ID关联

4.2 时序数据库选型:InfluxDB vs ClickHouse

这两个我都深度用过。说实话,没有绝对的好坏,看场景。

对比维度 InfluxDB ClickHouse
写入性能 极高,单机百万点/秒 极高,批量写入更优
查询灵活性 有限,主要针对时序 强,支持标准SQL
存储压缩比 中等(5-10倍) 优秀(10-20倍)
运维复杂度 简单,开箱即用 中等,需要调优
典型场景 实时监控、短周期分析 历史回测、大规模分析

我个人习惯这样选:

  • 如果只是存Tick数据做实时监控,用InfluxDB。部署简单,查询语法也直观。
  • 如果需要做复杂的回测分析、跨品种关联查询,用ClickHouse。它的SQL支持太香了。

一个小技巧:

我曾经在项目中同时用了两者。InfluxDB负责实时写入和最近7天的热数据查询,ClickHouse负责冷数据归档和历史回测。中间通过一个定时任务做数据同步。效果非常好,写入延迟控制在毫秒级,历史查询也快。

4.3 关系型数据库:PostgreSQL 的定位

PostgreSQL在我这儿的角色很明确:业务核心

订单状态、持仓快照、策略配置、风控规则——这些数据必须保证强一致性。时序数据库做不到这一点。

举个例子:

-- 订单表,需要事务保证
BEGIN;
INSERT INTO orders (order_id, symbol, side, price, volume, status, created_at)
VALUES ('ORD202401010001', 'BTCUSDT', 'BUY', 42000.5, 0.1, 'NEW', NOW());

UPDATE account_balance 
SET frozen_balance = frozen_balance + 4200.05
WHERE user_id = 1001;
COMMIT;

这种场景,PostgreSQL的ACID特性是刚需。我见过有人把订单数据往ClickHouse里塞,结果并发更新时数据乱套了——嗯,那场面挺尴尬的。

4.4 混合架构实战:数据流怎么走?

下面这张图是我在实盘项目中常用的架构。我把它画成了SVG,方便你理解。

混合数据库架构数据流 行情数据源 数据写入层(Go/C++ 写入器) InfluxDB 实时Tick / 热数据 ClickHouse 历史K线 / 回测数据 PostgreSQL 订单 / 持仓 / 风控 统一查询层(API Gateway + 数据聚合服务) 策略引擎 / 风控系统 / 监控面板

这个架构的核心思路是:写入时分流,查询时聚合

  • 行情数据进来后,写入层根据数据类型和时效性,决定写入哪个数据库。
  • 查询层封装了统一接口,上层应用不需要关心数据到底存在哪里。
  • 风控系统主要读PostgreSQL,策略引擎主要读ClickHouse,监控面板主要读InfluxDB。

4.5 避坑指南:我踩过的几个坑

坑一:时序数据库的写入限流

我曾经在InfluxDB上没做写入限流,结果行情爆发时写入量暴增,直接把数据库打挂了。后来加了写入队列和限流机制,才稳住。

坑二:ClickHouse的更新操作

ClickHouse不是为频繁更新设计的。我见过有人用它存订单状态,结果每次更新都要重建分区,性能惨不忍睹。记住:ClickHouse只适合写一次、读多次的场景

坑三:PostgreSQL的时序数据膨胀

有人把Tick数据直接往PostgreSQL里塞,一个月后表体积超过500GB,查询慢到怀疑人生。正确的做法是:PostgreSQL只保留最近几天的热数据,历史数据定期归档到ClickHouse

4.6 数据同步与一致性

混合架构最大的挑战是数据一致性。我常用的方案是:

  • 最终一致性:时序数据允许短暂不一致,通过定时任务补偿。
  • 事务边界清晰:业务数据(订单、持仓)只在PostgreSQL中操作,不跨库事务。
  • 数据校验:每天凌晨跑一次对账任务,确保三个库的数据能对上。

我的经验:

别追求强一致性。在量化交易里,行情数据晚几毫秒完全能接受。但订单状态必须实时准确。所以,分清主次,该松的松,该紧的紧

4.7 总结一下

数据库选型没有银弹。InfluxDB、ClickHouse、PostgreSQL各有各的脾气。

  • InfluxDB:适合实时监控,轻量灵活。
  • ClickHouse:适合历史分析,查询强大。
  • PostgreSQL:适合业务核心,稳如老狗。

混合使用不是炫技,是实战逼出来的选择。你想想看,一个系统里既要处理每秒百万级的Tick写入,又要保证订单数据的强一致性,单一数据库怎么可能扛得住?

嗯,今天就聊到这儿。记住:选对工具,事半功倍


公众号:蓝海资料掘金营,微信deep3321