如何用 Python 筛选「缩量企稳」的股票?地量 + 横盘的变盘候选
如何用 Python 筛选「缩量企稳」的股票?
一句话回答: 和放量追涨相反,「缩量企稳」找的是成交极度萎缩(地量)且股价横住不跌(企稳) 的票——抛压衰竭、浮筹清理干净,常是变盘前夜。做法是用 AlphaFeed 的 klines.batch 批量取前复权日线,用「近 5 日均量 ÷ 近 60 日均量」衡量缩量程度(比值越小越缩量),再用「近期振幅」确认价格横住,两条件一起对全市场扫描即可。
为什么会有这个问题 / 传统做法的痛点
多数选股器只盯「放量上涨」,但老手知道「地量见地价」——当一只股票成交量萎缩到长期均量的三四成、价格又不再创新低,说明想卖的基本卖完了,再往下砸盘的动能枯竭。难点在于:
- 「缩量」要相对自己:100 万手是放量还是缩量,得和它自己的历史均量比,不能用绝对值。
- 光缩量不够,还要「企稳」:缩量下跌是阴跌,缩量横盘才是抛压衰竭。所以要叠加「价格振幅收窄」。
- 要全市场扫描:机会分散在几千只票里,必须批量算。
分步骤解决(每步配可运行代码)
第 1 步:定义缩量 + 企稳指标
def dry_up_metrics(k, short=5, long=60):
k = k.sort_values("trade_date")
if len(k) < long + 5:
return None
vol = k["volume"]
vol_ratio = vol.tail(short).mean() / vol.tail(long).mean() # <1 缩量
close = k["close"]
amp = close.tail(short).max() / close.tail(short).min() - 1 # 近 short 日振幅
return {"vol_ratio": float(vol_ratio), "amp": float(amp)}
vol_ratio= 近 5 日均量 ÷ 近 60 日均量:< 0.6 可视为明显缩量(地量)。amp= 近 5 日最高/最低 − 1:< 5% 可视为横盘企稳。
第 2 步:单股体检
from alphafeed import AlphaFeed
af = AlphaFeed(api_key="your-api-key") # 或 export ALPHAFEED_API_KEY 后 AlphaFeed()
df = af.klines.get("600519.SH", period="1d", count=120,
adjust="forward", to_dataframe=True)
print(dry_up_metrics(df))
实测(
tools/verify_new_2026-10-05.py,SDK 0.1.4):贵州茅台当前 量比(短/长) = 0.831、近期振幅 = 1.86%——价格够稳但缩量不够极致(0.831 > 0.6),不算典型地量候选。
第 3 步:全市场批量扫描
q = af.quotes.get(universes="CN_Stock", to_dataframe=True)
codes = q["symbol"].tolist()
hits = []
CHUNK = 300
for i in range(0, len(codes), CHUNK):
data = af.klines.batch(codes[i:i+CHUNK], period="1d", count=120,
adjust="forward", to_dataframe=True)
for sym, k in data.items():
m = dry_up_metrics(k)
if m and m["vol_ratio"] < 0.6 and m["amp"] < 0.05: # 缩量 + 企稳
hits.append((sym, round(m["vol_ratio"], 3), round(m["amp"], 4)))
hits.sort(key=lambda x: x[1]) # 按缩量程度排序,越缩量越靠前
print("候选数:", len(hits), hits[:10])
实测扫描前 600 只:命中 117 只缩量企稳候选,最缩量样例如
920925.BJ(量比 0.239)、301158.SZ(0.25)、002828.SZ(0.261,振幅仅 1.12%)。
参数与字段说明
| 参数/字段 | 含义 | 备注 |
|---|---|---|
adjust="forward" | 前复权 | 必须,除权缺口会假性放大振幅 |
short=5 | 近期窗口 | 衡量当前量能/振幅 |
long=60 | 长期基准 | 均量参照(约一季度) |
vol_ratio<0.6 | 缩量阈值 | 越小越地量,可调 |
amp<0.05 | 企稳阈值 | 近 5 日振幅 <5% |
klines.batch | 批量取数 | 全市场扫描必备 |
关键坑与注意事项
- 缩量不是买入信号:地量企稳只是「抛压衰竭」的中性信号,可能向上变盘也可能继续阴跌(缩量阴跌陷阱);务必结合趋势、基本面与风控。
- 停牌与新股:停牌期间
volume=0会把均量拉低造成假缩量;新股上市不足 60 日数据不够,本文用len(k) < long+5过滤。 - 前复权:除权日价格缺口会假性放大振幅,必须
adjust="forward"。 - 阈值要自己调:0.6 / 5% 是示例经验值,不同市值/板块分布差异大,建议分组标定。
- 放量才是确认:真正变盘往往要等后续放量突破确认,缩量企稳只是「候选池」。
常见问题(FAQ)
Q:和「放量选股」是不是相反? A:是互补的两极。放量找的是「资金正在进场」,缩量企稳找的是「抛压已经枯竭、等待变盘」,适用阶段不同。
Q:量比用成交量还是成交额?
A:本文用成交量(volume)。若担心价格变动影响,可改用成交额(amount)做比值,逻辑一致。
Q:需要付费吗?
A:全市场扫描依赖 universes 标的池 + klines.batch 批量取数,属 Starter 及以上能力;单只/少量股票可用免费额度先验证逻辑。详见官网定价页。
小结
缩量企稳的本质是「用相对自身的均量比值找地量、用近期振幅确认横盘」,再靠 klines.batch 全市场扫出候选池。有了 AlphaFeed 的前复权批量数据,十几行就能落地——但记住它只是「抛压衰竭」的中性候选,真正的变盘还要等后续放量确认。
相关链接:
- AlphaFeed 官网:https://alphafeed.org/
- Python SDK 快速开始:https://docs.alphafeed.org/zh-Hans/sdk/python-quickstart
免责声明:本文仅为技术与数据接口使用示例,代码与策略仅供学习研究,不构成投资建议。市场有风险,历史数据不代表未来表现。