第二章:量化数据仓库架构设计

聊到量化数据仓库的架构设计,我脑子里第一个蹦出来的词就是「分层」。

为什么?因为不分层的数据仓库,我见过太多惨案了。数据一多,逻辑一乱,查个指标要跑半天,改个字段要改一堆脚本。说白了,分层就是为了让数据「各归其位」,让每一层只干自己该干的事。

2.1 分层架构设计

量化数据仓库的分层,我习惯分成四层:ODS、DWD、DWS、ADS。每一层都有自己的使命。

核心原则:每一层只做一件事,做好一件事。

2.1.1 ODS 层(操作数据存储层)

ODS 层,说白了就是「数据原样落地」的地方。交易所的行情数据、订单数据、成交数据,进来是什么样,存进去就是什么样。

我在项目中遇到过一个问题:有人把 ODS 层当成了「数据清洗层」,直接在 ODS 里做过滤、去重。结果呢?数据回溯时发现原始数据丢了,根本找不回来。嗯,这是个坑。

  • 数据来源:CTP、XTP、LTS 等柜台系统
  • 存储方式:按日期分区,保留原始格式
  • 生命周期:建议保留 3-6 个月,太久了成本高

我曾经踩过的坑:ODS 层不要做任何数据清洗!保留原始数据是底线。你永远不知道哪天需要回溯原始数据来排查问题。

2.1.2 DWD 层(明细数据层)

DWD 层,我称之为「清洗后的明细」。这一层做的事情很纯粹:数据清洗、格式统一、字段标准化。

举个例子,不同交易所的订单状态码不一样。上期所用 0 表示「已报」,中金所用 1 表示「已报」。在 DWD 层,我会统一映射成「ORDER_STATUS_SUBMITTED」这样的枚举值。

  • 清洗规则:去重、空值处理、异常值过滤
  • 字段标准化:统一时间格式、货币单位、状态码
  • 数据粒度:保持与 ODS 一致,不聚合

2.1.3 DWS 层(汇总数据层)

DWS 层,说白了就是「预计算」。量化分析里,很多指标是高频使用的,比如每分钟的成交量、每小时的波动率。每次都从头算一遍?太慢了。

我习惯在 DWS 层按时间维度做预聚合。比如按分钟、小时、天来汇总。这样查询时直接拿结果,不用再跑全量数据。

  • 常见维度:时间(分钟/小时/天)、品种、合约
  • 常见指标:成交量、成交额、均价、波动率
  • 存储策略:按时间分区,定期合并

2.1.4 ADS 层(应用数据层)

ADS 层,就是给业务用的。风控系统、策略回测、报表展示,都从这一层拿数据。

这一层的数据,我建议按业务场景来组织。比如风控需要实时监控,那就建一张「风控指标表」;策略回测需要历史数据,那就建一张「回测数据宽表」。

  • 数据来源:DWS 层 + 部分 DWD 层
  • 存储方式:宽表为主,减少关联查询
  • 更新频率:按业务需求,分钟级或小时级

2.2 数据流向设计

数据流向,说白了就是「数据怎么从源头流到应用」。我画了一张图,你看一眼就明白了。

量化数据仓库数据流向图 数据源 CTP/XTP/LTS ODS 层 原始数据落地 DWD 层 清洗标准化 DWS 层 预聚合汇总 ADS 层 业务应用 风控系统 | 策略回测 | 报表展示 ETL 清洗 聚合 汇总 宽表

数据流向其实很简单:从左到右,从上到下。数据源 -> ODS -> DWD -> DWS -> ADS -> 应用。每一层之间通过 ETL 任务连接。

我的个人习惯:每一层的数据都保留一份「血缘关系」记录。这样出了问题,能快速定位到是哪一层、哪个任务出的问题。

2.3 技术选型:OLAP vs OLTP

这个问题,我经常被问到。量化数据仓库,到底用 OLAP 还是 OLTP?

我的回答是:看场景。

特性 OLTP OLAP
典型场景 订单写入、账户更新 历史分析、聚合查询
数据模型 行式存储 列式存储
查询特点 小范围、频繁更新 大范围、批量扫描
典型产品 MySQL、PostgreSQL ClickHouse、Doris

说白了,OLTP 适合「写多读少」的场景,比如实时订单入库。OLAP 适合「读多写少」的场景,比如历史行情分析。

我在项目中,ODS 层会用 OLTP 来承接高频写入,DWD 层以上则用 OLAP 来加速查询。你想想看,如果拿 ClickHouse 去接实时订单流,那写入性能会很难看。

2.4 存储与计算引擎选择

存储和计算引擎的选择,我总结了一个「三看」原则:看数据量、看查询模式、看实时性要求。

2.4.1 存储引擎

  • HDFS:适合海量历史数据存储,成本低。我一般用来存超过一年的原始行情数据。
  • ClickHouse:列式存储,聚合查询极快。DWS 层的预聚合数据,我首选它。
  • Redis:内存数据库,适合实时指标缓存。比如当前持仓、实时盈亏。

2.4.2 计算引擎

  • Spark:适合大规模批处理。我用来做每日的 DWD 层清洗任务。
  • Flink:适合实时流处理。比如实时行情接入、实时风控计算。
  • Doris:适合即席查询。分析师想查什么,直接写 SQL 就行。

我的经验:不要追求「大而全」。量化团队通常不大,选 2-3 个核心组件就够了。我现在的团队,就是 ClickHouse + Spark + Flink 三件套,覆盖了 90% 的场景。

2.5 避坑指南

最后,分享几个我踩过的坑。

我曾经犯过的错:一开始把所有数据都放在 ClickHouse 里,结果发现实时写入性能跟不上。后来才把 ODS 层拆出来用 MySQL 承接写入,ClickHouse 只做查询。嗯,这个教训花了我两周时间。

另一个坑是「过度分层」。有人把数据仓库分了七八层,结果数据流转链路太长,延迟高得离谱。我的建议是:四层就够了,别整太复杂。

好了,这一章的内容就到这里。分层架构、数据流向、技术选型,这三块是量化数据仓库的骨架。骨架搭好了,后面填肉就轻松了。


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