11.9 数据质量监控
课前导读
本章目标
学完能解决什么困惑:你将理解为什么数据质量是实盘策略的地基,如何识别缺数据、重复数据、脏数据、时间戳错位和复权口径变化。
适合谁学习:已经理解回测、组合和实盘架构,希望把 A 股策略从“能跑”提升到“可信运行”的学习者。
难度:advanced
用时:约 40 分钟
知识正文
先看一个生活类比。
你准备做一锅汤。
菜谱写得再好,火候控制得再精细,如果食材已经变质,最后也不可能好吃。
量化策略也是这样。
公式、模型、回测框架都很重要。
但它们都建立在一个前提上:输入的数据是真的、完整的、时间正确的、口径一致的。
数据质量监控,就是检查“食材是否新鲜”。
它不是华丽功能。
它是实盘系统能不能活下来的地基。
1. 数据不是天然可信的
很多新手第一次做量化时,会把数据当成事实。
价格就是价格。
成交量就是成交量。
日期就是日期。
但进入实盘后,你会发现数据有很多现实摩擦。
行情可能延迟。
某些股票可能停牌。
复权因子可能更新。
财务数据可能有公告修正。
指数成分股可能调整。
同一只股票在不同数据源里的字段名称和更新时间也可能不同。
如果策略不检查这些差异,就等于闭着眼睛吃食材。
关键心得
量化策略的输出再精确,也不能弥补输入数据的错误。
2. 缺数据:沉默也是信号
缺数据最容易被忽略。
因为它不像异常价格那样刺眼。
一条记录不存在,系统可能只是跳过去。
但跳过去并不代表没有影响。
例如你的策略每天收盘后计算 300 只股票的因子。
其中 20 只股票缺少成交量。
如果系统直接删除这 20 只,股票池就悄悄改变了。
如果缺失集中在某个行业,行业暴露也会改变。
如果缺失刚好发生在持仓股上,风险计算就会偏离现实。
所以缺数据不是“小空格”。
它是需要记录、解释和处理的事件。
常见处理方式包括暂停计算、使用上一条可信数据、标记为不可交易、等待补齐后重算。
哪一种合适,要看策略频率和风险要求。
3. 重复数据:同一个人不能排两次队
重复数据就像同一个人拿着两张号码牌排队。
表面上队伍变长了,实际上信息被重复计算了。
在 A 股行情中,重复时间戳、重复 K 线、重复成交记录,都可能影响指标。
例如一个均线策略计算最近 20 个交易日收盘价。
如果某一天数据重复出现,均线就不再是真正的 20 个交易日。
例如成交量被重复累加,系统可能误以为股票流动性很好。
重复数据的危险在于它看起来很“完整”。
没有空值,也没有明显错误。
但统计结果已经被悄悄扭曲。
4. 脏数据:看起来像数字,实际上不合理
脏数据指格式上能被系统读取,但经济含义不合理的数据。
例如价格为负数。
例如最高价低于最低价。
例如成交量为负。
例如开盘价、收盘价远离合理区间。
例如某只非停牌股票全天没有任何价格变化,却又显示巨额成交。
这些数据如果进入策略,会制造虚假的信号。
新手容易把脏数据归因于“偶然”。
但实盘系统不能靠运气。
它必须用规则挡住明显不合理的数据。
可以先建立一些基础校验。
价格必须大于零。
最高价不能低于最低价。
成交量不能为负。
交易日必须属于 A 股交易日历。
持仓股票的数据必须优先完整。
5. 时间戳错位:迟到的数据会改变因果关系
时间戳是数据的时间身份证。
错位就像把昨天的天气预报贴到今天门口。
在回测和实盘中,时间错位会造成严重问题。
例如你在 10:00 的信号里使用了 10:05 才能知道的数据。
这就是未来信息泄漏。
例如行情已经更新到 14:30,但账户持仓仍停留在 14:20。
那么仓位计算就会错位。
例如日线数据按自然日存储,但交易日历没有处理节假日。
模型可能会误以为中间少了行情。
时间戳监控要关注数据产生时间、接收时间、处理时间和用于决策的时间。
这四个时间不一定相同。
graph LR
A[数据产生时间] --> B[数据接收时间]
B --> C[数据处理时间]
C --> D[策略决策时间]如果你不能说清楚策略在某一刻“知道了什么”,就很难判断策略表现是否真实。
6. 复权口径变化:价格尺子变了
A 股股票会发生分红、送转、配股等事件。
为了让历史价格更可比,常常会使用复权价格。
复权可以简单理解为把价格尺子调整到同一口径。
但问题在于,不同数据源、不同时间点、不同设置下,复权结果可能变化。
如果今天的前复权数据和昨天下载的前复权数据不一致,回测结果就可能变化。
如果实盘信号使用不复权价格,而回测使用前复权价格,策略就会出现口径不一致。
复权口径变化最容易影响均线、涨跌幅、波动率等基于历史价格的指标。
因此数据质量监控要记录数据口径。
是前复权、后复权,还是不复权。
复权因子更新时间是什么。
口径变化后是否需要重算历史指标。
7. A 股案例:复权口径不一致导致错误信号
假设你有一个基于 60 日均线的 A 股趋势策略。
回测时使用前复权收盘价。
实盘部署时,某个数据流程误用了不复权收盘价。
某只股票刚发生分红除权。
不复权价格出现明显跳变。
策略误以为股价跌破均线,于是生成卖出信号。
但如果使用前复权口径,这个信号并不存在。
最终你卖出了本不该卖出的持仓。
这个亏损不是策略逻辑错。
也不是市场突然变坏。
它来自数据口径不一致。
如果系统有复权口径监控,就应该在信号生成前拦截。
graph TD
A[读取价格数据] --> B[检查复权口径]
B --> C{口径一致吗}
C -->|一致| D[继续计算信号]
C -->|不一致| E[停止计算并记录异常]8. 数据质量监控的五道门
你可以把数据进入策略前的检查理解为五道门。
第一道门是完整性。
该有的数据有没有。
第二道门是唯一性。
同一时间、同一股票的数据有没有重复。
第三道门是合理性。
价格、成交量、涨跌幅是否符合基本常识。
第四道门是时效性。
数据是否足够新,是否与决策时间匹配。
第五道门是一致性。
不同数据源、不同口径、不同模块之间是否对齐。
这五道门不能保证永远没有错误。
但可以挡住大多数低级事故。
9. 数据异常后的处理原则
发现异常后,不要急着“自动修好”。
有些异常可以自动处理。
例如少量非持仓股票缺失,可以标记并跳过。
有些异常必须暂停。
例如持仓股价格缺失、账户数据与订单状态冲突、复权口径不一致。
有些异常需要人工复核。
例如大面积数据源异常、多个关键字段同时变化。
处理原则可以总结为三句话。
能降级,不硬跑。
能标记,不假装正常。
能复核,不凭感觉覆盖。
风险提示
不要为了让策略“继续运行”而随手填补关键数据。错误填补可能比缺失本身更危险。
10. 数据质量日志:复盘时的证据
每一次数据异常都应该留下日志。
日志至少记录异常类型、发生时间、影响范围、处理动作和恢复时间。
如果没有日志,晚上复盘只能靠记忆。
而盘中压力下的记忆往往不可靠。
数据质量日志还能帮助你发现长期问题。
例如某个数据源经常在开盘前后延迟。
例如某类股票的字段更容易缺失。
例如复权因子更新集中在某些日期。
这些规律可以反过来优化系统。
11. 一段安全校验伪代码
下面只是数据质量检查思路,不是实盘接口实现。
对于 每只进入股票池的股票:
检查 是否存在最新交易日价格
检查 时间戳 是否等于预期交易日
检查 开盘价 最高价 最低价 收盘价 是否符合基本关系
检查 成交量 是否为非负数
检查 复权口径 是否与策略配置一致
如果 任一持仓股关键数据异常:
暂停相关信号
记录异常
请求复核这段伪代码的意义,是在策略相信数据之前,先让数据证明自己可信。
交互实验室
本节的交互产物是一张数据质量检查清单。
请在实盘前、盘中监控和盘后复盘三个阶段使用。
| 检查类别 | 具体问题 | 通过标准 | 异常处理 |
|---|---|---|---|
| 完整性 | 股票、日期、价格、成交量是否缺失 | 关键字段齐全 | 标记缺失,持仓股异常需暂停相关信号 |
| 唯一性 | 同一股票同一时间是否重复 | 无重复记录 | 去重前先记录来源和影响范围 |
| 合理性 | 价格与成交量是否符合常识 | 无负数、价格关系正确 | 拦截脏数据,不直接进入信号计算 |
| 时效性 | 数据是否足够新 | 与策略决策时间匹配 | 延迟超限时停止使用旧数据 |
| 一致性 | 复权、交易日历、数据源是否对齐 | 口径与策略配置一致 | 口径变化需重算或暂停 |
| 影响范围 | 异常涉及哪些股票 | 能区分持仓股和非持仓股 | 持仓股优先处理 |
| 记录留痕 | 是否记录异常与恢复 | 日志可追溯 | 盘后纳入复盘 |
练习步骤如下。
选择一个你熟悉的策略指标。
写出它依赖的原始字段。
对每个字段问一句:如果它错了,策略会怎么错?
把最危险的三个字段放入重点监控。
为每个字段写出异常判断标准。
写出异常后的处理动作。
判断这个动作是继续运行、降级运行,还是暂停等待复核。
示例填写:
| 字段 | 异常样子 | 可能后果 | 处理动作 |
|---|---|---|---|
| 收盘价 | 缺失或口径不一致 | 均线信号错误 | 暂停该股票信号并记录 |
| 成交量 | 重复累加 | 误判流动性 | 拦截并复核数据源 |
| 交易日 | 节假日错位 | 指标窗口错误 | 对齐交易日历后重算 |
练习提醒
数据质量检查不是技术洁癖,而是在保护你的每一次投资决策不被错误输入污染。
核心复盘
知识清单:
- [ ] 我能用“食材是否新鲜”解释数据质量监控的重要性。
- [ ] 我知道缺数据、重复数据和脏数据会以不同方式扭曲策略。
- [ ] 我理解时间戳错位会破坏决策因果关系。
- [ ] 我知道复权口径变化会影响 A 股历史价格指标。
- [ ] 我能说出完整性、唯一性、合理性、时效性、一致性五道检查门。
- [ ] 我能为自己的策略建立数据质量检查清单。
金句总结
策略不是直接和市场对话,而是通过数据认识市场;数据失真,决策就会失真。