如何用 Python 做均线粘合选股?(多头发散前的变盘候选)

一句话回答: 「均线粘合」就是 5/10/20/30/60 日均线挤在一起、彼此差距极小,常出现在长期横盘、变盘前夜。量化它只需一个指标------均线离散度 = 这几条均线的标准差 ÷ 均值 ×100%,越小越粘合。用 AlphaFeed 批量取复权日线,几行就能扫出全池粘合候选。

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

看图找「均线缠在一起」很直观,但要批量筛就得把「粘合」变成一个可比较的数:

  • 需要归一化:直接比均线差值,高价股天然差得大,必须除以均价变成百分比;
  • 多条均线一起看:只比两条均线不够,通常取 5/10/20/30/60 五条;
  • 粘合不辨方向:粘合只说明「蓄势」,向上还是向下要靠后续突破确认。

数据用 AlphaFeed 批量复权日线,计算用几行 pandas 即可。

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

第 1 步:批量取复权日线

python 复制代码
from alphafeed import AlphaFeed

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

symbols = ["600519.SH", "000001.SZ", "600036.SH", "000858.SZ", "600900.SH", "300750.SZ"]
bt = af.klines.batch(symbols, period="1d", count=90, adjust="forward", to_dataframe=True)
# bt 是 {symbol: DataFrame}

第 2 步:计算均线离散度

python 复制代码
import numpy as np

def convergence(close, mas=(5, 10, 20, 30, 60)):
    vals = [close.rolling(m).mean().iloc[-1] for m in mas]   # 各均线最新值
    return float(np.std(vals) / np.mean(vals) * 100)         # 离散度(%),越小越粘合

参数与阈值说明:

参数 含义 建议
mas 参与比较的均线 经典 5/10/20/30/60
count 取多少根日线 ≥ 最长均线(60)+ 余量,本文 90
离散度阈值 判定粘合的上限 1%~3%,越小越严格
adjust 复权方式 必须 forward

第 3 步:全池筛出粘合候选

python 复制代码
import pandas as pd

def ma_squeeze_screen(symbols, count=90, thr=1.5):
    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) < 60:      # 数据不足跳过
            continue
        d = df.sort_values("trade_date").reset_index(drop=True)
        disp = convergence(d["close"])
        rows.append({"symbol": sym, "dispersion_%": round(disp, 2), "squeeze": disp <= thr})
    return pd.DataFrame(rows).sort_values("dispersion_%")

print(ma_squeeze_screen(symbols, thr=3.0).to_string(index=False))
# 例如 600900.SH 0.52%、600519.SH 0.90% 离散度最小 -> 均线最粘合

上例实测长江电力离散度≈0.52%、茅台≈0.90% 最粘合;宁德时代≈6.27% 明显发散。想扫全市场把 symbols 换成 universe(需 Starter+)分批传入即可。

关键坑与注意事项

  • 粘合不辨方向 :离散度小只代表「多空平衡、蓄势」,之后是向上发散还是向下破位并不确定,务必等放量突破再动作。
  • 阈值随市场调:不同价位、不同波动的股票离散度基准不同;建议先看全市场分布,用分位数(如最小 5%)而非拍脑袋定绝对阈值。
  • 要够长的数据 :用到 60 日均线就必须至少 60+ 根日线,count 给足并对不足数据跳过,否则 rolling(60) 全是 NaN。
  • 复权 :一律 adjust="forward",除权跳空会让均线错位、离散度失真。
  • 配合成交量:粘合末期常伴随极度缩量,可加「近期成交量萎缩」条件提高质量。

常见问题(FAQ)

Q:为什么用标准差除以均值,而不是直接看均线差?

A:直接比差值对高价股不公平(价格越高差得越大)。除以均值做成百分比(变异系数),不同价位的股票才能横向比较。

Q:粘合后一定会变盘吗?

A:不一定,也可能继续横盘。它只是提高了「变盘概率」的观察名单,需结合突破、量能和基本面。

Q:扫全市场会不会很慢/超额度?

A:用 klines.batch 分批(每批几百只)比逐只快很多;全市场标的池需 Starter 及以上,注意接口额度。

Q:需要付费吗?

A:小批量在免费额度内可试;universe 全市场池与大批量需 Starter 及以上,详见 AlphaFeed 定价页。

小结

均线粘合选股的本质是「把几条均线挤在一起的程度量化成一个离散度」,用变异系数(标准差/均值)就能跨价位比较,越小越粘合。AlphaFeed 的批量复权日线让你几行扫出全池候选------但记住粘合只辨「蓄势」不辨「方向」,真正下手要等放量突破、配合量能确认。

参考

相关推荐
zhangzeyuaaa39 分钟前
Ruby 方法参数完全指南:默认值、可变参数与关键字参数
前端·python·ruby
2601_9620715742 分钟前
类变量和全局变量的隔离性有什么区别?
java·开发语言·jvm
小小张说故事1 小时前
pytest 写了用例却不跑、fixture 不生效、参数化全失效?9 个高频坑对照表
python
海绵宝宝转agent1 小时前
LeetCode100 LRU缓存思路讲解
java·开发语言·缓存
外收内放1 小时前
08 | 优化篇③ 60 张动作立绘和 50 张特效贴图是怎么进游戏的
python·游戏·pygame
计算机毕业编程指导师1 小时前
【计算机毕设推荐】基于Hadoop+Django的LLM多维度性能评估分析系统源码 毕业设计 选题推荐 毕设选题 数据分析 机器学习 深度学习
大数据·hadoop·python·django·毕业设计·课程设计·llm性能
AC赳赳老秦1 小时前
OpenClaw 与 FineBI 联动方案:公开数据自动采集与实时业务分析看板实践
大数据·开发语言·python·php·finebi·deepseek·openclaw
通信瓦工1 小时前
OCP 冷却环境与冷却剂分配单元(CDU)子项目
java·开发语言
计算机毕业编程指导师1 小时前
【Python毕设选题推荐】基于Hadoop+Django的奥斯卡奖获奖数据可视化分析系统源码 毕业设计 选题推荐 毕设选题 数据分析 机器学习 深度学习
大数据·hadoop·python·计算机·毕业设计·课程设计·奥斯卡奖