4、动量指标:相对强弱指标(RSI)、随机指标(KDJ)、MACD指标的原理与计算
动量指标,说白了就是帮我们判断价格涨跌的「力气」还剩多少。价格可以涨得很猛,但动量跟不上的时候,往往就是行情要变脸的前兆。我个人做量化交易这些年,动量指标是我策略里最常用的工具之一,尤其是RSI、KDJ和MACD这三个,几乎每个策略都会用到。
今天我们就来把这几个指标的原理和计算彻底讲清楚。嗯,我会结合自己踩过的坑,给你一些实战经验。
4.1 相对强弱指标(RSI)
RSI的全称是Relative Strength Index,中文叫相对强弱指标。它衡量的是「一段时间内,价格上涨的幅度占总体波动的比例」。说白了,就是看多头和空头谁更强势。
4.1.1 RSI的计算公式
RSI的计算其实不复杂,核心就两步:
- 计算周期内的平均上涨幅度和平均下跌幅度
- 用这两个值算出RSI
公式如下:
RS = 平均上涨幅度 / 平均下跌幅度
RSI = 100 - (100 / (1 + RS))
其中,周期通常取14天。平均上涨幅度 = 周期内所有上涨日的涨幅之和 / 周期天数。平均下跌幅度同理。
举个例子,假设过去14天里,有8天上涨,6天下跌。上涨的总幅度是20%,下跌的总幅度是10%。那么:
平均上涨 = 20% / 14 = 1.43%
平均下跌 = 10% / 14 = 0.71%
RS = 1.43% / 0.71% = 2.01
RSI = 100 - (100 / (1 + 2.01)) = 66.8
RSI值在0到100之间。一般认为,RSI大于70是超买,小于30是超卖。
重要经验: 我在项目中遇到过很多次,RSI到了80以上还在涨,或者跌到20以下还在跌。千万别把超买超卖当成「一定会反转」的信号。它只是告诉你「概率在变化」,不是「必然发生」。
4.1.2 RSI的实战用法
- 超买超卖: RSI > 70 考虑卖出,RSI < 30 考虑买入。但震荡市里好用,趋势市里容易失效。
- 背离: 价格创新高,但RSI没创新高,这叫顶背离,是卖出信号。反过来是底背离。
- RSI的形态: 比如RSI形成双顶或双底,也是不错的参考。
我的小技巧: 我习惯把RSI的参数调成9或21,而不是默认的14。9周期更敏感,适合短线;21周期更平滑,适合中线。你可以根据自己的交易周期来调整。
4.2 随机指标(KDJ)
KDJ指标,也叫随机指标。它和RSI有点像,但思路不同。KDJ关注的是「当前收盘价在最近一段时间价格区间里的位置」。如果收盘价靠近区间顶部,说明多头强;靠近底部,说明空头强。
4.2.1 KDJ的计算公式
KDJ有三条线:K线、D线、J线。计算分三步:
- 计算未成熟随机值RSV
- 计算K值和D值
- 计算J值
公式如下:
RSV = (收盘价 - 最近N天最低价) / (最近N天最高价 - 最近N天最低价) × 100
K值 = 2/3 × 前一日K值 + 1/3 × 当日RSV
D值 = 2/3 × 前一日D值 + 1/3 × 当日K值
J值 = 3 × K值 - 2 × D值
默认参数N=9,K和D的平滑系数是3。第一次计算时,K和D的初始值通常取50。
举个例子,假设某股票最近9天最高价是100元,最低价是80元,今天收盘价是95元:
RSV = (95 - 80) / (100 - 80) × 100 = 75
如果前一日K值是60,那么:
K值 = 2/3 × 60 + 1/3 × 75 = 65
D值 = 2/3 × 50 + 1/3 × 65 = 55
J值 = 3 × 65 - 2 × 55 = 85
4.2.2 KDJ的实战用法
- 超买超卖: K值 > 80 超买,K值 < 20 超卖。D值 > 80 也是超买。
- 金叉死叉: K线上穿D线是金叉,买入信号;K线下穿D线是死叉,卖出信号。
- J值极端: J值 > 100 或 J值 < 0 时,行情容易反转。
注意: 我曾经在震荡行情里用KDJ的金叉死叉做交易,效果还不错。但一遇到单边趋势,金叉死叉频繁出现,反而让我亏了不少钱。后来我学乖了——趋势行情里,KDJ的参考价值会大打折扣。
4.3 MACD指标
MACD,全称Moving Average Convergence Divergence,中文叫指数平滑异同移动平均线。它是我个人最喜欢的趋势指标之一。MACD的核心思想是:用两条不同周期的均线来判断趋势的强弱和方向。
4.3.1 MACD的计算公式
MACD由三部分组成:DIF线、DEA线、MACD柱状图。计算分三步:
- 计算快线(DIF):12日EMA减去26日EMA
- 计算慢线(DEA):DIF的9日EMA
- 计算柱状图:2 × (DIF - DEA)
公式如下:
EMA(12) = 前一日EMA(12) × 11/13 + 今日收盘价 × 2/13
EMA(26) = 前一日EMA(26) × 25/27 + 今日收盘价 × 2/27
DIF = EMA(12) - EMA(26)
DEA = 前一日DEA × 8/10 + 今日DIF × 2/10
MACD柱 = 2 × (DIF - DEA)
EMA的计算用了加权平滑,越近的数据权重越大。这也是MACD比普通均线更灵敏的原因。
4.3.2 MACD的实战用法
- 金叉死叉: DIF上穿DEA是金叉,买入信号;DIF下穿DEA是死叉,卖出信号。
- 零轴: DIF在零轴上方,说明多头市场;在零轴下方,说明空头市场。
- 背离: 价格创新高,但MACD柱没创新高,顶背离;价格创新低,但MACD柱没创新低,底背离。
- 柱状图变化: 柱状图由负转正,说明多头力量增强;由正转负,说明空头力量增强。
实战经验: 我记得有一次做股指期货,看到MACD在零轴上方形成金叉,我果断做多。结果第二天就跌了。后来复盘发现,虽然金叉了,但柱状图在缩小,说明多头力量在减弱。从那以后,我每次看MACD都会结合柱状图的变化来判断,而不是只看金叉死叉。
4.4 三个指标的对比与选择
这三个指标各有侧重,我一般会根据市场状态来选择:
| 指标 | 核心逻辑 | 适用场景 | 主要信号 |
|---|---|---|---|
| RSI | 涨跌幅度对比 | 震荡市、超买超卖判断 | 超买超卖、背离 |
| KDJ | 收盘价在区间内的位置 | 短线交易、震荡市 | 金叉死叉、超买超卖 |
| MACD | 均线差值的平滑处理 | 趋势行情、中线交易 | 金叉死叉、背离、零轴 |
你想想看,如果市场在震荡,RSI和KDJ会更好用。如果市场在走趋势,MACD会更靠谱。我个人习惯把MACD作为主趋势判断,RSI作为辅助过滤,KDJ用来找短线入场点。
4.5 核心知识体系
下面这张图展示了本章的核心逻辑,你可以看到三个指标之间的关系和各自的应用场景:
4.6 代码实现
下面我用Python实现了这三个指标的计算。代码里加了详细的注释,你可以直接拿去用:
import pandas as pd
import numpy as np
def calculate_rsi(data, period=14):
"""计算RSI指标"""
delta = data['close'].diff()
gain = delta.where(delta > 0, 0)
loss = -delta.where(delta < 0, 0)
avg_gain = gain.rolling(window=period).mean()
avg_loss = loss.rolling(window=period).mean()
rs = avg_gain / avg_loss
rsi = 100 - (100 / (1 + rs))
return rsi
def calculate_kdj(data, n=9, k_smooth=3, d_smooth=3):
"""计算KDJ指标"""
low_n = data['low'].rolling(window=n).min()
high_n = data['high'].rolling(window=n).max()
rsv = (data['close'] - low_n) / (high_n - low_n) * 100
k_values = [50] # 初始值
d_values = [50]
for i in range(1, len(rsv)):
if pd.isna(rsv.iloc[i]):
k_values.append(50)
d_values.append(50)
else:
k = 2/3 * k_values[-1] + 1/3 * rsv.iloc[i]
d = 2/3 * d_values[-1] + 1/3 * k
k_values.append(k)
d_values.append(d)
k = pd.Series(k_values, index=data.index)
d = pd.Series(d_values, index=data.index)
j = 3 * k - 2 * d
return k, d, j
def calculate_macd(data, fast=12, slow=26, signal=9):
"""计算MACD指标"""
ema_fast = data['close'].ewm(span=fast, adjust=False).mean()
ema_slow = data['close'].ewm(span=slow, adjust=False).mean()
dif = ema_fast - ema_slow
dea = dif.ewm(span=signal, adjust=False).mean()
macd_bar = 2 * (dif - dea)
return dif, dea, macd_bar
# 使用示例
# df = pd.read_csv('your_data.csv')
# df['rsi'] = calculate_rsi(df)
# df['k'], df['d'], df['j'] = calculate_kdj(df)
# df['dif'], df['dea'], df['macd'] = calculate_macd(df)
代码小提示: 实际使用中,我建议你先用历史数据回测一下,看看不同参数下指标的表现。比如RSI的周期,我试过从7到21,发现不同股票的最佳参数差别很大。别迷信默认参数,多试试。
好了,关于RSI、KDJ和MACD的原理与计算,我们就讲到这里。这三个指标是量化交易里最基础也最实用的动量指标。我个人建议你先把它们吃透,再考虑更复杂的指标。毕竟,简单的工具用好了,比复杂的工具乱用要强得多。