动量与超买超卖:RSI、MACD
直觉
「动量」衡量价格变化的速度与方向。RSI(相对强弱指标)回答「最近涨得猛还是跌得猛」,用来找超买/超卖;MACD 用两条 EMA 的差离捕捉趋势的转折。两者都是技术分析的常客,本节给出它们的数学定义和实现。
RSI
「人话」解释:RSI 怎么读?
RSI 在 之间。通常 RSI>70 视为超买(涨太多了,可能回调),RSI<30 视为超卖(跌过头了,可能反弹)。
50 是多空平衡线。注意:超买不等于「立刻跌」,强趋势里 RSI 可以长期高位。
MACD
- 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 = 平均涨幅/平均跌幅 的转化, 超买、 超卖;
- MACD = EMA12 − EMA26,配 Signal(EMA9);金叉看多、死叉看空;
- 指标是「描述」,不直接等于「信号」——模块 4 会把它们转成可回测的交易规则。