AlphaFeed Blog

如何用 Python 筛选平台整理后突破的股票?(箱体突破选股)

选股扫描 · 代码验证于 2026-09-29

如何用 Python 筛选平台整理后突破的股票?(箱体突破)

一句话回答: 「平台/箱体突破」= 股价先在一段时间里窄幅横盘整理(振幅收窄),再向上突破整理区间的箱顶。用 AlphaFeed 取全市场标的池 + klines.batch 批量前复权日线,量化两个条件——① 前 N 日振幅足够窄(箱体)② 最新价突破箱顶——就能几十行扫出全市场平台突破候选,再用放量确认过滤假突破。

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

「久盘必跌/久盘出方向」是常见经验,横盘越久、越窄,突破时的动能往往越强。难点在于把「平台整理」量化:多窄才算整理?突破怎么定义?还要防假突破(突破当天缩量、次日回落)。下面用「振幅收窄 + 突破箱顶 + 放量确认」三条件解决。

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

第 1 步:取前复权日线,定义箱体

from alphafeed import AlphaFeed
import pandas as pd

af = AlphaFeed()  # 读取 ALPHAFEED_API_KEY

df = af.klines.get("600519.SH", period="1d", count=120,
                   adjust="forward", to_dataframe=True)
df = df.sort_values("trade_date").reset_index(drop=True)

N = 20  # 整理观察窗口
box = df.iloc[-(N+1):-1]              # 最近 N 日(不含当日)构成“箱体”
box_high = box["high"].max()          # 箱顶
box_low = box["low"].min()            # 箱底
box_range = (box_high - box_low) / box_low   # 箱体相对高度(振幅)

第 2 步:判定「整理 + 突破」

last = df.iloc[-1]
RANGE_MAX = 0.15     # 箱体振幅 ≤15% 视为窄幅整理
is_consolidation = box_range <= RANGE_MAX
is_breakout = last["close"] > box_high          # 收盘突破箱顶
# 放量确认:突破日成交量 > 箱体日均量的 1.5 倍
vol_confirm = last["volume"] > box["volume"].mean() * 1.5

print(f"箱体振幅={box_range:.1%} 整理={is_consolidation} 突破={is_breakout} 放量={vol_confirm}")
参数含义建议
N整理观察窗口(日)20~60
RANGE_MAX箱体振幅上限0.10~0.20(越小越严格)
突破收盘 > 箱顶可要求突破幅度>1% 减少毛刺
放量确认量 > 箱体均量×倍数1.5~2 倍

第 3 步:封装判定函数

def is_platform_breakout(k, n=20, range_max=0.15, vol_mult=1.5):
    k = k.sort_values("trade_date")
    if len(k) < n + 1:
        return False
    box = k.iloc[-(n+1):-1]
    box_high = box["high"].max(); box_low = box["low"].min()
    if box_low <= 0:
        return False
    box_range = (box_high - box_low) / box_low
    last = k.iloc[-1]
    return (box_range <= range_max
            and last["close"] > box_high
            and last["volume"] > box["volume"].mean() * vol_mult)

第 4 步:全市场扫描

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=30,
                           adjust="forward", to_dataframe=True)
    for sym, k in data.items():
        if k is not None and is_platform_breakout(k, n=20):
            hits.append(sym)
print("平台突破候选数:", len(hits), " 样例:", hits[:10])

关键坑与注意事项

常见问题(FAQ)

Q:箱体(平台)怎么定义才算窄? A:用「近 N 日最高最低的相对幅度」衡量,如 ≤15%。这是相对阈值,按品种波动性和市场阶段调整。

Q:和均线粘合选股有什么区别? A:均线粘合看多条均线收敛;箱体突破看价格振幅收窄 + 突破区间上沿,角度不同,可结合使用。

Q:怎么减少假突破? A:加放量确认(量 > 箱体均量 1.5~2 倍)、要求突破幅度 >1%、或等次日不回落再确认。

Q:需要付费吗? A:单只/少量有免费额度;全市场标的池扫描(universes + klines.batch)需 Starter 及以上。详见定价页。

小结

平台突破选股的关键是把「整理」和「突破」都量化:用近 N 日振幅收窄判定箱体、用收盘突破箱顶判定突破、再用放量确认过滤假突破。用 AlphaFeed 批量取前复权日线,几十行就能扫出全市场平台突破候选。记住用前复权价、箱体不含当日、务必放量确认。

相关链接:


免责声明:本文仅为技术与数据接口使用示例,代码与策略仅供学习研究,不构成投资建议。市场有风险,历史数据不代表未来表现。