AlphaFeed Blog

如何用 Python 筛选创 52 周新低的股票?(超跌反弹与避雷两用)

选股扫描 · 代码验证于 2026-10-04

如何用 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]}")

关键坑与注意事项

常见问题(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 批量取前复权日线,几十行就能扫出全市场创新低股并算出离低点距离,用于超跌反弹研究或持仓避雷。务必用前复权价、跳过次新股,并牢记「创新低≠能抄底」,配合量能与基本面确认。

相关链接:


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