一、量化回测数据全景:数据源分类、粒度与生命周期管理

做量化回测这么多年,我最大的感触就是——数据才是真正的护城河。策略模型再漂亮,喂进去的数据是脏的、碎的、缺的,结果就是纸上富贵。今天咱们就把数据全景这件事彻底聊透。

1.1 数据源分类:三大阵营

量化数据源,说白了就三类:行情数据、财务数据、另类数据。我习惯把它们比作「骨架、血肉和灵魂」。

1.1.1 行情数据

这是最基础的数据。包括价格、成交量、盘口深度等。我遇到过不少团队,上来就搞高频策略,结果连日线数据都没清洗干净。嗯,这里要注意:行情数据是回测的基石,地基不稳,楼塌只是时间问题

  • Level-1 行情:每秒快照,适合日线、分钟级策略
  • Level-2 行情:逐笔委托、逐笔成交,适合 Tick 级策略
  • 衍生行情:VWAP、TWAP、波动率等计算指标
我的经验:Level-2 数据存储成本是 Level-1 的 10 倍以上。如果你做中低频,别盲目上 Tick 数据,否则存储账单会让你怀疑人生。

1.1.2 财务数据

财务数据是基本面策略的命根子。包括三大报表、财务指标、分红送转等。我曾经踩过一个坑——财务数据的「发布时点」和「数据时点」是两码事。你用 2024 年年报的数据去回测 2024 年 3 月的交易,那就是未来函数,妥妥的过拟合。

数据类型 更新频率 常见问题
资产负债表 季度 数据修正、重述
利润表 季度 季节性调整
现金流量表 季度 间接法 vs 直接法
财务指标 日/周 计算口径差异

1.1.3 另类数据

这是近年最火的方向。舆情数据、卫星图像、供应链数据、信用卡消费数据……说白了,就是别人看不到的信息差。我有个朋友做农产品期货,靠卫星图像监测大豆种植面积,年化收益比传统策略高出 15%。但另类数据的坑也最多——数据质量参差不齐,清洗成本极高。

避坑指南:我曾经花 30 万买过一套舆情数据,结果发现 70% 的新闻都是爬虫重复抓取的。后来我学乖了,先拿一个月样本做质量评估,再签正式合同。

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 里,配合索引,查询毫秒级响应。注意:日线数据要做复权处理,前复权和后复权要分开存储,否则回测结果会失真。

核心原则:数据粒度越细,存储成本越高,但策略精度也越高。我的建议是——按需存储,不要贪多。做日线策略就别存 Tick 数据,浪费钱。

1.3 数据生命周期管理

数据不是存进去就完事了。它有自己的生命周期:采集 → 清洗 → 存储 → 归档 → 销毁。我见过最惨的案例——某团队存了 10 年 Tick 数据,结果 80% 都是脏数据,清洗成本比重新买还贵。

1.3.1 数据分层存储

我建议把数据分为三层:

  • 热数据(近 3 个月):SSD 存储,高频访问
  • 温数据(3 个月 - 2 年):HDD 存储,低频访问
  • 冷数据(2 年以上):对象存储(如 S3),归档备份

这样做的好处是——存储成本降低 60% 以上,而且不影响查询性能。

1.3.2 数据质量监控

数据质量是回测的生命线。我写过一个自动化监控脚本,每天检查:

  1. 数据完整性:有没有缺失的交易日?
  2. 数据一致性:价格有没有跳空?成交量有没有异常?
  3. 数据时效性:财务数据是否在发布后 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);

知识体系全景图

下面这张图,是我梳理的量化回测数据全景架构。你可以把它当作「数据地图」,做存储设计时随时对照。

量化回测数据全景架构 数据源分类 行情数据 财务数据 另类数据 数据粒度 Tick 级 分钟级 日线级 生命周期管理 热数据(SSD) 温数据(HDD) 冷数据(S3) 核心原则:按需存储 · 分层管理 · 质量监控 · 版本追溯 ClickHouse / InfluxDB PostgreSQL / MySQL 对象存储(S3) 推荐存储技术栈

这张图把数据源、数据粒度和生命周期管理串在了一起。你想想看,做存储架构设计时,是不是得先想清楚这三个维度?数据源决定了你存什么,数据粒度决定了你存多细,生命周期管理决定了你存多久。三者缺一不可。

最后说一句:量化回测的数据架构,不是一蹴而就的。我做了 8 年量化,数据架构重构了 3 次。每次重构都带来性能提升和成本下降。所以别怕一开始不完美,关键是要有迭代思维。先把核心数据管好,再逐步优化。

专注资料整理