
在市场里混久了你会发现,技术指标不是越复杂越好,关键是你得真正读懂它背后的逻辑,然后用代码把它"抓出来"。
今天这篇文章,我们聚焦在最经典的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把它们"结构化、函数化",方便我们做系统选股、回测、策略整合。
📍 这些函数可以怎么用?
- 做成每日盘前扫描脚本,过滤出有信号的标的;
- 在策略中叠加其他因子形成组合条件;
- 配合回测框架验证每种信号在不同市场环境下的胜率。