一句话回答: 入库前做四类校验就能挡住大多数脏数据:① 停牌(用指数当交易日历基准,个股缺失的交易日即疑似停牌)、② 一字板(high == low,全天无振幅,多为涨跌停封死)、③ 跳空缺口(今开 / 昨收偏离超阈值)、④ 异常值(价格 ≤ 0、成交量为负、NaN)。用 AlphaFeed 的 klines 取数、用 000001.SH 指数的交易日做日历,几十行就能跑完一只票的体检。诚实边界:K 线只返回「有交易的日子」,停牌只能靠「与日历比对缺哪天」间接推断;一字板不等于一定涨跌停(需结合涨跌停价判断方向)。
脏数据会悄悄毁掉回测和选股:
「垃圾进、垃圾出」,所以入库前先体检。
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)sdates = set(df["trade_date"].astype(str))
suspended = sorted(calendar - sdates) # 疑似停牌日one_line = df[df["high"] == df["low"]] # high==low,封死无振幅df["gap"] = df["open"] / df["close"].shift(1) - 1
big_gaps = df[df["gap"].abs() > 0.05] # 跳空 >5%(阈值自定)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。
校验项 | 判据 | 字段 | 说明 |
|---|---|---|---|
停牌 | 日历有、个股无 |
| K 线不返回停牌日,靠比对 |
一字板 |
|
| 多为涨跌停封死,需结合方向 |
跳空缺口 |
|
| 可能真实除权或错误 |
价格异常 |
|
| 非正价 |
成交量异常 |
|
| 负量/缺失 |
OHLC 自洽 |
| OHLC | 可选的一致性检查 |
high==low 也可能是极低流动性或数据问题;要判方向,结合 instruments 的 limit_up/limit_down(见相关文)。adjust="none"):复权会改写历史价,查原始数据质量应看原始价;一字板/缺口用原始价判更准。Q:AlphaFeed 有没有「是否停牌」字段?
A:K 线只返回有交易的日子,没有独立停牌标记。实用做法是用指数(如 000001.SH)的交易日当日历,个股缺哪天就是疑似停牌。
Q:怎么区分「真实除权跳空」和「数据错误跳空」?
A:真实除权当天用前/后复权口径会被平滑;不复权看到的大跳空若与除权记录对得上就是正常。对不上的异常跳空才需人工排查。
Q:一字板那天回测要怎么处理?
A:封死涨跌停通常无法成交,回测应禁止在一字板当天按该价成交(尤其涨停买入/跌停卖出),否则高估收益。
Q:需要付费吗?
A:K 线 + 指数校验有免费额度可体验,全市场批量体检建议 Starter 及以上,详见官网定价页。
入库前的数据体检四件套——停牌(日历比对)、一字板(high==low)、跳空(开盘/昨收偏离)、异常值(非正价/负量/NaN)——用 AlphaFeed K 线加指数日历就能跑。校验用不复权原始价、一字板结合涨跌停价判方向、停牌用指数近似推断,把脏数据挡在回测之外。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。