熟练掌握MACD这8种形态,让你少走三年弯路(附Python量化代码)| 建议收藏

在市场里混久了你会发现,技术指标不是越复杂越好,关键是你得真正读懂它背后的逻辑,然后用代码把它"抓出来"。

今天这篇文章,我们聚焦在最经典的MACD指标上,围绕实战中非常有参考价值的8种典型形态,用Python逐一实现------不仅能"识图识势",还能真正让它为你的策略服务。


准备工作:用 ta-lib 计算 MACD

我们用专业的技术分析库 ta-lib 来算 MACD。它直接返回三组关键值:

  • DIF(快线)
  • DEA(慢线)
  • MACD柱(能量柱)

不会安装ta-lib的可以参考花姐写的这篇文章 mp.weixin.qq.com/s/b6WzibdYM... 《史上最强量化工具库 Ta-Lib 从入门到精通,一篇文章就够了!》

python 复制代码
import pandas as pd
import talib

def compute_macd(df):
    """
    计算MACD相关数据:DIF, DEA, MACD柱
    """
    df = df.copy()
    df['DIF'], df['DEA'], df['MACD'] = talib.MACD(
        df['close'],
        fastperiod=12,
        slowperiod=26,
        signalperiod=9
    )
    return df

注意: df 中请传入包含open high low close 字段Dataframe格式的行情数据,返回结果会在原来的df数据中增加DIF DEA MACD数据


八个MACD信号形态及量化识别函数


🟢 信号一:金叉上轴多头强

当快线(DIF)上穿慢线(DEA),并且整个结构在零轴之上时,往往是上涨趋势的确认,短线多头活跃。

python 复制代码
def is_bullish_cross_above_zero(df):
    """
    检测零轴上方的金叉信号
    """
    cond = (
        (df['DIF'] > 0) &
        (df['DIF'].shift(1) < df['DEA'].shift(1)) &
        (df['DIF'] > df['DEA'])
    )
    return cond

某股票在0轴之上MACD金叉,股价直接从11元涨到了15元,短短几天就带来了40%左右的收益。


🟡 信号二:下轴金叉假反弹

金叉出现在零轴以下时,通常只是短暂的反弹尝试,失败的概率不小,尤其在弱市里很容易冲高回落。

python 复制代码
def is_weak_cross_below_zero(df):
    """
    检测零轴下方的金叉(反弹信号)
    """
    cond = (
        (df['DIF'] < 0) &
        (df['DIF'].shift(1) < df['DEA'].shift(1)) &
        (df['DIF'] > df['DEA'])
    )
    return cond

比如这个股票25年2月10日出现0轴以下金叉,次日就开始下跌了,虽然后来也涨了,但是在下跌段很容易被洗下车


🔻 信号三:死叉下轴空头狠

如果死叉(DIF下穿DEA)发生在零轴以下,那说明空头格局依旧在发力,是典型的下行趋势延续信号。

python 复制代码
def is_bearish_continuation(df):
    """
    检测零轴下方的死叉,判断是否为下跌延续
    """
    cond = (
        (df['DIF'] < 0) &
        (df['DIF'].shift(1) > df['DEA'].shift(1)) &
        (df['DIF'] < df['DEA'])
    )
    return cond

比如这个股票,0轴下方金叉以后,是一路下跌,虽然期间有反弹,但是反弹力度都很弱。


🔁 信号四:上轴死叉别紧张

上涨趋势中出现的死叉,位置在零轴上方,一般代表短线整理或者回踩确认支撑,没必要过度紧张。

python 复制代码
def is_mild_pullback(df):
    """
    检测零轴上方死叉,常见于上涨途中的正常回调
    """
    cond = (
        (df['DIF'] > 0) &
        (df['DIF'].shift(1) > df['DEA'].shift(1)) &
        (df['DIF'] < df['DEA'])
    )
    return cond

比如这个股票尽力短暂调整以后有一次创新高。


🧭 信号五:底部背离要盯牢

当价格持续创新低,但MACD的DIF低点却在逐步抬高,这通常是行情即将反转的信号,值得重点盯防。

python 复制代码
from sklearn.linear_model import LinearRegression
import numpy as np
def calc_slope(y):
    """
    计算一段序列的线性回归斜率
    """
    x = np.arange(len(y)).reshape(-1, 1)
    model = LinearRegression().fit(x, y)
    return model.coef_[0]  # 返回斜率

def detect_bottom_divergence_by_slope(df, window=30):
    """
    使用线性回归判断底背离(价格向下趋势 + DIF向上趋势)
    
    """
    if df.shape[0] < window+10:
        return False

    df = df.copy()

    close_slope = calc_slope(df['close'].iloc[-window:].values.reshape(-1, 1))
    dif_slope = calc_slope(df['DIF'].iloc[-window:].values.reshape(-1, 1))
    # print(close_slope,dif_slope)
    # 条件:价格趋势下跌,DIF趋势上升 => 底背离
    if close_slope < -0.05 and dif_slope > 0.05:
        return True
    return False

比如这个股票就是一个典型的底背离反弹的案例


⚠️ 信号六:顶部背离赶紧跑

股价继续走高但动能跟不上,MACD的DIF高点却越来越低,这时候风险信号拉响,需提高警惕。

python 复制代码
from sklearn.linear_model import LinearRegression
import numpy as np

def calc_slope(y):
    """
    计算一段序列的线性回归斜率
    """
    x = np.arange(len(y)).reshape(-1, 1)
    model = LinearRegression().fit(x, y)
    return model.coef_[0]  # 返回斜率

def detect_top_divergence_by_slope(df, window=30):
    """
    使用线性回归判断顶背离(价格向上趋势 + DIF向下趋势)
    """
    if df.shape[0] < window + 10:
        return False

    df = df.copy()

    close_slope = calc_slope(df['close'].iloc[-window:].values.reshape(-1, 1))
    dif_slope = calc_slope(df['DIF'].iloc[-window:].values.reshape(-1, 1))

    # 条件:价格趋势上行,DIF趋势下行 => 顶背离
    if close_slope > 0.05 and dif_slope < -0.05:
        return True

    return False

比如这个股票,就是典型的顶背离


🔴 信号七:红柱加长多头猛

多头动能不断累积,MACD红柱一根比一根长,这时候趋势在延续,应该顺势持有,而不是过早下车。

python 复制代码
def is_growing_bullish_momentum(df, length=3):
    """
    判断MACD红柱连续增长,反映多头动能加强
    """
    series = df['MACD'].rolling(length)
    cond = series.apply(lambda x: all(x > 0) and all(x.diff().dropna() > 0), raw=False)
    return cond.fillna(False)

红柱子越来越大,走势基本上就会延续下去


🟢 信号八:绿柱放量得减仓

空头发力阶段,绿柱面积持续扩大,表示卖压在增强。此时不宜"抄底",应控制风险优先。

python 复制代码
def is_expanding_bearish_pressure(df, length=3):
    """
    判断MACD绿柱持续拉长,反映空头动能增强
    """
    series = df['MACD'].rolling(length)
    cond = series.apply(lambda x: all(x < 0) and all(x.diff().dropna() < 0), raw=False)
    return cond.fillna(False)

大绿肚子,就得赶紧跑路,落袋为安


小结 & 建议

这些MACD形态,其实都是老交易者在盘中实战里观察总结出来的规律。我们现在做的,只是用Python把它们"结构化、函数化",方便我们做系统选股、回测、策略整合。

📍 这些函数可以怎么用?

  • 做成每日盘前扫描脚本,过滤出有信号的标的;
  • 在策略中叠加其他因子形成组合条件;
  • 配合回测框架验证每种信号在不同市场环境下的胜率。
相关推荐
大模型真好玩1 分钟前
深入浅出LangChain AI Agent智能体开发教程(四)—LangChain记忆存储与多轮对话机器人搭建
前端·人工智能·python
love530love3 分钟前
命令行创建 UV 环境及本地化实战演示—— 基于《Python 多版本与开发环境治理架构设计》的最佳实践
开发语言·人工智能·windows·python·conda·uv
Lemon程序馆7 分钟前
今天聊聊 Mysql 的那些“锁”事!
后端·mysql
龙卷风04059 分钟前
使用本地IDEA连接服务器远程构建部署Docker服务
后端·docker
vv安的浅唱13 分钟前
Golang基础笔记七之指针,值类型和引用类型
后端·go
陪我一起学编程25 分钟前
MySQL创建普通用户并为其分配相关权限的操作步骤
开发语言·数据库·后端·mysql·oracle
都叫我大帅哥26 分钟前
深度学习的"Hello World":多层感知机全解指南
python·深度学习
都叫我大帅哥30 分钟前
LangChain分层记忆解决方案:完整案例
python·langchain
小王子102435 分钟前
Django实时通信实战:WebSocket与ASGI全解析(下)
python·websocket·django