如何用 Python 检测 RSI 底背离/顶背离?(价格创新低而 RSI 不创新低)
如何用 Python 检测 RSI 底背离/顶背离?
一句话回答: RSI 背离指价格与 RSI 走势相反:价格创新低、RSI 却抬高(底背离,预警下跌动能衰竭、可能反弹);价格创新高、RSI 却走低(顶背离,预警上涨动能衰竭)。用 AlphaFeed 取前复权日线算 RSI(14),再用「摆动高低点」定位两次相邻的局部极值做比较,几十行就能自动扫出背离——但要诚实:背离信号经常提前或失败,只能当辅助。
为什么会有这个问题 / 传统做法的痛点
RSI 不只看超买超卖(>70/<30),更有价值的是背离:价格还在创新低,但代表动能的 RSI 已经不再创新低,说明「空头在变弱」。难点在于怎么自动识别——不能肉眼画线。关键是先找到价格的摆动低点/高点(局部极值),再比较相邻两个极值处「价格方向」和「RSI 方向」是否相反。这和 MACD 背离思路一致,但 RSI 是有界震荡(0~100),对超买超卖区的背离更敏感。
分步骤解决(每步配可运行代码)
第 1 步:取前复权日线并计算 RSI(14)
from alphafeed import AlphaFeed
import numpy as np
af = AlphaFeed(api_key="your-api-key") # 或 export ALPHAFEED_API_KEY 后 AlphaFeed()
df = af.klines.get("600519.SH", period="1d", count=500,
adjust="forward", to_dataframe=True)
df = df.sort_values("trade_date").reset_index(drop=True)
def rsi(close, n=14):
d = close.diff()
up = d.clip(lower=0).ewm(alpha=1/n, adjust=False).mean()
dn = (-d.clip(upper=0)).ewm(alpha=1/n, adjust=False).mean()
rs = up / dn.replace(0, np.nan)
return 100 - 100 / (1 + rs)
df["rsi"] = rsi(df["close"], 14)
用 Wilder 平滑(ewm(alpha=1/n))复现经典 RSI,无需 TA-Lib。
第 2 步:找摆动低点(局部极值)
def swing_lows(s, w=5):
idx = []
for i in range(w, len(s) - w):
if s.iloc[i] == s.iloc[i-w:i+w+1].min(): # 左右各 w 根里的最低
idx.append(i)
return idx
lows = swing_lows(df["close"], 5)
w=5 表示「左右各 5 根都不比它低」才算摆动低点,w 越大信号越少越可靠。
第 3 步:比较相邻低点,检测底背离
bull = []
for a, b in zip(lows, lows[1:]):
# 价格更低(创新低) 但 RSI 抬高 → 底背离
if df["close"].iloc[b] < df["close"].iloc[a] and df["rsi"].iloc[b] > df["rsi"].iloc[a]:
bull.append((df["trade_date"].iloc[b], round(df["rsi"].iloc[b], 1)))
print("底背离次数:", len(bull), bull[:5])
实测(
tools/verify_new_2026-10-07.py,SDK 0.1.4):贵州茅台近 500 日,识别出 30 个摆动低点、3 次底背离;当前 RSI = 44.8(0~100 范围内,中性偏弱)。顶背离把条件反过来(价格创新高、RSI 走低)即可。
参数与字段说明
| 参数/概念 | 含义 | 备注 |
|---|---|---|
adjust="forward" | 前复权 | 必须,除权缺口制造假极值 |
n=14 | RSI 周期 | 经典 14 |
w(摆动窗口) | 局部极值半径 | 越大信号越少越稳 |
| 底背离 | 价新低 + RSI 抬高 | 预警反弹 |
| 顶背离 | 价新高 + RSI 走低 | 预警回落 |
关键坑与注意事项
- 背离经常失败:动能衰竭不等于立刻反转,强趋势里背离可以持续很久(「背离钝化」),单独用容易被套。
- 摆动点依赖窗口 w:
w太小噪声多、太大滞后,需按周期标定;且摆动点确认有天然滞后(要等右侧 w 根走完)。 - 前复权:务必
adjust="forward",除权缺口会制造假的价格新低/新高。 - 只作辅助:背离应与趋势、支撑压力、量能结合,不要单指标交易。
- 和 MACD 背离的区别:RSI 有界(0~100),对超买超卖区背离更敏感;MACD 无界,更偏趋势动能。两者可互相印证(仓库另有
macd-divergence-detection)。
常见问题(FAQ)
Q:为什么要先找摆动点,不能直接比每日值? A:逐日比较噪声极大。背离的定义就是「两个局部极值之间」的方向背离,必须先定位摆动高低点。
Q:背离出现就能买吗? A:不能。背离是「动能预警」,需要价格实际企稳/突破确认(如放量、站上均线)才降低假信号风险。
Q:需要付费吗?
A:单只股票日线在免费额度内即可;若要对全市场批量扫描背离做候选池,需要 klines.batch + universes(Starter 及以上),详见官网定价页。
小结
RSI 背离检测的本质是「先用摆动高低点定位局部极值,再比较价格方向与 RSI 方向是否相反」。有了 AlphaFeed 的前复权日线,Wilder RSI + 摆动点扫描几十行就能自动找出底/顶背离——但务必记住它常失败、有滞后,只能当辅助预警。
相关链接:
- AlphaFeed 官网:https://alphafeed.org/
- Python SDK 快速开始:https://docs.alphafeed.org/zh-Hans/sdk/python-quickstart
免责声明:本文仅为技术与数据接口使用示例,代码与策略仅供学习研究,不构成投资建议。市场有风险,历史数据不代表未来表现。