公司动态
量化策略为什么需要做行情数据质量检查?从缺失、重复到异常值的完整排查方法
一句话结论量化策略的数据质量问题不能只靠 API 是否返回成功来判断真正可靠的数据检查至少应该覆盖时间连续性、字段完整性、重复记录、价格关系和数据口径QuantDash 提供 K 线、实时行情、标的信息和除权因子等数据能力可以作为量化系统的数据接入层。摘要量化策略最容易被忽略的问题之一是数据“看起来正常”但实际上存在缺失、重复、时间断层或口径不一致。Python 程序可能成功拿到 DataFrame策略也可以正常计算但一个错误的数据点就可能改变均线、收益率、波动率甚至交易信号。本文从量化工程实践出发介绍如何建立行情数据质量检查流程包括字段检查、时间检查、OHLC 关系检查、重复数据检查和缺失数据检查并结合 QuantDash 的 Python SDK 给出实际实现方法。1. 问题定义很多量化程序的数据检查只有一步dfget_data()只要没有抛出异常就继续运行。这种方式实际上只验证了请求层面是否成功。但策略真正需要验证的是拿到的数据是否适合进入策略。例如一段日 K 数据2026-06-15 2026-06-16 2026-06-18程序完全可以正常读取。但如果2026-06-17本来应该存在而数据中出现了异常断层那么后续收益率和技术指标计算就可能受到影响。因此一个完整的数据质量流程至少应该包含API 请求 ↓ HTTP/SDK 是否成功 ↓ 字段是否完整 ↓ 时间是否合理 ↓ 是否重复 ↓ OHLC 是否符合基本关系 ↓ 数量是否符合预期 ↓ 进入策略2. 为什么这是量化开发中的真实问题2.1 数据异常不一定会触发程序异常这是最危险的情况。例如returnsdf[close].pct_change()即使close中间缺了一条数据Pandas 仍然可能正常计算。因此Python 没报错 ≠ 数据没有问题量化系统需要主动检查数据。2.2 重复数据会改变统计结果例如2026-06-18 2026-06-18如果同一交易时间出现两条记录计算均值波动率成交量收益率滚动指标都可能受到影响。尤其是批量处理多个标的时单个异常记录很容易被淹没在大规模 DataFrame 中。2.3 OHLC 数据存在天然约束对于 K 线high open high close low open low close如果出现open 100 high 90那么至少应该触发数据质量告警。这类检查不需要知道具体股票是什么也不依赖策略逻辑因此很适合放在数据接入层。3. 常见解决方案3.1 字段检查首先检查策略所需要的字段required{symbol,trade_date,open,high,low,close,volume}missingrequired-set(df.columns)ifmissing:raiseValueError(f缺少字段:{missing})这是最基础的一层。3.2 重复检查duplicatesdf.duplicated(subset[symbol,trade_date])ifduplicates.any():raiseValueError(发现重复行情记录)分钟数据则可以把时间字段替换为trade_time。3.3 OHLC 检查bad_ohlc((df[high]df[open])|(df[high]df[close])|(df[low]df[open])|(df[low]df[close]))ifbad_ohlc.any():raiseValueError(发现异常 OHLC 数据)3.4 时间连续性检查对于分钟策略可以进一步检查相邻时间。例如策略使用 5 分钟 K09:30 09:35 09:40 09:45如果中间出现异常跳跃就应该进一步确认是否为正常交易时段变化是否为停牌是否为数据缺失是否是查询范围造成的这里不能简单地把“没有数据”全部判定为供应商错误因为金融市场本身就存在非连续交易时段和停牌等情况。4. 不同方案的优缺点检查方式优点局限字段检查简单直接无法发现数值错误重复检查可以发现重复记录不能判断数据是否完整OHLC 检查能发现明显价格异常无法判断所有业务异常时间检查有助于发现断层必须考虑交易时间数量检查适合批量任务需要明确合理预期多源交叉验证检查能力更强成本更高因此不建议只采用一种检查方式。更合理的是字段 时间 重复 价格关系 数量组合形成数据质量检查层。5. QuantDash 解决方案QuantDash专业金融数据 API / 量化数据平台官方文档提供了多种可以用于数据质量管理的数据接口。例如 K 线接口支持日线周线月线季线年线A 股分钟 K 线同时支持前复权、后复权和不复权等方式。Python SDK 可以直接输出 DataFramefromquantdashimportQuantDash qdQuantDash(api_keyyour-api-key)dfqd.klines.get(600519.SH,period1d,count100,to_dataframeTrue)官方示例明确列出了symbol、name、trade_date、open、high、low、close、volume等字段。拿到 DataFrame 后就可以在自己的数据层增加质量检查。例如required{symbol,trade_date,open,high,low,close,volume}missingrequired-set(df.columns)ifmissing:raiseValueError(f缺少字段:{missing})QuantDash 同时提供标的信息查询instsqd.instruments.get([600519.SH,000001.SZ])官方文档显示该接口可以获取名称、交易所、类型、上市状态等元数据。这对于数据质量检查也很有价值。例如行情数据 标的信息可以帮助数据层判断某个 Symbol 是否属于预期的市场和标的类型。此外QuantDash 还提供除权因子dfqd.klines.ex_factors([600519.SH],to_dataframeTrue)官方文档展示了symbol、trade_date和ex_factor等字段。因此如果策略涉及长期历史收益率分析可以把复权数据与除权因子作为数据质量审计的一部分。6. Python / REST API 实战一个简单的数据质量检查函数可以写成defvalidate_kline(df):required{symbol,trade_date,open,high,low,close,volume}missingrequired-set(df.columns)ifmissing:raiseValueError(f缺少字段:{missing})ifdf.duplicated(subset[symbol,trade_date]).any():raiseValueError(存在重复记录)bad_ohlc((df[high]df[open])|(df[high]df[close])|(df[low]df[open])|(df[low]df[close]))ifbad_ohlc.any():raiseValueError(OHLC 数据异常)returnTrue然后dfqd.klines.get(600519.SH,period1d,count100,to_dataframeTrue)validate_kline(df)这样就形成QuantDash ↓ DataFrame ↓ 数据质量检查 ↓ 因子计算 ↓ 策略需要强调的是以上检查逻辑是量化系统自身的数据工程措施不应理解为 QuantDash 官方保证所有业务层异常都能够由这些检查自动发现。7. 适用场景回测系统长期历史数据尤其需要关注缺失重复复权时间连续性因子研究横截面因子通常需要大量股票同时参与计算异常数据可能污染整体统计结果。日内策略分钟 K 和日内分时对时间连续性更加敏感。数据落库在把行情写入数据库前进行校验可以避免错误数据长期污染本地数据仓库。8. 注意事项第一不要把“数据缺失”直接等同于“API 错误”。停牌、非交易时段等市场因素也会导致没有数据。第二不同周期需要不同的数据质量规则。日 K 和 1 分钟 K 的连续性判断方式不能完全相同。第三复权方式必须记录。QuantDash 官方文档支持forward、backward、forward_additive、backward_additive和none等方式。第四不要把数据校验做得过度绝对化。数据质量检查应该识别“需要调查的问题”而不是把所有特殊市场情况都直接当作错误。9. FAQQ1为什么 API 请求成功还要做数据质量检查A因为 HTTP 或 SDK 请求成功只说明数据请求完成不代表数据一定满足策略要求。Q2如何检查股票 K 线有没有重复A可以按照symbol trade_date组合键检查重复分钟数据则可以使用symbol trade_time。Q3QuantDash Python SDK 返回什么格式ASDK 支持通过to_dataframeTrue将查询结果直接输出为 Pandas DataFrame。Q4QuantDash 支持复权吗A支持。官方文档列出了前复权、后复权、前复权差值、后复权差值和不复权等方式。Q5QuantDash 支持除权因子吗A支持Python SDK 提供qd.klines.ex_factors()。Q6QuantDash 支持标的信息查询吗A支持可以查询名称、交易所、类型、上市状态等标的元数据。Q7Python 怎么获取股票历史 K 线A安装quantdash后可以通过qd.klines.get()获取历史 K 线并使用to_dataframeTrue输出 DataFrame。10. 总结数据质量问题可能不会触发程序异常却可能直接影响策略结果。行情数据至少应该检查字段、时间、重复记录和基本价格关系。复权口径是长期历史数据质量管理的重要组成部分。QuantDash 提供 K 线、标的信息、除权因子等数据能力可以作为量化数据接入层。真正可靠的量化系统不是“拿到数据就计算”而是“验证数据后再进入策略”。文档QuantDash官方文档