如何用 Python 统计 A 股连续涨停(几连板)?

一句话回答: 「几连板」= 连续出现涨停的交易日数。用 AlphaFeed 取回前复权日线后,按该股所属板块的涨停幅度(主板 10%、创业板/科创板 20%、北交所 30%、ST 5%)判定每天是否涨停,再数「连续为真」的最长/最新一段,就能算出当前连板数与历史最长连板纪录。

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

「几连板」是 A 股情绪与游资打板研究的核心词,但很多人算错在两处:一是只用固定 10% 阈值 ,把创业板/科创板(20%)、北交所(30%)、ST(5%)全算错;二是用未复权价,遇到除权日收益率被人为放大/缩小导致误判。正确姿势是:取前复权日线算收益率,按板块用正确的涨停阈值判定涨停日,再统计连续段。

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

第 1 步:取前复权日线并算日收益率

python 复制代码
from alphafeed import AlphaFeed
import pandas as pd

af = AlphaFeed()  # 读取 ALPHAFEED_API_KEY

df = af.klines.get("600519.SH", period="1d", count=250,
                   adjust="forward", to_dataframe=True)
df = df.sort_values("trade_date").reset_index(drop=True)
df["ret"] = df["close"].pct_change()
print(df[["trade_date", "close", "ret"]].tail(3).to_string(index=False))

用 adjust="forward"(前复权)算收益率,避免除权日的伪跳空干扰涨停判定。

第 2 步:按板块确定涨停阈值

不同板块涨跌停幅度不同,用代码前缀选阈值(留 0.2% 容差应对四舍五入):

python 复制代码
def limit_ratio(symbol: str, is_st: bool = False) -> float:
    """返回该股涨停幅度(小数)。ST 股为 5%。"""
    if is_st:
        return 0.05
    code, _, exch = symbol.partition(".")
    if exch == "BJ":                      # 北交所 30%
        return 0.30
    if code.startswith(("300", "688")):   # 创业板 / 科创板 20%
        return 0.20
    return 0.10                           # 主板 10%

def is_limit_up(symbol, ret, is_st=False, tol=0.002):
    thr = limit_ratio(symbol, is_st) - tol
    return ret >= thr

各板块涨停幅度对照:

板块 代码/后缀 涨停幅度 备注
主板(沪/深) 600/601/603/605、000/001/002 10% ---
创业板 300 开头(.SZ) 20% 2020-08 起
科创板 688 开头(.SH) 20% ---
北交所 .BJ 后缀 30% ---
ST/*ST 名称含 ST 5% 需另判定

第 3 步:标记涨停日并统计连板

python 复制代码
sym = "600519.SH"
df["limit_up"] = df["ret"].apply(lambda r: is_limit_up(sym, r))

# 当前连板数:从最后一天往回数连续 True
def current_streak(flags: pd.Series) -> int:
    n = 0
    for v in reversed(flags.tolist()):
        if v:
            n += 1
        else:
            break
    return n

# 历史最长连板
def max_streak(flags: pd.Series) -> int:
    best = cur = 0
    for v in flags:
        cur = cur + 1 if v else 0
        best = max(best, cur)
    return best

print("当前连板数:", current_streak(df["limit_up"]))
print("区间内最长连板:", max_streak(df["limit_up"]))
print("区间内涨停天数合计:", int(df["limit_up"].sum()))

第 4 步:全市场扫描「今日连板股」

结合全 A 标的池,先筛出今日涨停的票,再逐只回看历史算连板数(示例只对今日涨停股回看,控制请求量):

python 复制代码
q = af.quotes.get(universes="CN_Stock", to_dataframe=True)
q["pct"] = q["ext.change_pct"] * 100          # ext.change_pct 是小数
today_up = q[q["pct"] >= 9.8]["symbol"].tolist()   # 主板近似;20cm 板可放宽

boards = []
for s in today_up[:50]:                        # 演示取前 50 只,避免过多请求
    k = af.klines.get(s, period="1d", count=15, adjust="forward", to_dataframe=True)
    k = k.sort_values("trade_date")
    k["ret"] = k["close"].pct_change()
    flags = k["ret"].apply(lambda r: is_limit_up(s, r))
    boards.append((s, current_streak(flags)))

boards.sort(key=lambda x: x[1], reverse=True)
print("今日连板梯队(前 10):", boards[:10])

关键坑与注意事项

  • 务必用前复权价算收益率:未复权价在除权日会出现伪涨跌,导致涨停误判。
  • 阈值要按板块区分:主板 10%、双创 20%、北交所 30%、ST 5%,一刀切 10% 会漏算/错算。
  • 收盘涨停 ≠ 一字板/封板:本方法用「收盘涨幅达阈值」近似涨停日,无法区分是否开板、是否一字;精确封板/炸板需五档盘口(见「涨停跌停监控」一文)。
  • 新股上市首日、退市整理期涨跌幅规则特殊:这些区间不适用常规阈值,统计时建议剔除。
  • ext.change_pct 是小数 :0.098 表示 9.8%,做百分数比较记得 ×100 或直接用小数阈值。
  • 全市场逐只回看请求量较大:建议只对「今日涨停股」回看,或配合本地缓存,避免一次拉全 A 历史。

常见问题(FAQ)

Q:怎么判断一只票是不是 ST?

A:AlphaFeed 的 ext.name 是证券简称,名称含「ST/*ST」即按 5% 阈值处理;可在取到简称后据此设置 is_st=True。

Q:能精确识别「一字板」「烂板」吗?

A:本文按收盘涨幅近似连板,不区分开板与否。要精确到封单、开板/炸板,需要分时或五档盘口数据。

Q:连板从哪天算起?

A:从最近一个交易日往回数连续涨停日;一旦某天未涨停即断板,连板数归零。

Q:需要付费吗?

A:单只历史日线有免费额度;全市场标的池扫描(universes)需 Starter 及以上。详见定价页。

小结

「几连板」的本质是「连续涨停日计数」。难点不在算法,而在两个数据细节:用前复权价避免除权伪信号,用板块化阈值(10/20/30/5%)正确判定涨停。用 AlphaFeed 取回前复权日线后,几行代码就能算出当前连板数、历史最长连板与今日连板梯队。

参考

相关推荐
Pniubi4 小时前
怎么排查慢SQL,怎么解决?
java·数据库·sql
M--Y4 小时前
LangGraph 工作流模式
开发语言·javascript·python·langchain·大模型·llm·langgraph
岁月宁静5 小时前
DeepSeek Harness 实战与架构解析:让 Agent 从“会聊”到“能交付”
人工智能·python·agent
LiaoWL1235 小时前
NumPy 入门实战(二):向量化与余弦相似度——从 ndarray 到 Embedding
python·numpy·embedding
薛之谦_5 小时前
Java 全栈知识体系:从 IDEA 高效开发到 JVM、并发与 Stream 实战
java·jvm·intellij-idea
forest_095 小时前
多 Agent 协作第二课:交叉验证≠独立验证
人工智能·python·算法·机器学习·prompt·agi
测试界的小码农8 小时前
【Linux 命令实战(06):Linux 文件权限管理,掌握 chmod、chown、chgrp】
linux·运维·服务器
databook9 小时前
时间序列数据,先拆规律还是先查异常
python·数据挖掘·数据分析
文丑颜不良啊9 小时前
LeetCode2761~2780题目解析
java·leetcode
师夷长技以自愈9 小时前
手搓 AI Agent 第 8 篇:从手写循环到画流程图——LangGraph 封装
人工智能·python