数据源管理:常见数据源类型与接入规范
做因子库这些年,我最大的感触就是——数据源是根。根烂了,后面所有模型、回测、实盘全是白搭。今天咱们就聊聊数据源管理这件事,我把自己踩过的坑、总结的经验都摊开来讲。
一、常见数据源类型
量化投资的数据源,说白了就三大类:行情数据、财务数据、另类数据。每一类都有自己的脾气。
1. 行情数据
这是最基础的数据,也是我最早接触的。行情数据又分几个层级:
- Tick级数据:每笔成交的逐笔数据。我在做高频策略时,发现不同交易所的Tick时间戳精度不一样,有的到毫秒,有的到微秒。嗯,这里要注意,合并时一定要对齐。
- 分钟级数据:1分钟、5分钟、30分钟K线。我个人习惯用前复权,但回测时一定要区分前复权和后复权,不然会出大问题。
- 日线数据:最常用的。但有个坑——不同数据商的日线开盘价定义不同,有的用集合竞价第一笔,有的用9:30第一笔。我曾经因为这个,回测结果差了3个点。
重要提醒:行情数据的时间戳必须统一到同一时区。国内用北京时间,港股用香港时间,美股用美东时间。别问我为什么强调这个——我见过有人把美股时间当北京时间用,结果策略在半夜开仓。
2. 财务数据
财务数据是基本面因子的命根子。常见的有:
- 三大报表:资产负债表、利润表、现金流量表
- 财务指标:ROE、ROA、毛利率、净利率等
- 预测数据:分析师一致预期
财务数据有个大问题——发布时间滞后。A股年报要求在次年4月底前披露,但很多公司拖到最后一天。我建议做因子时,一定要用「实际披露日期」对齐,而不是用「报告期」。你想想看,如果你用Q3的财报数据做10月的因子,但公司11月才披露,那你的因子就是未来函数。
避坑指南:我曾经用Wind的财务数据做因子,没注意「数据更新日期」字段,结果用了未来数据回测,年化收益做到30%,实盘直接亏成狗。从那以后,我每条财务数据都强制检查「披露日期 ≤ 因子计算日期」。
3. 另类数据
另类数据是近年来的热点。我接触过的有:
- 舆情数据:新闻、社交媒体、股吧评论
- 供应链数据:上下游关系、物流数据
- 卫星数据:停车场车流量、农田面积
- 电商数据:销量、价格、评价
另类数据最大的挑战是结构化。原始数据往往是文本、图片、视频,需要做NLP、CV处理。我建议先做小样本验证,确认数据有预测能力,再投入资源做全量处理。别一上来就搞全量,成本太高。
二、数据源接入规范
数据源接入这件事,我踩过太多坑了。后来总结了一套规范,分享给你。
1. 接入流程
我个人习惯分四步走:
- 数据调研:搞清楚数据源的结构、更新频率、历史长度
- 技术对接:写接入代码,做格式转换
- 质量验证:跑一遍质量检查脚本
- 正式上线:接入生产环境,做监控
2. 命名规范
数据表命名一定要统一。我见过最乱的项目,同一个字段在三个表里叫三个名字。我的规范是:
-- 表名:{数据源}_{数据类型}_{频率}
-- 例如:
wind_stock_daily -- Wind日线行情
tushare_fund_quarter -- Tushare基金季报
jq_factor_weekly -- 聚宽周度因子
-- 字段名:统一用snake_case
-- 例如:
trade_date -- 交易日期
open_price -- 开盘价
close_price -- 收盘价
volume -- 成交量
3. 版本管理
数据源会更新,字段会变化。我建议每个数据表都加两个字段:
data_version:数据版本号,比如v1.0、v2.0update_time:数据更新时间
这样万一数据出问题,可以快速回滚到旧版本。
三、数据源质量评估
数据质量评估,我有一套标准流程。每次接入新数据源,我都会跑一遍。
1. 完整性检查
检查数据有没有缺失。比如日线数据,每个交易日都应该有一条记录。我常用的SQL:
-- 检查交易日是否有缺失
SELECT
COUNT(*) as total_days,
COUNT(DISTINCT trade_date) as actual_days,
COUNT(*) - COUNT(DISTINCT trade_date) as duplicate_days
FROM stock_daily
WHERE stock_code = '000001.SZ'
AND trade_date BETWEEN '2024-01-01' AND '2024-12-31';
2. 准确性检查
检查数据值是否合理。比如:
- 开盘价、最高价、最低价、收盘价的关系:最高价 ≥ 最低价,收盘价在区间内
- 成交量不能为负数
- 复权因子不能为0
小技巧:我写了一个自动化脚本,每天凌晨跑一遍质量检查。发现问题自动发邮件报警。这样早上到公司,先看报警邮件,再决定要不要修复数据。
3. 一致性检查
不同数据源之间的数据应该一致。比如Wind和Tushare的同一只股票同一日期的收盘价,差异应该在0.1%以内。如果差异太大,说明某个数据源有问题。
4. 时效性检查
数据更新是否及时。比如日线数据,应该在收盘后30分钟内更新完毕。如果延迟超过1小时,就要报警。
四、数据源生命周期管理
数据源不是一成不变的。它有自己的生命周期:
| 阶段 | 状态 | 说明 |
|---|---|---|
| 调研期 | PENDING | 正在评估是否接入 |
| 测试期 | TESTING | 已接入,正在做质量验证 |
| 运行期 | ACTIVE | 正式使用,持续监控 |
| 降级期 | DEGRADED | 质量下降,需要修复 |
| 退役期 | RETIRED | 不再使用,数据归档 |
每个阶段都有对应的操作。比如降级期,我会自动切换到备用数据源,同时通知数据团队修复。退役期,我会把数据归档到冷存储,保留至少3年。
核心原则:数据源管理不是一次性工作,而是持续的过程。我每个月都会review一次所有数据源的状态,看看有没有需要降级或退役的。别等到数据出问题了才去管,那时候已经晚了。
知识体系总览
下面这张图,是我对数据源管理的整体理解。你可以把它当作一个检查清单,每次接入新数据源时对照着看。
这张图把数据源管理拆成了四个维度。我个人觉得,最容易被忽视的是生命周期管理。很多人只管接入,不管退役,结果数据库里一堆没人用的数据表,占空间还影响查询性能。
我的习惯:每季度清理一次数据源。把连续3个月没有查询记录的数据表标记为「待退役」,通知相关团队确认。确认后归档到冷存储,保留1年后删除。这样数据库一直保持干净。
好了,数据源管理这块就聊到这儿。记住一句话:数据源是因子库的基石,花再多时间管理都不为过。