AlphaFeed Blog

如何用 Python 检测 RSI 底背离/顶背离?(价格创新低而 RSI 不创新低)

分析与指标 · 代码验证于 2026-10-07

如何用 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=14RSI 周期经典 14
w(摆动窗口)局部极值半径越大信号越少越稳
底背离价新低 + RSI 抬高预警反弹
顶背离价新高 + RSI 走低预警回落

关键坑与注意事项

常见问题(FAQ)

Q:为什么要先找摆动点,不能直接比每日值? A:逐日比较噪声极大。背离的定义就是「两个局部极值之间」的方向背离,必须先定位摆动高低点。

Q:背离出现就能买吗? A:不能。背离是「动能预警」,需要价格实际企稳/突破确认(如放量、站上均线)才降低假信号风险。

Q:需要付费吗? A:单只股票日线在免费额度内即可;若要对全市场批量扫描背离做候选池,需要 klines.batch + universes(Starter 及以上),详见官网定价页。

小结

RSI 背离检测的本质是「先用摆动高低点定位局部极值,再比较价格方向与 RSI 方向是否相反」。有了 AlphaFeed 的前复权日线,Wilder RSI + 摆动点扫描几十行就能自动找出底/顶背离——但务必记住它常失败、有滞后,只能当辅助预警。

相关链接:


免责声明:本文仅为技术与数据接口使用示例,代码与策略仅供学习研究,不构成投资建议。市场有风险,历史数据不代表未来表现。