如何用 Python 筛选创 52 周新低的股票?(超跌反弹与避雷两用)
如何用 Python 筛选创 52 周新低的股票?
一句话回答: 「创 52 周新低」= 当前价跌破过去约 250 个交易日的最低价。用 AlphaFeed 取全市场标的池 + klines.batch 批量日线,判断「最新收盘 ≤ 近 250 日最低」即创新低,再算出离 52 周低点的距离,几十行就能扫出全市场创新低股——既可找超跌反弹候选,也可当持仓避雷清单。
为什么会有这个问题 / 传统做法的痛点
创新低是把双刃剑:有人用它找「跌过头」的超跌反弹标的,有人用它排雷(持仓创新低先警惕)。难点在于批量判断全市场、并区分「刚破新低」和「新低后已反弹」。坑在于:必须用前复权价(否则除权跳变误判),而且创新低≠马上反弹,要配合量能与基本面,避免「越跌越买」的陷阱。
分步骤解决(每步配可运行代码)
第 1 步:取前复权日线,判断是否创 52 周新低
from alphafeed import AlphaFeed
import pandas as pd
af = AlphaFeed() # 读取 ALPHAFEED_API_KEY
df = af.klines.get("600519.SH", period="1d", count=260,
adjust="forward", to_dataframe=True)
df = df.sort_values("trade_date").reset_index(drop=True)
WIN = 250 # 约 52 周(一年交易日)
low_252 = df["low"].tail(WIN).min()
last_close = df["close"].iloc[-1]
is_new_low = last_close <= low_252 * 1.001 # 容差 0.1%,贴着低点也算
print(f"52周最低 {low_252:.2f},现价 {last_close:.2f},创新低={is_new_low}")
第 2 步:量化「离 52 周低点的距离」
dist_to_low = (last_close / low_252 - 1) * 100 # 高于低点百分比
print(f"距 52 周低点 +{dist_to_low:.1f}%")
| 字段 | 含义 | 解读 |
|---|---|---|
low_252 | 近 250 日最低价 | 52 周低点 |
is_new_low | 现价 ≤ 低点(含容差) | 正在创新低 |
dist_to_low | 现价高于低点的百分比 | 0 附近=贴近新低;越大=已反弹 |
第 3 步:封装判定函数
def near_52w_low(k, win=250, tol=0.001):
k = k.sort_values("trade_date")
if len(k) < 60: # 样本太短(次新股)跳过
return None
low = k["low"].tail(win).min()
last = k["close"].iloc[-1]
if low <= 0:
return None
return {"low_252": round(float(low), 2),
"close": round(float(last), 2),
"dist_pct": round(float((last / low - 1) * 100), 2),
"is_new_low": bool(last <= low * (1 + tol))}
第 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=260,
adjust="forward", to_dataframe=True)
for sym, k in data.items():
r = near_52w_low(k)
if r and r["is_new_low"]:
hits.append((sym, r["dist_pct"]))
print(f"创 52 周新低个股数: {len(hits)} 样例: {hits[:10]}")
关键坑与注意事项
- 必须用前复权价:未复权价在除权日会假性创新低/掩盖新低。
- 创新低 ≠ 可抄底:下跌趋势中「新低后还有新低」很常见,别只因创新低就买;基本面恶化的票可能持续阴跌。
- 用 low 还是 close 判新低:本文用近 250 日
low的最小值作基准、与现价比;也可用收盘价序列判「收盘创新低」,口径不同结果略异。 - 次新股样本不足:上市不足一年没有完整 52 周,
len(k)<60直接跳过或按实际窗口处理。 - 配合量能/反转信号:超跌反弹应等「缩量止跌 + 放量反包」等确认,别裸接下跌刀。
- 请求量控制:
count=260够判 250 日窗口,分块batch并配合缓存,别拉全历史。
常见问题(FAQ)
Q:52 周为什么用 250 个交易日? A:A 股一年约 250 个交易日 ≈ 52 周。要更严格可用 252,差异很小。
Q:和创 52 周新高筛选是什么关系?
A:完全镜像——新高是 close ≥ 近250日 high 最大,新低是 close ≤ 近250日 low 最小。可共用一套框架。
Q:怎么只保留「刚破新低」的?
A:用 dist_pct 接近 0(如 ≤1%)过滤,排除「新低后已明显反弹」的票。
Q:需要付费吗?
A:单只/少量有免费额度;全市场标的池扫描(universes + klines.batch)需 Starter 及以上。详见定价页。
小结
筛创 52 周新低,核心是「现价 ≤ 近 250 日最低」。用 AlphaFeed 批量取前复权日线,几十行就能扫出全市场创新低股并算出离低点距离,用于超跌反弹研究或持仓避雷。务必用前复权价、跳过次新股,并牢记「创新低≠能抄底」,配合量能与基本面确认。
相关链接:
- AlphaFeed 官网:https://alphafeed.org/
- Python SDK 快速开始:https://docs.alphafeed.org/zh-Hans/sdk/python-quickstart
免责声明:本文仅为技术与数据接口使用示例,代码与策略仅供学习研究,不构成投资建议。市场有风险,历史数据不代表未来表现。