4. MACD指标策略:金叉死叉、顶底背离与实战过滤
MACD这个指标,说实话,是期货趋势跟踪里最经典的几个工具之一。我刚开始做量化那会儿,第一个策略就是基于MACD金叉死叉写的。那时候觉得这东西太神奇了,金叉买、死叉卖,简单粗暴。后来吃了不少亏,才慢慢明白——MACD真正厉害的地方,不是它本身,而是你怎么用它。
今天咱们就把MACD策略拆开揉碎了讲。我会从最基础的金叉死叉讲起,再到顶底背离、柱状线策略,最后加上趋势线过滤。嗯,这些都是我实盘验证过的思路。
4.1 MACD基础:金叉与死叉
先说说最基础的金叉死叉。MACD由三部分组成:快线(DIF)、慢线(DEA)和柱状线(MACD柱)。金叉就是快线上穿慢线,死叉就是快线下穿慢线。
听起来很简单对吧?但这里有个坑——单纯的金叉死叉在震荡行情里会被反复打脸。我2019年做螺纹钢回测时,用纯金叉死叉策略,半年回撤了30%。后来我加了个条件:只在大周期趋势明确时做金叉死叉。
核心逻辑:金叉死叉的本质是短期动能与长期动能的交叉。金叉代表短期动能强于长期,死叉则相反。但要注意,这个信号在趋势行情中有效,在震荡中就是噪音。
来看一段简单的回测代码:
import pandas as pd
import numpy as np
def macd_cross_strategy(df, fast=12, slow=26, signal=9):
# 计算MACD
exp1 = df['close'].ewm(span=fast).mean()
exp2 = df['close'].ewm(span=slow).mean()
dif = exp1 - exp2
dea = dif.ewm(span=signal).mean()
macd = 2 * (dif - dea)
# 生成信号
df['signal'] = 0
df.loc[(dif > dea) & (dif.shift(1) <= dea.shift(1)), 'signal'] = 1 # 金叉买入
df.loc[(dif < dea) & (dif.shift(1) >= dea.shift(1)), 'signal'] = -1 # 死叉卖出
return df
这段代码很简单,但实际用的时候,我建议你加一个过滤条件:比如只在大周期均线多头排列时做多,空头排列时做空。这样能过滤掉一半以上的假信号。
4.2 顶底背离:最赚钱的形态
顶底背离,说白了就是价格和MACD走势不一致。价格创新高,但MACD没创新高,这叫顶背离,是卖出信号。反过来就是底背离,买入信号。
我个人觉得,顶底背离是MACD策略里最值得深入研究的部分。为什么?因为它抓住了市场动能的本质变化。价格还在涨,但推动上涨的力量已经跟不上了,这就是趋势衰竭的信号。
实战技巧:我习惯用15分钟级别做顶底背离,配合日线趋势方向。比如日线多头,15分钟出现底背离,那就是绝佳的加仓点。这个组合我用了三年,胜率大概在65%左右。
顶底背离的识别逻辑:
- 顶背离:价格创出新高,但MACD的DIF线或柱状线没有创出新高
- 底背离:价格创出新低,但MACD的DIF线或柱状线没有创出新低
- 确认信号:背离形成后,等待MACD金叉(底背离)或死叉(顶背离)确认
我曾经犯过一个错误:看到背离就进场,结果被连续背离打爆。后来我加了背离次数统计——连续两次背离后,第三次背离的成功率会大幅提升。嗯,这个经验值不少钱。
4.3 柱状线策略:捕捉动能变化
MACD柱状线,就是DIF与DEA的差值乘以2。它反映的是短期动能的变化速度。柱状线从负转正,说明动能由弱转强;从正转负,说明动能由强转弱。
柱状线策略的核心是关注柱状线的收缩与扩张。举个例子:
- 柱状线扩张:柱状线长度在增加,说明动能正在加强
- 柱状线收缩:柱状线长度在减小,说明动能正在减弱
- 柱状线拐点:柱状线由扩张转为收缩,往往是趋势转折的前兆
注意:柱状线策略不能单独使用。我见过有人只看柱状线做交易,结果在单边行情里频繁进出。柱状线更适合作为辅助确认信号,配合趋势线或均线使用效果更好。
柱状线策略的代码实现:
def macd_histogram_strategy(df):
# 计算柱状线变化
df['hist'] = 2 * (df['dif'] - df['dea'])
df['hist_change'] = df['hist'] - df['hist'].shift(1)
# 柱状线由负转正且加速扩张
df['signal'] = 0
df.loc[(df['hist'] > 0) & (df['hist_change'] > 0) &
(df['hist'].shift(1) < 0), 'signal'] = 1
# 柱状线由正转负且加速收缩
df.loc[(df['hist'] < 0) & (df['hist_change'] < 0) &
(df['hist'].shift(1) > 0), 'signal'] = -1
return df
4.4 结合趋势线的过滤
这是今天最重要的部分。MACD策略最大的问题就是假信号太多,而趋势线过滤能有效解决这个问题。
我的做法是:先画一条趋势线,然后只在趋势线同侧做交易。比如上升趋势线之上,只做多不做空;下降趋势线之下,只做空不做多。
具体步骤:
- 画趋势线:连接两个或三个低点(上升趋势)或高点(下降趋势)
- 确认趋势:价格在趋势线上方运行,视为多头趋势;下方为空头趋势
- 过滤信号:多头趋势中,只接受金叉和底背离的买入信号;空头趋势中,只接受死叉和顶背离的卖出信号
实战效果:我做过一个对比测试。纯MACD金叉死叉策略在螺纹钢上的年化收益是12%,最大回撤28%。加上趋势线过滤后,年化收益提升到18%,最大回撤降到15%。这就是过滤的价值。
趋势线过滤的代码实现:
def trend_line_filter(df, lookback=20):
# 简单趋势线判断:用最近N根K线的最高点和最低点
df['high_max'] = df['high'].rolling(lookback).max()
df['low_min'] = df['low'].rolling(lookback).min()
# 判断趋势方向
df['trend'] = 0
df.loc[df['close'] > df['high_max'].shift(1), 'trend'] = 1 # 多头
df.loc[df['close'] < df['low_min'].shift(1), 'trend'] = -1 # 空头
# 过滤MACD信号
df['filtered_signal'] = 0
df.loc[(df['signal'] == 1) & (df['trend'] == 1), 'filtered_signal'] = 1
df.loc[(df['signal'] == -1) & (df['trend'] == -1), 'filtered_signal'] = -1
return df
4.5 知识体系框架
下面这张图是我自己整理的MACD策略知识体系,你可以把它当作学习路线图:
4.6 避坑指南与实战建议
最后,分享几个我踩过的坑:
- 不要逆势做背离:我曾经在日线下降趋势中做底背离,结果被连续打止损。记住,背离只是信号,不是反转的保证。
- 参数不是固定的:默认的12、26、9参数适合日线级别。如果你做15分钟或1小时,建议重新优化参数。我习惯用(8, 21, 5)做短线。
- 多周期共振:大周期定方向,小周期找入场点。比如日线多头,15分钟金叉,这就是共振信号。
- 止损要严格:MACD策略的止损我一般放在最近一个低点下方2-3个ATR的位置。别扛单,扛单是亏损的根源。
我的个人习惯:每次开仓前,我会问自己三个问题——趋势方向对吗?MACD信号确认了吗?止损设好了吗?三个问题都回答「是」,才动手。这个习惯帮我过滤掉了至少70%的冲动交易。
好了,MACD策略就讲到这里。记住,指标是死的,人是活的。再好的策略,没有纪律和风控,都是白搭。希望这些内容对你有帮助。
公众号:蓝海资料掘金营,微信deep3321