4、动量指标:相对强弱指标(RSI)、随机指标(KDJ)、MACD指标的原理与计算

动量指标,说白了就是帮我们判断价格涨跌的「力气」还剩多少。价格可以涨得很猛,但动量跟不上的时候,往往就是行情要变脸的前兆。我个人做量化交易这些年,动量指标是我策略里最常用的工具之一,尤其是RSI、KDJ和MACD这三个,几乎每个策略都会用到。

今天我们就来把这几个指标的原理和计算彻底讲清楚。嗯,我会结合自己踩过的坑,给你一些实战经验。

4.1 相对强弱指标(RSI)

RSI的全称是Relative Strength Index,中文叫相对强弱指标。它衡量的是「一段时间内,价格上涨的幅度占总体波动的比例」。说白了,就是看多头和空头谁更强势。

4.1.1 RSI的计算公式

RSI的计算其实不复杂,核心就两步:

  1. 计算周期内的平均上涨幅度和平均下跌幅度
  2. 用这两个值算出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线。计算分三步:

  1. 计算未成熟随机值RSV
  2. 计算K值和D值
  3. 计算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柱状图。计算分三步:

  1. 计算快线(DIF):12日EMA减去26日EMA
  2. 计算慢线(DEA):DIF的9日EMA
  3. 计算柱状图: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 核心知识体系

下面这张图展示了本章的核心逻辑,你可以看到三个指标之间的关系和各自的应用场景:

动量指标知识体系 动量指标 RSI 相对强弱指标 KDJ 随机指标 MACD 异同移动平均线 核心:涨跌幅度对比 信号:超买超卖、背离 适用:震荡市 核心:收盘价在区间位置 信号:金叉死叉、超买超卖 适用:短线、震荡市 核心:均线差值平滑 信号:金叉死叉、背离、零轴 适用:趋势行情、中线 实战建议:MACD做主趋势判断 RSI做辅助过滤,KDJ找入场点

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的原理与计算,我们就讲到这里。这三个指标是量化交易里最基础也最实用的动量指标。我个人建议你先把它们吃透,再考虑更复杂的指标。毕竟,简单的工具用好了,比复杂的工具乱用要强得多。

专注资料整理