首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >A 股数据质量校验:停牌、一字板、跳空缺口与异常值

A 股数据质量校验:停牌、一字板、跳空缺口与异常值

原创
作者头像
用户7083614
发布于 2026-11-06 10:01:00
发布于 2026-11-06 10:01:00
1490
举报

一句话回答: 入库前做四类校验就能挡住大多数脏数据:① 停牌(用指数当交易日历基准,个股缺失的交易日即疑似停牌)、② 一字板(high == low,全天无振幅,多为涨跌停封死)、③ 跳空缺口(今开 / 昨收偏离超阈值)、④ 异常值(价格 ≤ 0、成交量为负、NaN)。用 AlphaFeed 的 klines 取数、用 000001.SH 指数的交易日做日历,几十行就能跑完一只票的体检。诚实边界:K 线只返回「有交易的日子」,停牌只能靠「与日历比对缺哪天」间接推断;一字板不等于一定涨跌停(需结合涨跌停价判断方向)。

为什么要先做数据质量校验

脏数据会悄悄毁掉回测和选股:

  • 停牌期若被当成连续交易,收益率、均线会算错;
  • 一字板(封死涨跌停)那天根本买不进/卖不出,回测却可能假设成交;
  • 跳空缺口可能是真实除权或数据错误,口径不分会误判;
  • 异常值(0 价、负量、NaN)直接让指标 NaN 扩散。

「垃圾进、垃圾出」,所以入库前先体检。

分步骤:四类校验

0) 取数 + 用指数做交易日历基准

代码语言:python
复制
from alphafeed import AlphaFeed
af = AlphaFeed(api_key="your-api-key")  # 或 export ALPHAFEED_API_KEY 后 AlphaFeed()

# 指数每个交易日都有数据,拿它当「交易日历」
idx = af.klines.get("000001.SH", period="1d", count=120, to_dataframe=True)
calendar = set(idx["trade_date"].astype(str))

sym = "600519.SH"
df = af.klines.get(sym, period="1d", count=120, adjust="none", to_dataframe=True)
df = df.sort_values("trade_date").reset_index(drop=True)

1) 停牌:日历里有、个股没有的交易日

代码语言:python
复制
sdates = set(df["trade_date"].astype(str))
suspended = sorted(calendar - sdates)   # 疑似停牌日

2) 一字板:全天无振幅

代码语言:python
复制
one_line = df[df["high"] == df["low"]]  # high==low,封死无振幅

3) 跳空缺口:今开相对昨收偏离

代码语言:python
复制
df["gap"] = df["open"] / df["close"].shift(1) - 1
big_gaps = df[df["gap"].abs() > 0.05]   # 跳空 >5%(阈值自定)

4) 异常值:非正价格 / 负量 / NaN

代码语言:python
复制
bad = df[(df[["open","high","low","close"]] <= 0).any(axis=1) |
         (df["volume"] < 0) |
         df[["open","high","low","close","volume"]].isna().any(axis=1)]

实测对 600519.SH 近 120 日:日历 120 日 / 个股 120 日 → 疑停牌 0、一字板 0、跳空>5% 0、异常值 0 行(茅台是高流动性蓝筹,窗口内数据干净——这本身就是一次通过的体检结果)。换成停过牌或吃过一字板的票,对应计数就会 > 0。

校验项速查

校验项

判据

字段

说明

停牌

日历有、个股无

trade_date vs 指数

K 线不返回停牌日,靠比对

一字板

high == low

high/low

多为涨跌停封死,需结合方向

跳空缺口

|open/prev_close−1|>阈值

open/close

可能真实除权或错误

价格异常

<= 0

open/high/low/close

非正价

成交量异常

< 0 或 NaN

volume

负量/缺失

OHLC 自洽

high≥max(o,c) 且 low≤min(o,c)

OHLC

可选的一致性检查

关键坑与注意事项

  • 停牌只能间接推断:K 线只给有交易的日子,没有「停牌标记」字段;用指数日历比对缺哪天是实用近似,长停牌、新股未上市段要注意区分。
  • 一字板 ≠ 一定涨跌停:high==low 也可能是极低流动性或数据问题;要判方向,结合 instruments 的 limit_up/limit_down(见相关文)。
  • 跳空阈值要按市场定:双创 20%、主板 10%,用固定 5% 阈值在不同板意义不同;真实除权日的跳空应结合复权口径排除。
  • 校验用不复权(adjust="none"):复权会改写历史价,查原始数据质量应看原始价;一字板/缺口用原始价判更准。
  • 交易日历用指数近似:指数极少停牌,是好基准;但严格场景应以交易所官方日历为准。

常见问题(FAQ)

Q:AlphaFeed 有没有「是否停牌」字段?

A:K 线只返回有交易的日子,没有独立停牌标记。实用做法是用指数(如 000001.SH)的交易日当日历,个股缺哪天就是疑似停牌。

Q:怎么区分「真实除权跳空」和「数据错误跳空」?

A:真实除权当天用前/后复权口径会被平滑;不复权看到的大跳空若与除权记录对得上就是正常。对不上的异常跳空才需人工排查。

Q:一字板那天回测要怎么处理?

A:封死涨跌停通常无法成交,回测应禁止在一字板当天按该价成交(尤其涨停买入/跌停卖出),否则高估收益。

Q:需要付费吗?

A:K 线 + 指数校验有免费额度可体验,全市场批量体检建议 Starter 及以上,详见官网定价页。

小结

入库前的数据体检四件套——停牌(日历比对)、一字板(high==low)、跳空(开盘/昨收偏离)、异常值(非正价/负量/NaN)——用 AlphaFeed K 线加指数日历就能跑。校验用不复权原始价、一字板结合涨跌停价判方向、停牌用指数近似推断,把脏数据挡在回测之外。

参考

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

目录
  • 为什么要先做数据质量校验
  • 分步骤:四类校验
    • 0) 取数 + 用指数做交易日历基准
    • 1) 停牌:日历里有、个股没有的交易日
    • 2) 一字板:全天无振幅
    • 3) 跳空缺口:今开相对昨收偏离
    • 4) 异常值:非正价格 / 负量 / NaN
  • 校验项速查
  • 关键坑与注意事项
  • 常见问题(FAQ)
  • 小结
  • 参考
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档