趋势识别技术:移动平均线、MACD与ADX
趋势识别,说白了就是判断市场现在到底在干嘛。是往上走?往下走?还是纯粹在瞎晃悠?
我做了这么多年量化,见过太多人一上来就搞复杂模型。其实没必要。三个经典指标就能解决大部分问题:MA、MACD、ADX。今天咱们一个一个说清楚。
一、移动平均线(MA)识别趋势
移动平均线是最基础的趋势识别工具。我个人习惯把它叫做「市场的平均成本线」。为什么?因为它算的就是过去N根K线的平均价格。
你想想看,如果价格在均线上方,说明当前价格高于近期平均成本——多头占优。反之亦然。
1. 单均线策略
最简单的用法:价格在均线上方做多,下方做空。但这里有个坑——均线参数怎么选?
常用参数参考:
- MA20(20日均线):短期趋势,适合短线交易
- MA60(60日均线):中期趋势,我一般用它做主方向
- MA120(120日均线):长期趋势,牛熊分界线
我的经验:别死磕某个参数。不同品种、不同周期,最优参数都不一样。我一般先用MA20和MA60做双均线系统,效果比单均线稳定得多。
2. 双均线交叉策略
快线上穿慢线 → 金叉,做多。快线下穿慢线 → 死叉,做空。
嗯,这里要注意。均线交叉有个致命问题——震荡行情里会被反复打脸。我曾经在2018年用双均线做螺纹钢,一个月被来回扫了七八次,亏得我怀疑人生。
避坑指南:均线交叉策略一定要配合趋势过滤器。比如只在大周期均线向上时做金叉,向下时做死叉。别逆着大趋势做。
3. 代码示例:双均线策略
def ma_cross_strategy(df, fast=20, slow=60):
"""
双均线交叉策略
df: 包含收盘价的DataFrame
fast: 快线周期
slow: 慢线周期
"""
df['MA_fast'] = df['close'].rolling(window=fast).mean()
df['MA_slow'] = df['close'].rolling(window=slow).mean()
# 生成信号
df['signal'] = 0
df.loc[df['MA_fast'] > df['MA_slow'], 'signal'] = 1
df.loc[df['MA_fast'] < df['MA_slow'], 'signal'] = -1
# 取信号变化点
df['position'] = df['signal'].diff()
return df
二、MACD指标识别趋势
MACD,全称是移动平均收敛发散指标。说白了,它就是均线系统的升级版。
MACD由三部分组成:DIF线(快线)、DEA线(慢线)、柱状线。我一般这么看:
- DIF上穿DEA:金叉,做多信号
- DIF下穿DEA:死叉,做空信号
- 柱状线由负转正:多头动能增强
- 柱状线由正转负:空头动能增强
1. 顶背离与底背离
这是MACD最值钱的地方。什么叫顶背离?价格创新高,但MACD的DIF线没创新高。这说明多头力量跟不上了,随时可能反转。
背离实战要点:
- 顶背离出现后,等死叉确认再做空
- 底背离出现后,等金叉确认再做多
- 大周期背离比小周期更可靠
我记得有一次做比特币,日线级别出现顶背离,我当时没当回事。结果第二天直接暴跌15%。从那以后,我对背离信号再也不敢轻视。
2. 零轴的作用
MACD的零轴就是多空分界线。DIF在零轴上方,说明多头主导;在零轴下方,说明空头主导。
我建议你这样做:只做零轴上方的金叉,零轴下方的死叉。为什么?因为顺势交易胜率更高。你想想看,逆势做单,就算信号对了也赚不了几个钱。
3. 代码示例:MACD信号生成
def macd_signal(df, fast=12, slow=26, signal=9):
"""
MACD信号生成
"""
# 计算EMA
df['EMA_fast'] = df['close'].ewm(span=fast).mean()
df['EMA_slow'] = df['close'].ewm(span=slow).mean()
# DIF线
df['DIF'] = df['EMA_fast'] - df['EMA_slow']
# DEA线
df['DEA'] = df['DIF'].ewm(span=signal).mean()
# 柱状线
df['MACD_bar'] = 2 * (df['DIF'] - df['DEA'])
# 信号
df['signal'] = 0
df.loc[(df['DIF'] > df['DEA']) & (df['DIF'].shift(1) <= df['DEA'].shift(1)), 'signal'] = 1
df.loc[(df['DIF'] < df['DEA']) & (df['DIF'].shift(1) >= df['DEA'].shift(1)), 'signal'] = -1
return df
三、ADX指标识别趋势强度
ADX,平均趋向指数。这个指标不告诉你方向,它只告诉你趋势有多强。
很多人只看MA和MACD,忽略了ADX。其实这是个很大的误区。你想想看,如果趋势很弱,你按照MA信号进场,结果行情横盘震荡,那不是白忙活?
1. ADX的数值含义
| ADX数值 | 趋势强度 | 操作建议 |
|---|---|---|
| 0 - 25 | 弱趋势或无趋势 | 观望,不适合趋势策略 |
| 25 - 50 | 中等趋势 | 可以顺势交易 |
| 50 - 75 | 强趋势 | 积极跟进,但注意回调 |
| 75以上 | 极强趋势 | 趋势可能接近尾声,谨慎 |
我的习惯:ADX低于20时,我基本不做趋势策略。这时候市场在震荡,做趋势交易就是送钱。我会切换到震荡策略或者干脆空仓。
2. ADX与DI线的配合
ADX指标还包含+DI和-DI两条线。+DI向上说明多头力量增强,-DI向上说明空头力量增强。
当+DI在-DI上方,且ADX向上走 → 多头趋势在加强。这时候做多,胜率很高。
我曾经在2020年做黄金,ADX从18涨到35,+DI一直在-DI上方。我一路持有多单,赚了将近2000点。这就是趋势强度的威力。
3. 代码示例:ADX计算
def calculate_adx(df, period=14):
"""
计算ADX指标
"""
# 计算TR(真实波幅)
df['H-L'] = df['high'] - df['low']
df['H-PC'] = abs(df['high'] - df['close'].shift(1))
df['L-PC'] = abs(df['low'] - df['close'].shift(1))
df['TR'] = df[['H-L', 'H-PC', 'L-PC']].max(axis=1)
# 计算方向变动
df['up_move'] = df['high'] - df['high'].shift(1)
df['down_move'] = df['low'].shift(1) - df['low']
df['+DM'] = 0
df['-DM'] = 0
df.loc[(df['up_move'] > df['down_move']) & (df['up_move'] > 0), '+DM'] = df['up_move']
df.loc[(df['down_move'] > df['up_move']) & (df['down_move'] > 0), '-DM'] = df['down_move']
# 平滑处理
df['+DI'] = 100 * (df['+DM'].rolling(window=period).mean() / df['TR'].rolling(window=period).mean())
df['-DI'] = 100 * (df['-DM'].rolling(window=period).mean() / df['TR'].rolling(window=period).mean())
# 计算DX和ADX
df['DX'] = 100 * abs(df['+DI'] - df['-DI']) / (df['+DI'] + df['-DI'])
df['ADX'] = df['DX'].rolling(window=period).mean()
return df
四、三个指标如何配合使用
单独用任何一个指标,效果都有限。我一般这样组合:
- 先用MA判断大方向:价格在MA60上方,只做多;在下方,只做空
- 再用MACD找入场点:等金叉或死叉信号出现
- 最后用ADX确认强度:ADX大于25才进场
实战案例:
假设MA60向上,价格在均线上方。MACD出现金叉,ADX从20涨到30。这时候进场做多,止损设在MA60下方。我做过回测,这种三指标共振的策略,胜率能到65%以上。
注意:任何指标都有滞后性。MA和MACD都是基于历史数据计算的,它们无法预测未来。所以一定要配合资金管理,别因为信号好就重仓。
好了,趋势识别的三个核心工具就讲到这里。记住一句话:MA看方向,MACD看动能,ADX看强度。三者结合,才能做出高质量的交易决策。