跳到主要内容

动量与超买超卖:RSI、MACD

直觉

「动量」衡量价格变化的速度与方向。RSI(相对强弱指标)回答「最近涨得猛还是跌得猛」,用来找超买/超卖MACD 用两条 EMA 的差离捕捉趋势的转折。两者都是技术分析的常客,本节给出它们的数学定义和实现。

RSI

RS=平均涨幅平均跌幅,RSI=1001001+RSRS = \frac{\text{平均涨幅}}{\text{平均跌幅}}, \qquad \text{RSI} = 100 - \frac{100}{1+RS}
「人话」解释:RSI 怎么读?

RSI 在 01000\sim100 之间。通常 RSI>70 视为超买(涨太多了,可能回调),RSI<30 视为超卖(跌过头了,可能反弹)。 50 是多空平衡线。注意:超买不等于「立刻跌」,强趋势里 RSI 可以长期高位。

MACD

MACD=EMA12EMA26,Signal=EMA9(MACD),Hist=MACDSignal\text{MACD} = \text{EMA}_{12} - \text{EMA}_{26}, \qquad \text{Signal} = \text{EMA}_9(\text{MACD}), \qquad \text{Hist} = \text{MACD} - \text{Signal}
  • MACD 上穿 Signal(Hist 由负转正)→ 金叉,看多信号;
  • MACD 下穿 Signal(Hist 由正转负)→ 死叉,看空信号。

可运行案例:计算 RSI 与 MACD

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt

df = pd.read_csv('/data/spy_daily.csv', parse_dates=['date']).set_index('date')
close = df['close']

# —— RSI(14) ——
delta = close.diff()
gain = delta.clip(lower=0); loss = -delta.clip(upper=0)
avg_gain = gain.ewm(alpha=1/14, adjust=False).mean()
avg_loss = loss.ewm(alpha=1/14, adjust=False).mean()
rs = avg_gain / avg_loss
rsi = 100 - 100 / (1 + rs)

# —— MACD ——
ema12 = close.ewm(span=12, adjust=False).mean()
ema26 = close.ewm(span=26, adjust=False).mean()
macd = ema12 - ema26
signal = macd.ewm(span=9, adjust=False).mean()
hist = macd - signal

recent_start = close.index.max() - pd.Timedelta(days=365)
close_r = close.loc[recent_start:]
rsi_r = rsi.loc[recent_start:]
macd_r = macd.loc[recent_start:]
signal_r = signal.loc[recent_start:]
hist_r = hist.loc[recent_start:]

fig, ax = plt.subplots(3, 1, figsize=(9, 6.5), sharex=True)
ax[0].plot(close_r, color="#2563eb"); ax[0].set_title("收盘价(近1年)")
ax[1].plot(rsi_r, color="#7c3aed"); ax[1].axhline(70, color='r', ls='--', lw=0.8)
ax[1].axhline(30, color='g', ls='--', lw=0.8); ax[1].set_title("RSI(14)  红70/绿30")
ax[2].plot(macd_r, color="#2563eb", label="MACD")
ax[2].plot(signal_r, color="crimson", label="Signal")
ax[2].bar(hist_r.index, hist_r, color="#94a3b8", width=1, label="Hist")
ax[2].set_title("MACD"); ax[2].legend(fontsize=8, loc='upper left')
plt.tight_layout(); plt.show()

小结

  • RSI = 平均涨幅/平均跌幅 的转化,>70>70 超买、<30<30 超卖;
  • MACD = EMA12 − EMA26,配 Signal(EMA9);金叉看多、死叉看空;
  • 指标是「描述」,不直接等于「信号」——模块 4 会把它们转成可回测的交易规则。