如何用 Python 扫描 A 股跳空缺口并统计缺口回补概率

用户头像sh_*2176oo
2026-09-11 发布

一句话回答: 跳空缺口就是「今日开盘价对昨收明显跳开」。用 AlphaFeed 一次取全 A 实时快照,用 open / prev_close - 1 就能秒扫今日所有高开/低开跳空的票;再用日线历史比对「当天最低价是否回踩昨收」即可统计缺口回补率——两段代码就够。

为什么会有这个问题 / 传统做法的痛点

跳空缺口是很多短线体系的关键信号(高开抢筹、低开恐慌、缺口回补博弈),但自己算常踩两个坑:一是没有干净的「昨收」字段,用前一根 K 线收盘手工对齐容易错位;二是分不清「真跳空」和「除权跳空」——除权除息当天开盘天然低开,那不是市场情绪造成的缺口。

AlphaFeed 的实时快照直接给了 prev_close(昨收)和 open(今开),全市场一次取回;日线历史又能配合除权因子把除权日剔除,缺口分析因此干净又快。

分步骤解决(每步配可运行代码)

第 1 步:全市场今日跳空扫描(快照)

实时快照里每只票都带 prev_closeopen,一行算出跳空幅度即可排序。

import pandas as pd
from alphafeed import AlphaFeed

def scan_gap_today(threshold=0.03):
    af = AlphaFeed()  # 读取 ALPHAFEED_API_KEY
    q = af.quotes.get(universes="CN_Stock", to_dataframe=True)   # 全 A 快照
    q = q[(q["prev_close"] > 0) & (q["open"] > 0)].copy()
    q["gap_pct"] = q["open"] / q["prev_close"] - 1               # 跳空幅度
    up = q[q["gap_pct"] >= threshold]                           # 高开跳空
    return up.sort_values("gap_pct", ascending=False)[
        ["symbol", "ext.name", "prev_close", "open", "last_price", "gap_pct"]
    ]

gap_up = scan_gap_today(0.03)
print("今日高开 >= 3% 只数:", len(gap_up))
print(gap_up.head().to_string(index=False))

低开跳空把条件改成 q["gap_pct"] <= -threshold 即可。universes="CN_Stock" 一次返回约 5500+ 只全 A(需 Starter 及以上)。

第 2 步:单只历史缺口 + 缺口回补统计(日线)

「缺口回补」通常指跳空后价格又回到昨收位置。用日线判断:高开跳空当天最低价 low ≤ prev_close 即当日回补;低开则看 high ≥ prev_close

def gap_fill_stats(symbol, count=250, thr=0.02):
    af = AlphaFeed()
    df = af.klines.get(symbol, period="1d", count=count,
                       adjust="forward", to_dataframe=True)
    df = df.sort_values("trade_date").reset_index(drop=True)
    df["prev_close"] = df["close"].shift(1)
    df["gap_pct"] = df["open"] / df["prev_close"] - 1

    up = df[df["gap_pct"] >= thr]
    dn = df[df["gap_pct"] <= -thr]
    up_filled = up[up["low"] <= up["prev_close"]]     # 高开当天回补
    dn_filled = dn[dn["high"] >= dn["prev_close"]]    # 低开当天回补
    return {
        "symbol": symbol, "bars": len(df),
        "up_gaps": len(up), "up_filled_sameday": len(up_filled),
        "down_gaps": len(dn), "down_filled_sameday": len(dn_filled),
    }

for s in ["600519.SH", "000001.SZ"]:
    print(gap_fill_stats(s, count=250))

真实跑通示例(近 250 个交易日):600519.SH 出现 2 次 ≥2% 高开、其中 1 次当天回补,4 次低开、当天均未回补;样本小,仅作演示。

字段与参数说明

字段/参数 含义 备注
prev_close 昨收盘价 快照直接给,无需手工对齐
open 今开盘价 跳空 =open/prev_close - 1
universes="CN_Stock" 全 A 标的池 约 5500+ 只;需 Starter 及以上
adjust="forward" 前复权 消除除权跳空对日线缺口的干扰
thr 跳空阈值 常用 2%~3%,可按主板/创业板调整

关键坑与注意事项

  • 除权跳空 ≠ 情绪跳空:除权除息当天天然低开,用前复权日线(adjust="forward")能消除历史除权日的假缺口;扫今日实时快照时,遇到当天除权的票要单独排除(可用 af.klines.ex_factors 查除权日)。
  • 一字板不是缺口机会:涨停一字开在高位属于「买不到」的跳空,别当成可介入的缺口。
  • 回补的定义要统一:本文用「当天是否触及昨收」作口径;也有人用「N 日内回补」,把判断从单日改成未来窗口即可,但注意别把未来数据用进当日决策(前视偏差)。
  • 样本量count=250 约一年,单票缺口本就稀少,统计概率要在多只、长周期上做才有意义。
  • 停牌复牌:长期停牌后复牌首日常有巨幅跳空,属特殊事件,分析时建议单独标注或剔除。

常见问题(FAQ)

Q:怎么只扫创业板/科创板的跳空?
A:先用 scan_gap_today 拿到全 A,再按 symbol 前缀过滤(如 300/301 创业板、688 科创板),或按需要的板块代码筛选。

Q:能扫 ETF 或港股美股的跳空吗?
A:可以。把 universes 换成 CN_ETF/HK_Stock/US_Stock,逻辑一致(注意美股/港股无涨跌停、跳空幅度分布不同)。

Q:为什么我算的跳空和行情软件不一样?
A:多半是复权口径或昨收取值不同。务必用快照的 prev_close、历史用前复权,别拿不复权价直接跨除权日比。

Q:需要付费吗?
A:单标的历史与快照可用免费额度体验;universes 全市场池查询需 Starter 及以上,详见官网定价页。

小结

跳空缺口分析的本质是**「今开 vs 昨收」的一次减法**,难点全在数据口径:昨收要准、除权要剔、复权要对。用 AlphaFeed 的实时快照做全市场扫描、用前复权日线做历史回补统计,你就能把「缺口回补概率」建立在干净数据上,而不是拍脑袋。

参考

评论