熟练掌握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把它们"结构化、函数化",方便我们做系统选股、回测、策略整合。

📍 这些函数可以怎么用?

  • 做成每日盘前扫描脚本,过滤出有信号的标的;
  • 在策略中叠加其他因子形成组合条件;
  • 配合回测框架验证每种信号在不同市场环境下的胜率。
相关推荐
天天摸鱼的java工程师1 分钟前
从被测试小姐姐追着怼到运维小哥点赞:我在项目管理系统的 MySQL 优化实战
java·后端·mysql
yvestine2 分钟前
自然语言处理——文本表示
人工智能·python·算法·自然语言处理·文本表示
专注VB编程开发20年9 分钟前
asp.net mvc如何简化控制器逻辑
后端·asp.net·mvc
zzc92110 分钟前
MATLAB仿真生成无线通信网络拓扑推理数据集
开发语言·网络·数据库·人工智能·python·深度学习·matlab
编程有点难25 分钟前
Python训练打卡Day43
开发语言·python·深度学习
2301_8050545632 分钟前
Python训练营打卡Day48(2025.6.8)
pytorch·python·深度学习
LjQ204039 分钟前
网络爬虫一课一得
开发语言·数据库·python·网络爬虫
用户67570498850239 分钟前
告别数据库瓶颈!用这个技巧让你的程序跑得飞快!
后端
哆啦A梦的口袋呀1 小时前
基于Python学习《Head First设计模式》第九章 迭代器和组合模式
python·学习·设计模式