数据源管理:常见数据源类型与接入规范

做因子库这些年,我最大的感触就是——数据源是根。根烂了,后面所有模型、回测、实盘全是白搭。今天咱们就聊聊数据源管理这件事,我把自己踩过的坑、总结的经验都摊开来讲。

一、常见数据源类型

量化投资的数据源,说白了就三大类:行情数据、财务数据、另类数据。每一类都有自己的脾气。

1. 行情数据

这是最基础的数据,也是我最早接触的。行情数据又分几个层级:

  • Tick级数据:每笔成交的逐笔数据。我在做高频策略时,发现不同交易所的Tick时间戳精度不一样,有的到毫秒,有的到微秒。嗯,这里要注意,合并时一定要对齐。
  • 分钟级数据:1分钟、5分钟、30分钟K线。我个人习惯用前复权,但回测时一定要区分前复权和后复权,不然会出大问题。
  • 日线数据:最常用的。但有个坑——不同数据商的日线开盘价定义不同,有的用集合竞价第一笔,有的用9:30第一笔。我曾经因为这个,回测结果差了3个点。

重要提醒:行情数据的时间戳必须统一到同一时区。国内用北京时间,港股用香港时间,美股用美东时间。别问我为什么强调这个——我见过有人把美股时间当北京时间用,结果策略在半夜开仓。

2. 财务数据

财务数据是基本面因子的命根子。常见的有:

  • 三大报表:资产负债表、利润表、现金流量表
  • 财务指标:ROE、ROA、毛利率、净利率等
  • 预测数据:分析师一致预期

财务数据有个大问题——发布时间滞后。A股年报要求在次年4月底前披露,但很多公司拖到最后一天。我建议做因子时,一定要用「实际披露日期」对齐,而不是用「报告期」。你想想看,如果你用Q3的财报数据做10月的因子,但公司11月才披露,那你的因子就是未来函数。

避坑指南:我曾经用Wind的财务数据做因子,没注意「数据更新日期」字段,结果用了未来数据回测,年化收益做到30%,实盘直接亏成狗。从那以后,我每条财务数据都强制检查「披露日期 ≤ 因子计算日期」。

3. 另类数据

另类数据是近年来的热点。我接触过的有:

  • 舆情数据:新闻、社交媒体、股吧评论
  • 供应链数据:上下游关系、物流数据
  • 卫星数据:停车场车流量、农田面积
  • 电商数据:销量、价格、评价

另类数据最大的挑战是结构化。原始数据往往是文本、图片、视频,需要做NLP、CV处理。我建议先做小样本验证,确认数据有预测能力,再投入资源做全量处理。别一上来就搞全量,成本太高。

二、数据源接入规范

数据源接入这件事,我踩过太多坑了。后来总结了一套规范,分享给你。

1. 接入流程

我个人习惯分四步走:

  1. 数据调研:搞清楚数据源的结构、更新频率、历史长度
  2. 技术对接:写接入代码,做格式转换
  3. 质量验证:跑一遍质量检查脚本
  4. 正式上线:接入生产环境,做监控

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.0
  • update_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一次所有数据源的状态,看看有没有需要降级或退役的。别等到数据出问题了才去管,那时候已经晚了。

知识体系总览

下面这张图,是我对数据源管理的整体理解。你可以把它当作一个检查清单,每次接入新数据源时对照着看。

数据源管理知识体系 数据源管理 常见数据源类型 行情数据(Tick/分钟/日线) 财务数据(报表/指标/预期) 另类数据(舆情/供应链/卫星) 数据源接入规范 接入流程(调研→对接→验证→上线) 命名规范(表名/字段名统一) 版本管理(版本号+更新时间) 数据源质量评估 完整性检查(无缺失/无重复) 准确性检查(值域/逻辑校验) 一致性检查(跨数据源对比) 时效性检查(更新延迟监控) 生命周期管理 调研期→测试期→运行期→降级期→退役期

这张图把数据源管理拆成了四个维度。我个人觉得,最容易被忽视的是生命周期管理。很多人只管接入,不管退役,结果数据库里一堆没人用的数据表,占空间还影响查询性能。

我的习惯:每季度清理一次数据源。把连续3个月没有查询记录的数据表标记为「待退役」,通知相关团队确认。确认后归档到冷存储,保留1年后删除。这样数据库一直保持干净。

好了,数据源管理这块就聊到这儿。记住一句话:数据源是因子库的基石,花再多时间管理都不为过。

专注资料整理