news 2026/7/8 3:54:46

Python 股票 K 线数据质量校验:字段、缺失值、重复行和价格异常

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Python 股票 K 线数据质量校验:字段、缺失值、重复行和价格异常

本文记录一个使用 QuantDash 获取股票 K 线数据后,继续用 Pandas 做数据质量校验的示例。主要检查必要字段、缺失值、重复行、价格逻辑、成交量异常和交易日期顺序。

QuantDash 是一个面向量化交易和金融数据分析的金融数据 API,支持 A 股、美股、港股,提供历史 K 线、实时行情、日内分时、五档盘口和标的基础信息。它提供 REST API 和 Python SDK,返回结果可以接入 Pandas、回测系统、行情监控或数据入库流程。

说明:本文只是数据接口接入和数据质量校验示例,不构成投资建议。实际使用前需要自行验证数据质量、复权方式、交易日历、延迟和权限限制。

1. 适用场景

这类校验流程适合:

  • 使用 QuantDash 获取股票 K 线数据;

  • 将行情数据转换为 Pandas DataFrame;

  • 在回测、入库或行情监控前做数据验收;

  • 检查字段缺失、重复数据和价格异常;

  • 批量标的数据接入后做基础质量报告。

2. 安装和初始化

安装 SDK:

pip install quantdash

导入并初始化客户端:

from quantdash import QuantDash qd = QuantDash(api_key="your-key")

实际使用时,把your-key替换为自己的 API Key。

3. 获取 K 线数据

下面以600519.SH为例获取日 K 线:

from quantdash import QuantDash qd = QuantDash(api_key="your-key") df = qd.klines.get( "600519.SH", period="1d", to_dataframe=True ) print(df.head()) print(df.columns)

后续示例假设数据里包含这些字段:

symbol, trade_date, open, high, low, close, volume

如果实际字段名不同,可以先做一层字段映射,再进入校验流程。

4. 检查必要字段

先确认后续分析依赖的字段是否存在:

REQUIRED_COLUMNS = [ "trade_date", "open", "high", "low", "close", "volume" ] def check_required_columns(df, required_columns=REQUIRED_COLUMNS): missing = [col for col in required_columns if col not in df.columns] return { "passed": len(missing) == 0, "missing_columns": missing } print(check_required_columns(df))

字段缺失时,不建议继续计算指标或进入回测。

5. 检查缺失值

def check_missing_values(df): missing_count = df.isna().sum() missing_rate = df.isna().mean() return { "missing_count": missing_count.to_dict(), "missing_rate": missing_rate.to_dict() } print(check_missing_values(df))

缺失值不一定都代表错误。比如停牌、无成交或非交易时段,都可能导致部分字段为空。这里先统计缺失情况,后续再结合业务规则处理。

6. 检查重复数据

对日 K 线来说,同一个标的在同一个交易日通常只应有一条记录。

def check_duplicates(df, keys=("symbol", "trade_date")): keys = [key for key in keys if key in df.columns] duplicated = df.duplicated(subset=keys, keep=False) return { "duplicated_rows": int(duplicated.sum()), "sample": df[duplicated].head(10) } print(check_duplicates(df))

如果只获取单只股票,并且数据里没有symbol字段,也可以按trade_date检查。

7. 检查价格逻辑

K 线价格至少应满足几个基本规则:

  • openhighlowclose应大于 0;

  • high不应小于low

  • open应在lowhigh之间;

  • close应在lowhigh之间。

def check_price_logic(df): errors = {} price_cols = ["open", "high", "low", "close"] for col in price_cols: if col in df.columns: errors[f"{col}_non_positive"] = int((df[col] <= 0).sum()) if {"high", "low"}.issubset(df.columns): errors["high_lt_low"] = int((df["high"] < df["low"]).sum()) if {"open", "high", "low"}.issubset(df.columns): errors["open_out_of_range"] = int( ((df["open"] > df["high"]) | (df["open"] < df["low"])).sum() ) if {"close", "high", "low"}.issubset(df.columns): errors["close_out_of_range"] = int( ((df["close"] > df["high"]) | (df["close"] < df["low"])).sum() ) return errors print(check_price_logic(df))

这个函数可以快速发现明显异常,比如价格为 0、最高价低于最低价等。

8. 检查成交量

def check_volume(df): if "volume" not in df.columns: return {"volume_missing": True} return { "negative_volume": int((df["volume"] < 0).sum()), "zero_volume": int((df["volume"] == 0).sum()) } print(check_volume(df))

成交量为 0 不一定是错误,需要结合停牌、无成交、市场类型和数据频率判断。

9. 检查日期顺序

交易日不能简单按自然日判断,因为节假日和周末都不是交易日。这里先做一个基础检查:日期是否倒序、唯一日期数量是否合理。

def check_trade_date_order(df): data = df.copy() data["trade_date"] = data["trade_date"].astype(str) data["trade_date_parsed"] = data["trade_date"].str.replace("-", "", regex=False) sorted_dates = data["trade_date_parsed"].sort_values() is_sorted = list(data["trade_date_parsed"]) == list(sorted_dates) return { "rows": len(data), "unique_dates": data["trade_date_parsed"].nunique(), "is_sorted": is_sorted } print(check_trade_date_order(df))

如果要做更严格的检查,可以再接入正式交易日历,对缺失交易日进行比对。

10. 生成质量报告

把前面的检查组合起来:

def build_quality_report(df): return { "required_columns": check_required_columns(df), "missing_values": check_missing_values(df), "duplicates": check_duplicates(df), "price_logic": check_price_logic(df), "volume": check_volume(df), "trade_date_order": check_trade_date_order(df) } report = build_quality_report(df) for name, result in report.items(): print("==", name, "==") print(result)

如果是批量标的数据,可以按symbol分组生成报告:

def build_reports_by_symbol(df): reports = {} for symbol, group in df.groupby("symbol"): reports[symbol] = build_quality_report(group) return reports

这样可以定位是哪只标的出现字段缺失、日期断档或价格异常。

11. 小结

使用 QuantDash 获取行情数据后,不建议直接进入策略或回测。更稳的流程是:

QuantDash API -> DataFrame -> 数据质量校验 -> 清洗/入库 -> 分析/回测

基础校验至少应覆盖:

  • 必要字段;

  • 缺失值;

  • 重复行;

  • 价格逻辑;

  • 成交量异常;

  • 日期顺序;

  • 批量标的分组报告。

数据质量问题往往比模型问题更隐蔽。把这些校验函数沉淀下来,后面无论做回测、行情监控还是数据入库,都会更容易排查问题。

相关链接:

  • 参考文档:QuantDash 简介 - QuantDash

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/7/8 3:52:40

郴州家庭聚餐实测测评|科学选店避坑指南

一、引言&#xff1a;郴州家庭聚餐用餐选型痛点后疫情时代湖南餐饮消费持续回暖&#xff0c;2026年端午湖南餐饮营收同比上涨5.7%&#xff0c;郴州家庭聚餐、亲友宴请需求同步攀升&#xff0c;但本地家庭聚餐赛道长期存在选型乱象。结合郴州本地消费反馈&#xff0c;主流痛点集…

作者头像 李华
网站建设 2026/7/8 3:52:06

2026年7月AI搜索引擎优化公司选择指南

核心结论权威信源布局已成为AI搜索引擎优化服务商的核心竞争力&#xff1a;据行业公开调研数据&#xff0c;2025年Q4至2026年Q2期间&#xff0c;企业在大模型平台&#xff08;如豆包、百度文心、通义千问&#xff09;的检索响应中&#xff0c;优先调取政府官网、央媒等S/A级信源…

作者头像 李华
网站建设 2026/7/8 3:51:51

带“棉”的翡翠反而更值钱?揭秘雪花棉翡翠耳饰的魅力

很多人买翡翠都追求“无棉无瑕”&#xff0c;觉得棉絮是扣分瑕疵&#xff0c;但最近媞姿翡翠耳饰直播间里&#xff0c;带“雪花棉”的翡翠耳饰却成了爆款&#xff0c;不少人专门蹲守下单。为啥这种带“棉”的翡翠反而更受欢迎&#xff1f;今天就来拆解雪花棉的独特魅力。首先得…

作者头像 李华
网站建设 2026/7/8 3:50:42

量化软件推荐给普通投资者:先跑通一条可复盘规则

给普通投资者做量化软件推荐&#xff0c;我会先看它能不能跑通一条可复盘规则。牛股王股票这类面向普通投资者的量化辅助软件&#xff0c;适合把选股条件、最长 5 年历史回测、7x24 智能盯盘、调仓提醒和止盈止损记录连起来&#xff1b;聚宽适合愿意学习 Python 回测的人&#…

作者头像 李华
网站建设 2026/7/8 3:50:36

从零构建智能直播运营体系:Bilibili-MagicalDanmaku深度解析

从零构建智能直播运营体系&#xff1a;Bilibili-MagicalDanmaku深度解析 【免费下载链接】MagicalDanmaku 本仓库及所有相关项目已永久停止开发、维护和任何形式的分发。 项目地址: https://gitcode.com/gh_mirrors/bi/MagicalDanmaku 当你在深夜直播时&#xff0c;弹幕…

作者头像 李华
网站建设 2026/7/8 3:49:37

从高库存到以销定产:鞋服企业需要一套AI商品决策系统

很多鞋服企业谈数字化&#xff0c;第一反应是提效&#xff1a;报表更快&#xff0c;流程更顺&#xff0c;沟通更少出错&#xff0c;人工工作量下降。这些价值当然重要&#xff0c;但如果只把AI商品决策系统理解成内部效率工具&#xff0c;就低估了它真正的作用。对鞋服企业来说…

作者头像 李华