如何用 Python 筛选平台整理后突破的股票?(箱体突破选股)
如何用 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])
关键坑与注意事项
- 必须用前复权价:除权跳空会假装成「突破」,务必
adjust="forward"。 - 一定要放量确认:无量突破(缩量)多为假突破,容易次日回落;用成交量倍数过滤。
- 箱体窗口不含当日:用
iloc[-(N+1):-1]算箱体,避免把突破日自己算进整理区间。 - 振幅阈值要合理:
RANGE_MAX太松会把趋势中继当整理,太紧则很少命中,按市场调。 - 警惕涨停/一字板:突破当天若涨停,实际难买入;可结合次日跟踪或排除一字板。
- 突破≠必涨:这是形态筛选,需结合大盘环境、基本面与止损纪律,别当必胜信号。
- 请求量控制:
count=30足够判断 20 日箱体,分块batch并配合缓存,别拉全历史。
常见问题(FAQ)
Q:箱体(平台)怎么定义才算窄? A:用「近 N 日最高最低的相对幅度」衡量,如 ≤15%。这是相对阈值,按品种波动性和市场阶段调整。
Q:和均线粘合选股有什么区别? A:均线粘合看多条均线收敛;箱体突破看价格振幅收窄 + 突破区间上沿,角度不同,可结合使用。
Q:怎么减少假突破? A:加放量确认(量 > 箱体均量 1.5~2 倍)、要求突破幅度 >1%、或等次日不回落再确认。
Q:需要付费吗?
A:单只/少量有免费额度;全市场标的池扫描(universes + klines.batch)需 Starter 及以上。详见定价页。
小结
平台突破选股的关键是把「整理」和「突破」都量化:用近 N 日振幅收窄判定箱体、用收盘突破箱顶判定突破、再用放量确认过滤假突破。用 AlphaFeed 批量取前复权日线,几十行就能扫出全市场平台突破候选。记住用前复权价、箱体不含当日、务必放量确认。
相关链接:
- AlphaFeed 官网:https://alphafeed.org/
- Python SDK 快速开始:https://docs.alphafeed.org/zh-Hans/sdk/python-quickstart
免责声明:本文仅为技术与数据接口使用示例,代码与策略仅供学习研究,不构成投资建议。市场有风险,历史数据不代表未来表现。