如何用 Python 做放量选股?(全市场扫描成交量突增的异动股)
如何用 Python 做放量选股?(全市场扫描成交量突增的异动股)
一句话回答: 放量选股就是”找出今日成交量明显高于近期均量的股票”。用 AlphaFeed 取全市场标的池 + klines.batch 批量日线,计算「今日成交量 ÷ 过去 N 日均量」这个放量倍数,筛出倍数≥阈值(如 2 倍)的个股,几十行就能扫出全市场放量异动股。
为什么会有这个问题 / 传统做法的痛点
“放量”往往是资金异动、题材启动或出货的信号,做量化选股常需先扫出放量股。难点在于:
- 全市场取数:得先有全市场清单再批量取量能,手工做不现实;
- 基准怎么定:放量要和”近期均量”比,得算滚动均量且排除当日;
- 复权与单位:不同标的量级差异大,用”倍数”(比值)比”绝对量”更可比。
AlphaFeed 用 universe + klines.batch 一次拿到全市场量价数据。
分步骤解决(每步配可运行代码)
第 1 步:定义放量倍数
def volume_ratio(volume, n=20):
# 今日成交量 ÷ 过去 n 日均量(不含今日),衡量放量程度
avg = volume.iloc[-(n + 1):-1].mean()
today = float(volume.iloc[-1])
return today / avg if avg else float("nan")
放量选股参数:
| 参数 | 含义 | 常用取值 |
|---|---|---|
n | 均量回看天数 | 20(约一个月) |
放量阈值 k | 今日量 ≥ k 倍均量 | 2.0(温和 1.5、剧烈 3.0) |
| 是否含当日 | 均量是否含今天 | 不含(避免稀释) |
第 2 步:批量扫描
from alphafeed import AlphaFeed
import pandas as pd
af = AlphaFeed(api_key="your-api-key") # 或 export ALPHAFEED_API_KEY 后 AlphaFeed()
def volume_surge_screen(symbols, count=30, n=20, k=2.0):
bt = af.klines.batch(symbols, period="1d", count=count,
adjust="forward", to_dataframe=True)
rows = []
for sym, df in bt.items():
if df is None or len(df) < n + 1:
continue
d = df.sort_values("trade_date").reset_index(drop=True)
ratio = volume_ratio(d["volume"], n)
chg = (d["close"].iloc[-1] / d["close"].iloc[-2] - 1) * 100
rows.append({"symbol": sym, "vol_ratio": round(ratio, 2),
"chg_pct": round(float(chg), 2), "surge": ratio >= k})
res = pd.DataFrame(rows)
return res[res["surge"]].sort_values("vol_ratio", ascending=False) if not res.empty else res
第 3 步:全市场分批跑
def run_full_market(k=2.0):
q = af.quotes.get(universes="CN_Stock", to_dataframe=True)
symbols = q["symbol"].tolist()
out = []
for i in range(0, len(symbols), 150): # 分批防限频
out.append(volume_surge_screen(symbols[i:i + 150], k=k))
return pd.concat([d for d in out if not d.empty], ignore_index=True)
# hits = run_full_market(k=2.0)
# print("全市场放量(>=2x)只数:", len(hits)); print(hits.head(20))
同时看放量倍数与当日涨跌幅(chg_pct)很重要:放量上涨多为资金进场/题材启动,放量下跌则可能是出货/恐慌,方向完全不同。
关键坑与注意事项
- 放量不辨方向:放量只说明”交投活跃”,涨是抢筹、跌是出货。务必结合当日涨跌幅和价格位置一起看。
- 均量要排除当日:算过去 N 日均量时要
iloc[-(n+1):-1]排除今天,否则今日大成交量会把基准抬高、低估放量倍数。 - 次新股/停牌复牌失真:上市不足 N 天、或刚复牌的股票均量样本不足,倍数会异常,代码已按
len<n+1跳过,复牌首日仍需人工甄别。 - 盘中 vs 收盘:日线成交量是全天量,盘中扫描要用实时快照的当日累计量并考虑已开盘时长(经典”量比”口径),本文用的是收盘后日线口径。
- 别把放量当买入信号:放量常伴随高波动,需配合止损与基本面/题材判断,勿追高。
常见问题(FAQ)
Q:这和行情软件的”量比”是一回事吗? A:不完全。经典量比是”当前每分钟均量 ÷ 过去 5 日每分钟均量”,是盘中概念。本文用的是”今日全天量 ÷ 过去 N 日均量”的日线口径,更适合收盘后批量选股。两者思想一致、口径不同。
Q:阈值 k 取多少合适? A:2 倍是常用起点,温和用 1.5、剧烈异动用 3 以上。建议按你的标的池和策略回测校准,别在历史上过拟合。
Q:为什么小样本跑出来没有放量股? A:放量是相对少数事件,小样本(几只票)可能一只都没有,属正常。全市场几千只票跑才有意义。
Q:需要付费吗? A:少量标的的 K 线在免费额度内即可试;全市场 universe 取数需 Starter 及以上,详见 AlphaFeed 定价页。
小结
放量选股 = 全市场标的池 + 批量日线 + 今日量/过去 N 日均量的放量倍数。真正的门槛是取数与基准口径(排除当日、用比值),AlphaFeed 用 universe + klines.batch 收敛掉,你几十行就能扫出全市场放量异动股——但请记住放量不辨方向,必须结合涨跌与止损,别盲目追高。
相关链接:
- AlphaFeed 官网:https://alphafeed.org/
- Python SDK 快速开始:https://docs.alphafeed.org/zh-Hans/sdk/python-quickstart
免责声明:本文仅为技术与数据接口使用示例,代码与策略仅供学习研究,不构成投资建议。市场有风险,历史数据不代表未来表现。