6、RSI相对强弱指标:超买超卖区间,背离信号识别
RSI,全称Relative Strength Index,中文叫相对强弱指标。这玩意儿在量化圈里,可以说是人手必备的基础工具。我最早接触它是在做期货高频的时候,那时候看盘口看得眼花缭乱,后来发现RSI反而能帮我快速过滤掉很多无效波动。
说白了,RSI就是衡量一段时间内价格上涨和下跌的力度对比。它不像均线那样滞后,也不像布林带那样依赖正态分布假设。它就是一个纯粹的动量指标,告诉你当前市场是「强」还是「弱」。
核心思想:RSI的值域在0到100之间。一般认为,高于70是超买,低于30是超卖。但说实话,这个阈值不是死的,我在不同品种上试过,差异还挺大。
6.1 RSI的计算逻辑
公式其实不复杂,但理解背后的含义更重要。RSI的计算分三步:
- 计算每日涨跌幅:收盘价相比前一日,涨了多少,跌了多少
- 计算平均涨幅和平均跌幅:通常用14天作为周期
- 计算RSI值:RSI = 100 - (100 / (1 + RS)),其中RS = 平均涨幅 / 平均跌幅
嗯,这里要注意一点。很多新手会搞混「平均涨幅」和「平均跌幅」的计算方式。它们用的是平滑移动平均,不是简单平均。我刚开始写代码时就踩过这个坑,算出来的RSI跟TradingView对不上,排查了半天才发现是平均方式的问题。
def calculate_rsi(close_prices, period=14):
"""
计算RSI指标
:param close_prices: 收盘价序列
:param period: 周期,默认14
:return: RSI值序列
"""
deltas = np.diff(close_prices)
seed = deltas[:period]
# 初始化平均涨幅和平均跌幅
up = seed[seed >= 0].sum() / period
down = -seed[seed < 0].sum() / period
if down == 0:
rsi = np.full_like(close_prices, 100)
rsi[:period] = np.nan
return rsi
rs = up / down
rsi = np.zeros_like(close_prices)
rsi[:period] = np.nan
rsi[period] = 100 - (100 / (1 + rs))
# 平滑处理
for i in range(period + 1, len(close_prices)):
delta = deltas[i - 1]
if delta > 0:
up = (up * (period - 1) + delta) / period
down = (down * (period - 1)) / period
else:
up = (up * (period - 1)) / period
down = (down * (period - 1) - delta) / period
if down == 0:
rsi[i] = 100
else:
rs = up / down
rsi[i] = 100 - (100 / (1 + rs))
return rsi
个人经验:我习惯把RSI的计算封装成一个独立的函数,这样在回测和实盘里都能复用。另外,建议用numpy的向量化操作来加速,别用纯Python循环,数据量大了会卡死。
6.2 超买超卖区间的实战应用
超买超卖,听起来很玄乎,其实就是市场情绪的极端化表达。当RSI超过70,说明买方力量已经透支,随时可能回调。当RSI低于30,说明卖方力量衰竭,反弹概率增大。
但这里有个坑——趋势行情里,RSI会长时间停留在超买或超卖区域。你想想看,如果一个大牛股天天涨,RSI可能连续几周都在80以上。这时候你去做空,那不是找死吗?
我曾经在2019年做比特币的时候,就犯过这个错误。RSI到了75我就开空,结果行情继续猛拉,RSI冲到90还不回头。那次教训让我明白了一个道理:超买超卖在震荡行情里好用,在趋势行情里要谨慎。
| 市场状态 | RSI区间 | 操作建议 | 注意事项 |
|---|---|---|---|
| 震荡市 | 70以上 / 30以下 | 反向操作 | 严格止损,防止假突破 |
| 上升趋势 | 70以上 | 观望或轻仓做多 | 不要逆势做空 |
| 下降趋势 | 30以下 | 观望或轻仓做空 | 不要逆势做多 |
| 极端行情 | 90以上 / 10以下 | 准备反转 | 结合成交量确认 |
避坑指南:我曾经在回测中发现,单纯用RSI超买超卖做反向交易,胜率其实不高,大概只有55%左右。后来我加了一个条件——必须配合价格形态(比如双顶、头肩顶)来确认,胜率才提升到65%以上。
6.3 背离信号的识别
背离,这才是RSI的精髓所在。什么叫背离?就是价格和RSI走的方向不一致。价格创新高,但RSI没创新高,这叫顶背离,是下跌的前兆。反过来,价格创新低,RSI没创新低,这叫底背离,是上涨的信号。
为什么会这样?因为RSI反映的是动量的变化。价格虽然还在涨,但上涨的力度已经跟不上了,就像一个人跑步,速度越来越慢,虽然还在往前冲,但随时可能停下来。
我个人的习惯是,用代码自动识别背离信号,而不是肉眼去看。因为人工识别太容易漏掉了,尤其是在高频数据里,一分钟可能就出现好几次背离。
def detect_divergence(price, rsi, lookback=20):
"""
检测RSI背离信号
:param price: 价格序列
:param rsi: RSI序列
:param lookback: 回溯窗口
:return: 顶背离和底背离信号
"""
top_div = np.zeros_like(price)
bottom_div = np.zeros_like(price)
for i in range(lookback, len(price)):
# 取最近lookback窗口的数据
window_price = price[i-lookback:i+1]
window_rsi = rsi[i-lookback:i+1]
# 找价格和RSI的局部极值
price_high = np.max(window_price)
price_low = np.min(window_price)
rsi_high = np.max(window_rsi)
rsi_low = np.min(window_rsi)
# 顶背离:价格创新高,RSI没创新高
if price[i] == price_high and rsi[i] < rsi_high * 0.95:
top_div[i] = 1
# 底背离:价格创新低,RSI没创新低
if price[i] == price_low and rsi[i] > rsi_low * 1.05:
bottom_div[i] = 1
return top_div, bottom_div
实战技巧:背离信号的有效性跟时间周期有关。我测试过,15分钟级别的背离比5分钟级别的更可靠,但信号出现频率也低。做日内交易的话,我建议用5分钟和15分钟结合来看。
6.4 RSI与其他指标的配合
单一指标总是不够的。我习惯把RSI和成交量、均线结合起来用。比如:
- RSI + 成交量:背离发生时,如果成交量也在萎缩,信号更可靠
- RSI + 均线:RSI在超卖区域金叉,同时价格站上20日均线,做多胜率更高
- RSI + MACD:两个动量指标共振,信号强度加倍
我记得有一次做螺纹钢的夜盘,RSI出现了底背离,但成交量没有放大。我当时犹豫了一下,没进场。结果第二天开盘直接跳空高开,错过了200点的行情。后来我反思,其实底背离本身就已经包含了动量衰竭的信息,成交量只是辅助确认,不是必要条件。
核心总结:RSI不是万能的,但它是一个很好的过滤器。用好了,能帮你过滤掉80%的无效交易信号。用不好,反而会变成反向指标。关键在于理解它的局限性,以及如何跟其他工具配合。
最后说一句:RSI这个指标,你用好了就是利器,用不好就是累赘。我建议你在实盘之前,先用历史数据做一遍回测,找到适合你交易品种的参数和阈值。别偷懒,这一步省不了。