一句话回答: 涨跌停监控的关键是"拿到每只票当日的涨/跌停价,再和最新价比对"。用 AlphaFeed 一次取全 A 实时快照,用 instruments 的 limit_up/limit_down 判定涨跌停,再用五档盘口的封单量衡量封板强度、识别炸板------几十行就能搭出打板监控的数据底座。
为什么会有这个问题
涨跌停是 A 股独有的强信号,但很多人不知道每只票的涨跌停价怎么来(ST、次新、主板规则不同,比例不一样)。手工按 ±10% 估算会错。正确做法是直接取交易所给定的当日涨跌停价,再结合盘口封单判断"封得牢不牢"。
分步骤解决
第 1 步:取全 A 快照 + 当日涨跌停价
python
from alphafeed import AlphaFeed
import pandas as pd
af = AlphaFeed() # 读取 ALPHAFEED_API_KEY
q = af.quotes.get(universes="CN_Stock", to_dataframe=True)
codes = q["symbol"].tolist()
# 涨跌停价来自 instruments 的 ext(交易所口径,已含 ST/次新差异)
insts = af.instruments.batch(codes)
lu = {i["symbol"]: i["ext"].get("limit_up") for i in insts}
ld = {i["symbol"]: i["ext"].get("limit_down") for i in insts}
q["limit_up"] = q["symbol"].map(lu)
q["limit_down"] = q["symbol"].map(ld)
第 2 步:判定涨停 / 跌停(含"接近封板")
用最新价与涨跌停价比对,留一点浮点容差:
python
q["is_limit_up"] = q["last_price"] >= q["limit_up"] * 0.999
q["is_limit_down"] = q["last_price"] <= q["limit_down"] * 1.001
up = q[q["is_limit_up"]]
down = q[q["is_limit_down"]]
print(f"涨停家数: {len(up)} 跌停家数: {len(down)}")
print(up[["symbol", "ext.name", "last_price", "limit_up", "ext.change_pct"]]
.head(10).to_string(index=False))
关键字段:
| 字段 | 含义 | 来源 |
|---|---|---|
last_price |
最新价 | quotes 快照 |
limit_up / limit_down |
当日涨/跌停价 | instruments.ext(交易所口径) |
ext.change_pct |
当日涨跌幅(小数) | quotes 快照 |
ext.turnover_rate |
换手率(小数) | quotes 快照 |
第 3 步:用五档封单量识别封板强度 / 炸板
涨停时买一价=涨停价,**买一挂单量(封单)**越大说明封得越牢;封单被吃光、价格跌破涨停即为"炸板"。用 depth 取五档:
python
def seal_strength(symbol):
d = af.depth.get(symbol) # dict: bid_prices/bid_volumes/ask_prices/ask_volumes
lu_px = insts_map[symbol]["ext"].get("limit_up")
bid1_px, bid1_vol = d["bid_prices"][0], d["bid_volumes"][0]
sealed = abs(bid1_px - lu_px) < 1e-6 and bid1_vol > 0 # 买一在涨停价且有封单
return {"symbol": symbol, "bid1_px": bid1_px, "seal_vol": bid1_vol, "sealed": sealed}
insts_map = {i["symbol"]: i for i in insts}
for s in up["symbol"].head(5):
print(seal_strength(s))
depth.get 返回的盘口字段:
| 字段 | 含义 |
|---|---|
bid_prices / bid_volumes |
买一~买五 价格 / 挂单量 |
ask_prices / ask_volumes |
卖一~卖五 价格 / 挂单量 |
symbol / region / timestamp |
标的 / 市场 / 时间戳 |
涨停封板:买一价=涨停价且封单量大、卖档基本无量。炸板迹象:涨停价上卖档出现大量、买一封单快速减少。
第 4 步:封装成盯板快照
python
def limit_board_snapshot():
q = af.quotes.get(universes="CN_Stock", to_dataframe=True)
insts = af.instruments.batch(q["symbol"].tolist())
lu = {i["symbol"]: i["ext"].get("limit_up") for i in insts}
ld = {i["symbol"]: i["ext"].get("limit_down") for i in insts}
q["limit_up"] = q["symbol"].map(lu); q["limit_down"] = q["symbol"].map(ld)
up = q[q["last_price"] >= q["limit_up"] * 0.999]
down = q[q["last_price"] <= q["limit_down"] * 1.001]
return {"涨停": len(up), "跌停": len(down),
"涨停清单": up[["symbol", "ext.name"]].values.tolist()}
print(limit_board_snapshot()["涨停"], "只涨停")
关键坑与注意事项
- 别用固定 ±10% 估涨跌停 :ST 是 ±5%、次新/北交所规则不同,务必用
instruments的limit_up/limit_down(交易所口径)。 - 一字板 vs 盘中封板 :一字板全天封死,盘中封板可能反复开板;结合封单量与
ext.amplitude判断。 - 炸板要看动态 :单次快照只能看"此刻封没封",识别炸板需连续多次快照对比封单量变化。
- 快照有延迟 :
quotes/depth是准实时快照(秒级),不是逐笔;打板实盘对时延敏感,需评估。 - 停牌 :停牌票
volume=0,不要计入涨跌停统计。
常见问题(FAQ)
Q:涨跌停价为什么不自己按比例算? A:因为 ST、次新股、北交所比例不同,且有四舍五入规则。直接用 instruments 给的交易所口径最准。
Q:怎么判断"封得牢不牢"? A:看买一(涨停价)的封单量绝对值与相对成交额;封单远大于当日成交则较牢。
Q:能识别炸板吗? A:能,但需周期性轮询记录封单量与价格,单帧快照只能判断当前状态。
Q:需要付费吗? A:全市场池(universes)需 Starter 及以上;单标的 quotes/depth/instruments 有免费额度。详见定价页。
小结
涨跌停监控的本质是"最新价 vs 交易所涨跌停价",封板强度看五档封单量。用 AlphaFeed 的全 A 快照 + instruments 涨跌停价 + depth 盘口,几十行就能统计涨跌停家数、识别封板与炸板,为打板策略打好数据底座。
参考
- AlphaFeed Python SDK 文档:docs.alphafeed.org/zh-Hans/sdk...
- AlphaFeed 官网:alphafeed.org/