4. 动量类指标:RSI、KDJ、MACD的原理与实战用法
动量类指标,说白了就是帮我们判断「这股劲儿还能不能持续」。我刚开始做量化那会儿,总觉得指标越多越好,后来发现——真正好用的,就那么几个。
今天聊的三个指标:RSI、KDJ、MACD,是动量择时的核心。它们各有脾气,但组合起来用,效果往往出奇的好。
4.1 相对强弱指标(RSI)
RSI衡量的是「涨跌的力度对比」。它不关心价格本身,只关心最近一段时间里,上涨和下跌谁更强势。
计算公式(简化版):
RSI = 100 - [100 / (1 + RS)]
其中 RS = 平均上涨幅度 / 平均下跌幅度
嗯,公式看着有点绕。但你记住一句话就行:RSI超过70算超买,低于30算超卖。
核心用法:
- RSI > 70:市场过热,考虑卖出或减仓
- RSI < 30:市场过冷,考虑买入或加仓
- RSI在50附近:多空平衡,观望为主
我在项目中遇到过一个问题:ETF在单边上涨行情里,RSI经常在70以上待很久。如果你一看到70就卖,很容易踏空。所以我个人的习惯是——结合趋势线来用。上升趋势中,RSI到80以上才考虑减仓;下降趋势中,RSI到20以下才考虑抄底。
避坑指南:我曾经在震荡市里用RSI做反向交易,效果很好。但一到趋势行情,RSI就频繁发出假信号。后来我加了一条规则:先判断趋势,再用RSI找买卖点。顺序不能反。
4.2 随机指标(KDJ)
KDJ比RSI更敏感。它不光看收盘价,还看最近的高点和低点。说白了,就是看当前价格在最近波动区间里的「位置」。
三条线的关系:
- K线:快速线,反应灵敏
- D线:慢速线,K线的移动平均
- J线:方向线,K与D的差值放大版
你想想看,KDJ最经典的用法是什么?金叉死叉。
实战规则:
- K线上穿D线(金叉):买入信号
- K线下穿D线(死叉):卖出信号
- J线超过100:超买,警惕回调
- J线低于0:超卖,可能反弹
我记得有一次做ETF回测,发现KDJ在震荡市里准确率很高,但在单边行情里经常被「钝化」。什么叫钝化?就是价格一直涨,KDJ却一直在高位钝着不动,金叉死叉频繁切换,全是假信号。
怎么解决?我的做法是:给KDJ加一个「过滤条件」。比如,只在大盘指数(如沪深300)的20日均线向上时,才用KDJ的金叉做多。均线向下时,KDJ的信号直接忽略。
注意:KDJ的参数默认是9,3,3。我个人习惯在ETF上把周期调大一点,比如改成14,3,3。这样信号少一些,但胜率更高。你可以在回测里试试看。
4.3 MACD指标
MACD是我最常用的趋势类动量指标。它不告诉你「超买超卖」,而是告诉你「趋势的强弱和转折」。
三个组成部分:
- DIF线:快线,12日EMA - 26日EMA
- DEA线:慢线,DIF的9日EMA
- MACD柱:DIF - DEA,红绿柱
说白了,MACD就是看两条均线的「距离」在变大还是变小。距离拉大,趋势强;距离缩小,趋势弱。
核心用法:
- 金叉/死叉:DIF上穿DEA为金叉(买入),下穿为死叉(卖出)
- 零轴位置:零轴上方为多头市场,下方为空头市场
- 背离:价格创新高但MACD没创新高——顶背离,看跌;价格创新低但MACD没创新低——底背离,看涨
我个人觉得,MACD最值钱的地方就是「背离」。为什么?因为背离是趋势衰竭的前兆。我在做ETF择时系统时,把MACD底背离作为「加仓信号」之一,效果比单纯的金叉好很多。
实战技巧:我曾经在回测中发现,MACD在日线级别上的金叉死叉,滞后性比较明显。后来我改用「MACD柱的变向」来做短线信号——红柱开始缩短时减仓,绿柱开始缩短时加仓。虽然信号多了点,但反应快了不少。
4.4 三个指标的协同用法
单独用任何一个指标,都有缺陷。但组合起来,就能互相弥补。
我常用的一个组合策略:
| 信号 | RSI | KDJ | MACD |
|---|---|---|---|
| 买入 | 低于30 | 金叉 | 零轴下方金叉或底背离 |
| 卖出 | 高于70 | 死叉 | 零轴上方死叉或顶背离 |
| 持仓 | 30-70之间 | K线在D线上方 | DIF在DEA上方 |
你想想看,三个指标同时发出买入信号的概率有多大?不大。但一旦出现,胜率往往很高。我习惯用「2/3原则」——三个指标里至少两个发出同向信号,我才动手。
代码示例(Python):
import pandas as pd
import talib
# 计算三个指标
df['RSI'] = talib.RSI(df['close'], timeperiod=14)
df['K'], df['D'] = talib.STOCH(df['high'], df['low'], df['close'],
fastk_period=9, slowk_period=3, slowd_period=3)
df['MACD'], df['MACD_signal'], df['MACD_hist'] = talib.MACD(df['close'],
fastperiod=12, slowperiod=26, signalperiod=9)
# 组合信号
df['buy_signal'] = (df['RSI'] < 30) & (df['K'] > df['D']) & (df['MACD'] > df['MACD_signal'])
df['sell_signal'] = (df['RSI'] > 70) & (df['K'] < df['D']) & (df['MACD'] < df['MACD_signal'])
重要提醒:指标组合不是越多越好。三个指标已经够用了。再加第四个、第五个,反而容易陷入「信号冲突」的泥潭。记住一句话:简单的东西,往往最可靠。
4.5 知识体系总览
下面这张图,是我自己整理的这个章节的核心逻辑。你可以把它当作一个「速查地图」:
嗯,这张图基本把这一章的核心逻辑串起来了。你写代码的时候,可以对照着看,思路会清晰很多。
公众号:蓝海资料掘金营,微信deep3321