如何用 Python 做均线金叉选股(MA5 上穿 MA20)?全市场批量扫描
如何用 Python 做均线金叉选股(MA5 上穿 MA20)?
一句话回答: 均线金叉选股 = 对全市场每只股票算短期均线 MA5 与中期均线 MA20,筛出「最近一个交易日 MA5 刚上穿 MA20(金叉)」的标的。用 AlphaFeed 先用 quotes.get(universes="CN_Stock") 拿全 A 清单,再用 klines.batch 批量取前复权日线算均线,几十行就能扫完——金叉常被视为短期转强信号,但假信号多,务必配合趋势与量能过滤。
为什么会有这个问题 / 传统做法的痛点
「均线金叉」是最经典、最高频的选股条件之一,但手工在行情软件里一只只翻根本扫不动五千多只 A 股;自己写脚本又卡在两处:① 拿不到完整全 A 清单;② 逐只循环取 K 线太慢还触发限频。本文用 AlphaFeed 的 universes(现成全市场池)+ klines.batch(并发批量)解决取数,并严格只用截至收盘的数据判定金叉、避免未来函数。
分步骤解决(每步配可运行代码)
第 1 步:取全市场清单 + 批量前复权日线
from alphafeed import AlphaFeed
import pandas as pd
af = AlphaFeed(api_key="your-api-key") # 或 export ALPHAFEED_API_KEY 后 AlphaFeed()
q = af.quotes.get(universes="CN_Stock", to_dataframe=True) # 全 A 清单
syms = q["symbol"].head(300).tolist() # 示例取前 300 只
data = af.klines.batch(syms, period="1d", count=60,
adjust="forward", to_dataframe=True) # 批量前复权日线
universes="CN_Stock" 一次拿到全 A 符号;klines.batch 并发取数,远快于 for 循环逐只。
第 2 步:算 MA5 / MA20,判定「刚金叉」
hits = []
for sym, k in data.items():
if k is None or len(k) < 25: # 数据太短跳过(次新/停牌)
continue
k = k.sort_values("trade_date").reset_index(drop=True)
ma5 = k["close"].rolling(5).mean()
ma20 = k["close"].rolling(20).mean()
golden = ma5.iloc[-2] <= ma20.iloc[-2] and ma5.iloc[-1] > ma20.iloc[-1] # 昨未上穿、今上穿
if golden:
hits.append(sym)
print("MA5 上穿 MA20 命中:", len(hits), hits[:8])
用 [-2](昨日)与 [-1](今日)判定”刚上穿”,只用到截至最近收盘的数据,不含未来信息。
实测(
tools/verify_new_2026-10-13.py,SDK 0.1.4):扫前 300 只,命中 15 只”MA5 刚上穿 MA20”,示例600012.SH / 000423.SZ / 300019.SZ / 000665.SZ / 300619.SZ。
第 3 步(可选):加趋势/量能过滤提高质量
# 例:要求 MA20 本身向上(中期趋势未走坏),过滤下跌中继的弱金叉
ma20_up = ma20.iloc[-1] > ma20.iloc[-5]
加「MA20 向上」或「放量」等条件能筛掉下跌趋势里的无效金叉。
参数与字段说明
| 参数/概念 | 含义 | 备注 |
|---|---|---|
universes="CN_Stock" | 全 A 股票池 | 一次取回全市场清单 |
klines.batch | 批量取 K 线 | 并发,远快于循环 |
adjust="forward" | 前复权 | 必须,除权缺口会伪造金叉 |
| MA5 / MA20 | 短/中期均线 | 经典金叉组合,可改 10/60 等 |
[-2] <= / [-1] > | 昨未穿、今穿 | 判定”刚金叉” |
len(k) < 25 | 数据过短跳过 | MA20 需足够样本 |
关键坑与注意事项
- 避免未来函数:判定只用
[-2]、[-1],不引用未来;若要回测这个选股,务必次日开盘才成交。 - 金叉假信号多:MA 金叉滞后,震荡市频繁金叉死叉;“刚金叉”命中只是候选,需叠加 MA20 方向、量能、板块等过滤。
- 前复权必须:不复权时除权缺口会制造虚假交叉。
- 样本量与限频:示例取前 300 只演示;扫全 A 5000+ 只建议分块调用
klines.batch、控制并发、尊重套餐限频。 - 次新/停牌:数据过短(
len(k) < 25)直接跳过,避免均线未计算完整时的噪声。 - 选股 ≠ 买点:命中只是”值得看一眼”的候选,不构成交易建议。
常见问题(FAQ)
Q:均线金叉和 MACD 金叉选股有什么区别? A:均线金叉看的是价格均线(MA5 vs MA20)直接交叉;MACD 金叉看的是 DIF 与 DEA(EMA 之差)的交叉,对动量变化更敏感。两者都滞后,可结合使用。
Q:MA5/MA20 可以换成别的周期吗? A:可以,常见还有 10/60、20/60 等。周期越短越灵敏、假信号越多;越长越稳、越滞后。关键是回测验证并配合过滤,别只认一组参数。
Q:需要付费吗?
A:全市场清单(universes)与批量 K 线(klines.batch)属于 Starter 及以上能力;单只验证逻辑可在免费额度内试。详见官网定价页。
小结
均线金叉选股的难点从来不在公式,而在”快速取到全市场数据”与”过滤假信号”。用 AlphaFeed 的 universes 拿清单、klines.batch 批量取前复权日线,几十行就能把全 A 扫一遍——记住避免未来函数、金叉滞后易骗,命中只是候选,建议再加 MA20 方向与量能过滤。
相关链接:
- AlphaFeed 官网:https://alphafeed.org/
- Python SDK 快速开始:https://docs.alphafeed.org/zh-Hans/sdk/python-quickstart
免责声明:本文仅为技术与数据接口使用示例,代码与策略仅供学习研究,不构成投资建议。市场有风险,历史数据不代表未来表现。