一、量化回测数据全景:数据源分类、粒度与生命周期管理
做量化回测这么多年,我最大的感触就是——数据才是真正的护城河。策略模型再漂亮,喂进去的数据是脏的、碎的、缺的,结果就是纸上富贵。今天咱们就把数据全景这件事彻底聊透。
1.1 数据源分类:三大阵营
量化数据源,说白了就三类:行情数据、财务数据、另类数据。我习惯把它们比作「骨架、血肉和灵魂」。
1.1.1 行情数据
这是最基础的数据。包括价格、成交量、盘口深度等。我遇到过不少团队,上来就搞高频策略,结果连日线数据都没清洗干净。嗯,这里要注意:行情数据是回测的基石,地基不稳,楼塌只是时间问题。
- Level-1 行情:每秒快照,适合日线、分钟级策略
- Level-2 行情:逐笔委托、逐笔成交,适合 Tick 级策略
- 衍生行情:VWAP、TWAP、波动率等计算指标
1.1.2 财务数据
财务数据是基本面策略的命根子。包括三大报表、财务指标、分红送转等。我曾经踩过一个坑——财务数据的「发布时点」和「数据时点」是两码事。你用 2024 年年报的数据去回测 2024 年 3 月的交易,那就是未来函数,妥妥的过拟合。
| 数据类型 | 更新频率 | 常见问题 |
|---|---|---|
| 资产负债表 | 季度 | 数据修正、重述 |
| 利润表 | 季度 | 季节性调整 |
| 现金流量表 | 季度 | 间接法 vs 直接法 |
| 财务指标 | 日/周 | 计算口径差异 |
1.1.3 另类数据
这是近年最火的方向。舆情数据、卫星图像、供应链数据、信用卡消费数据……说白了,就是别人看不到的信息差。我有个朋友做农产品期货,靠卫星图像监测大豆种植面积,年化收益比传统策略高出 15%。但另类数据的坑也最多——数据质量参差不齐,清洗成本极高。
1.2 数据粒度:从 Tick 到日线
数据粒度,说白了就是「你拿什么尺子去量市场」。尺子越细,看得越清楚,但存储成本也越高。我一般把粒度分为三个层级:
1.2.1 Tick 级数据
这是最细的粒度。每笔成交、每笔委托都记录。A 股市场每天大约产生 5000 万笔 Tick 数据,一年下来就是 120 亿条。存储方案我推荐用 ClickHouse 或 InfluxDB,列式存储 + 时间分区,查询效率能提升 10 倍。
-- Tick 数据表设计示例
CREATE TABLE tick_data (
symbol String,
timestamp DateTime64(3),
price Float64,
volume UInt64,
side Enum8('buy', 'sell'),
trade_id UInt64
) ENGINE = MergeTree()
PARTITION BY toYYYYMM(timestamp)
ORDER BY (symbol, timestamp);
1.2.2 分钟级数据
这是量化策略最常用的粒度。1 分钟、5 分钟、30 分钟 K 线。我建议不要只存 OHLCV,还要存成交量加权均价(VWAP)和波动率。为什么?因为很多策略需要这些衍生指标,实时计算太慢,预计算好再存,查询时直接取。
1.2.3 日线数据
日线是「压舱石」。虽然粒度粗,但数据量小、查询快。我习惯把日线数据放在 PostgreSQL 或 MySQL 里,配合索引,查询毫秒级响应。注意:日线数据要做复权处理,前复权和后复权要分开存储,否则回测结果会失真。
1.3 数据生命周期管理
数据不是存进去就完事了。它有自己的生命周期:采集 → 清洗 → 存储 → 归档 → 销毁。我见过最惨的案例——某团队存了 10 年 Tick 数据,结果 80% 都是脏数据,清洗成本比重新买还贵。
1.3.1 数据分层存储
我建议把数据分为三层:
- 热数据(近 3 个月):SSD 存储,高频访问
- 温数据(3 个月 - 2 年):HDD 存储,低频访问
- 冷数据(2 年以上):对象存储(如 S3),归档备份
这样做的好处是——存储成本降低 60% 以上,而且不影响查询性能。
1.3.2 数据质量监控
数据质量是回测的生命线。我写过一个自动化监控脚本,每天检查:
- 数据完整性:有没有缺失的交易日?
- 数据一致性:价格有没有跳空?成交量有没有异常?
- 数据时效性:财务数据是否在发布后 24 小时内入库?
1.3.3 数据版本管理
数据是会变的。财务数据会修正,行情数据会补录。我建议每次数据变更都生成一个新版本,并记录变更原因和时间。这样回测时可以指定数据版本,保证结果可复现。
-- 数据版本表示例
CREATE TABLE data_versions (
version_id UInt64,
data_type String,
effective_date Date,
change_reason String,
created_at DateTime DEFAULT now()
) ENGINE = MergeTree()
ORDER BY (data_type, effective_date);
知识体系全景图
下面这张图,是我梳理的量化回测数据全景架构。你可以把它当作「数据地图」,做存储设计时随时对照。
这张图把数据源、数据粒度和生命周期管理串在了一起。你想想看,做存储架构设计时,是不是得先想清楚这三个维度?数据源决定了你存什么,数据粒度决定了你存多细,生命周期管理决定了你存多久。三者缺一不可。