首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >如何用 Python 筛选均线多头排列的股票?(MA5>MA10>MA20>MA60 全市场选股)

如何用 Python 筛选均线多头排列的股票?(MA5>MA10>MA20>MA60 全市场选股)

原创
作者头像
用户7083614
发布于 2026-09-26 15:00:51
发布于 2026-09-26 15:00:51
2200
举报

一句话回答: "均线多头排列"就是短期均线在上、长期均线在下依次排开(MA5>MA10>MA20>MA60)且股价站上均线,是趋势向上的经典形态。用 AlphaFeed 取全市场标的池 + klines.batch 批量复权日线,几十行就能扫出全市场处于多头排列的强势股。

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

多头排列是最直观的趋势选股条件,但落地要解决:

  • 全市场取数:得先有全市场清单再批量取 K 线,手工做又慢又漏;
  • 复权:不用前复权,除权跳空会让均线错位,多头排列判断失真;
  • 多条均线对齐:要同时算 5/10/20/60 日均线并比较最新值。

AlphaFeed 用 universe + klines.batch 一次解决取数与复权。

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

第 1 步:定义多头排列判断

代码语言:python
复制
import pandas as pd

def is_bullish_alignment(close):
    ma5, ma10, ma20, ma60 = [close.rolling(w).mean().iloc[-1] for w in (5, 10, 20, 60)]
    # 短期在上、长期在下依次排列,且现价站上 MA5
    return ma5 > ma10 > ma20 > ma60 and close.iloc[-1] > ma5

多头排列判定条件:

条件

含义

MA5 > MA10

超短期强于短期

MA10 > MA20

短期强于中期

MA20 > MA60

中期强于中长期

收盘 > MA5

股价站上最短均线

四条同时满足 = 典型多头排列(趋势向上、各周期资金一致做多)。

第 2 步:批量取复权日线并筛选

代码语言:python
复制
from alphafeed import AlphaFeed

af = AlphaFeed(api_key="your-api-key")  # 或 export ALPHAFEED_API_KEY 后 AlphaFeed()

def ma_bullish_screen(symbols, count=120):
    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) < 65:      # 至少 60+ 根才能算 MA60
            continue
        d = df.sort_values("trade_date").reset_index(drop=True)
        c = d["close"]
        if is_bullish_alignment(c):
            ma = {w: round(float(c.rolling(w).mean().iloc[-1]), 2) for w in (5, 20, 60)}
            rows.append({"symbol": sym, "close": round(float(c.iloc[-1]), 2),
                         "ma5": ma[5], "ma20": ma[20], "ma60": ma[60]})
    return pd.DataFrame(rows)

第 3 步:全市场分批跑

代码语言:python
复制
def run_full_market():
    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(ma_bullish_screen(symbols[i:i + 150]))
    return pd.concat([d for d in out if not d.empty], ignore_index=True)

# hits = run_full_market()
# print("全市场多头排列只数:", len(hits)); print(hits.head(20))

小样本(10 只票)实测能稳定筛出处于多头排列的个股(如招商银行 MA5>MA20>MA60 且现价站上 MA5),逻辑跑通;全市场同法按 150 只分批。

关键坑与注意事项

  • 多头排列是滞后确认:它描述"已经形成的上升趋势",不是起涨点。买在多头排列成立时往往已涨一段,注意追高风险。
  • 回踩/发散:刚成立的多头排列更值得关注,均线已高度发散(乖离率大)时可能面临回踩,可加乖离率过滤。
  • 复权:必须 adjust="forward",否则除权跳空会让均线错位、误判排列。
  • 参数可调:5/10/20/60 是常用组合,也可用 10/20/60/120 等;勿在历史上反复调到最优(过拟合)。
  • 要配流动性/止损:多头排列会破位,务必叠加成交额过滤与止损规则,别只看形态。

常见问题(FAQ)

Q:为什么要同时要求"收盘>MA5"?

A:只比均线排列可能出现"排列还在但股价已跌破短均线"的走弱前兆。加"收盘>MA5"能确保当前价仍在趋势之上,减少假信号。

Q:多头排列和均线金叉有什么区别?

A:金叉是"两条均线交叉的瞬间"(择时点),多头排列是"多条均线的持续状态"(趋势确认)。前者更早、噪声更多,后者更稳、更滞后。

Q:能筛"空头排列"做规避/做空提示吗?

A:可以,把条件反过来(MA5<MA10<MA20<MA60 且收盘<MA5)即空头排列;但 A 股个股做空受限,多用于规避而非做空。

Q:需要付费吗?

A:少量标的的 K 线在免费额度内即可试;全市场 universe 取数需 Starter 及以上,详见 AlphaFeed 定价页。

小结

均线多头排列选股 = 全市场标的池 + 前复权日线 + 多条均线排列判断。真正的门槛是取数与复权口径,AlphaFeed 用 universe + klines.batch 收敛掉,你几十行就能扫出全市场多头排列个股——但请记住它是趋势的滞后确认,需配合乖离率、流动性和止损,别盲目追高。

参考

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

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

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