首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >如何用 Python 做放量选股?(全市场扫描成交量突增的异动股)

如何用 Python 做放量选股?(全市场扫描成交量突增的异动股)

原创
作者头像
用户7083614
发布于 2026-09-27 15:00:53
发布于 2026-09-27 15:00:53
1380
举报

一句话回答: 放量选股就是"找出今日成交量明显高于近期均量的股票"。用 AlphaFeed 取全市场标的池 + klines.batch 批量日线,计算「今日成交量 ÷ 过去 N 日均量」这个放量倍数,筛出倍数≥阈值(如 2 倍)的个股,几十行就能扫出全市场放量异动股。

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

"放量"往往是资金异动、题材启动或出货的信号,做量化选股常需先扫出放量股。难点在于:

  • 全市场取数:得先有全市场清单再批量取量能,手工做不现实;
  • 基准怎么定:放量要和"近期均量"比,得算滚动均量且排除当日;
  • 复权与单位:不同标的量级差异大,用"倍数"(比值)比"绝对量"更可比。

AlphaFeed 用 universe + klines.batch 一次拿到全市场量价数据。

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

第 1 步:定义放量倍数

代码语言:python
复制
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 步:批量扫描

代码语言:python
复制
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 步:全市场分批跑

代码语言:python
复制
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 收敛掉,你几十行就能扫出全市场放量异动股——但请记住放量不辨方向,必须结合涨跌与止损,别盲目追高。

参考

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

目录
  • 为什么会有这个问题 / 传统做法的痛点
  • 分步骤解决(每步配可运行代码)
    • 第 1 步:定义放量倍数
    • 第 2 步:批量扫描
    • 第 3 步:全市场分批跑
  • 关键坑与注意事项
  • 常见问题(FAQ)
  • 小结
  • 参考
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档