【Python】RSI(相对强弱指数)技术指标入门指南
RSI(Relative Strength Index)是技术分析中最经典的动量振荡指标,通过比较价格“平均上涨力度”与“平均下跌力度”,判断市场是否处于超买/超卖状态,实战中常用于捕捉趋势反转信号。
一、什么是 RSI?
RSI(Relative Strength Index,相对强弱指数)是趋势跟踪与反转交易的核心工具之一。
取值范围:0 ~ 100
默认周期:14(基于最近 14 根 K 线计算,适配多数品种的波动频率)
核心价值:
量化市场的“情绪极值”——涨得越猛、回调风险越高;跌得越狠、反弹概率越大。
二、RSI 的三个关键区域(实战意义)
| RSI 值范围 | 市场状态 | 实战操作建议 |
|---|---|---|
| 0 ~ 30 | 超卖区 | 空方力量耗尽,关注反弹入场点 |
| 30 ~ 70 | 中性区 | 趋势未明确,建议观望或轻仓 |
| 70 ~ 100 | 超买区 | 多方力量衰竭,关注回调出场点 |
重要提醒:
RSI 极端值(≤30 或 ≥70)不代表“立刻反转”,而是风险/机会的预警——需结合趋势、成交量或其他指标(如 MACD、均线)确认信号。
三、RSI 的数学计算(Wilder 平滑移动平均)
核心概念:
Wilder 平滑平均通过赋予近期数据更高权重,更敏感地捕捉价格变化。公式如下:
当前平均值=(前一日平均值×(周期−1)+当日值)周期
\text{当前平均值} = \frac{(\text{前一日平均值} \times (\text{周期}-1) + \text{当日值})}{\text{周期}}
当前平均值=周期(前一日平均值×(周期−1)+当日值)
计算步骤(以 NNN 日周期为例,原文默认 N=14N=14N=14):
- 计算每日价格变化
Changei=Pi−Pi−1(i=1,2,…,t) \text{Change}_i = P_i - P_{i-1} \quad (i=1,2,\dots,t) Changei=Pi−Pi−1(i=1,2,…,t) - 分离上涨(Gain)与下跌(Loss)
Gaini=max(Changei,0),Lossi=max(−Changei,0) \text{Gain}_i = \max(\text{Change}_i, 0), \quad \text{Loss}_i = \max(-\text{Change}_i, 0) Gaini=max(Changei,0),Lossi=max(−Changei,0) - 初始化 Wilder 平滑平均值
AvgGain0=1N∑i=1NGaini,AvgLoss0=1N∑i=1NLossi \text{AvgGain}_0 = \frac{1}{N} \sum_{i=1}^{N} \text{Gain}_i, \quad \text{AvgLoss}_0 = \frac{1}{N} \sum_{i=1}^{N} \text{Loss}_i AvgGain0=N1i=1∑NGaini,AvgLoss0=N1i=1∑NLossi - 迭代计算后续平滑平均值
AvgGaini=AvgGaini−1×(N−1)+GainiN,AvgLossi=AvgLossi−1×(N−1)+LossiN \text{AvgGain}_i = \frac{\text{AvgGain}_{i-1} \times (N-1) + \text{Gain}_i}{N}, \quad \text{AvgLoss}_i = \frac{\text{AvgLoss}_{i-1} \times (N-1) + \text{Loss}_i}{N} AvgGaini=NAvgGaini−1×(N−1)+Gaini,AvgLossi=NAvgLossi−1×(N−1)+Lossi - 计算 RSI
RS=AvgGainAvgLoss,RSI=100−1001+RS \text{RS} = \frac{\text{AvgGain}}{\text{AvgLoss}}, \quad \text{RSI} = 100 - \frac{100}{1 + \text{RS}} RS=AvgLossAvgGain,RSI=100−1+RS100- 特殊情况:若 AvgLoss=0\text{AvgLoss}=0AvgLoss=0(连续上涨),则 RSI=100\text{RSI}=100RSI=100;若 AvgGain=0\text{AvgGain}=0AvgGain=0(连续下跌),则 RSI=0\text{RSI}=0RSI=0。
四、Python 实战代码
def calculate_rsi(prices, period=14):
"""
计算RSI指标(Wilder平滑移动平均)
参数:
prices: 价格列表(按时间顺序,如[开盘价, 收盘价,...],需至少period+1个数据)
period: 计算周期(默认14,适配多数品种)
返回:
RSI值(保留2位小数),数据不足时抛出异常
"""
if len(prices) < period + 1:
raise ValueError("数据不足,至少需要 {} 个价格点".format(period + 1))
# 1. 计算每日价格变化
changes = [prices[i] - prices[i-1] for i in range(1, len(prices))]
# 2. 分离上涨(Gain)和下跌(Loss)
gains = [max(change, 0) for change in changes]
losses = [max(-change, 0) for change in changes]
# 3. 初始化AvgGain和AvgLoss(前period天的平均)
avg_gain = sum(gains[:period]) / period
avg_loss = sum(losses[:period]) / period
# 4. 迭代计算后续的平滑平均值(从第period+1天开始)
for i in range(period, len(gains)):
avg_gain = (avg_gain * (period - 1) + gains[i]) / period
avg_loss = (avg_loss * (period - 1) + losses[i]) / period
# 5. 计算RSI
if avg_loss == 0:
return 100.0 # 连续上涨,RSI=100
rs = avg_gain / avg_loss
rsi = 100 - (100 / (1 + rs))
return round(rsi, 2)
if __name__ == "__main__":
# 模拟数据
scenarios = {
"1. 连续上涨(超买)": [100, 102, 104, 106, 108, 110, 112, 114, 116, 118, 120, 122, 124, 126, 128],
"2. 连续下跌(超卖)": [128, 126, 124, 122, 120, 118, 116, 114, 112, 110, 108, 106, 104, 102, 100],
"3. 震荡上行(中性偏多)": [100, 101, 100, 102, 101, 103, 102, 104, 103, 105, 104, 106, 105, 107, 106],
"4. 震荡下行(中性偏空)": [106, 105, 106, 104, 105, 103, 104, 102, 103, 101, 102, 100, 101, 103, 102],
"5. 先涨后跌(回调信号)": [100, 105, 110, 115, 120, 125, 123, 120, 118, 115, 112, 110, 108, 105, 103]
}
print("RSI 实战模拟结果(周期=14)")
print("-" * 60)
for name, prices in scenarios.items():
rsi = calculate_rsi(prices, period=14)
status = ""
if rsi is not None:
if rsi >= 70:
status = "超买(警惕回调)"
elif rsi <= 30:
status = "超卖(关注反弹)"
else:
status = "中性(观望)"
print(f"{name:25} | RSI = {rsi:6} | {status}")
五、实战使用技巧
-
周期适配原则
- 日内短线:
period=9(敏感捕捉波动) - 中线趋势:
period=14(平衡灵敏度与稳定性) - 长线持仓:
period=21(过滤短期噪音)
- 日内短线:
-
背离信号强化策略
- 顶背离:价格新高但RSI未新高 → 卖出信号
- 底背离:价格新低但RSI未新低 → 买入信号
建议搭配MACD或成交量验证
-
极端值应对策略
- RSI=100时:等待回调至70以下再入场
- RSI=0时:等待反弹至30以上再做空
六、总结
RSI 是“市场情绪温度计”,擅长捕捉超买/超卖信号,但需注意:
- 滞后性:RSI信号常滞后于价格反转
- 适用性:震荡市中频繁失真,趋势市中更可靠
- 组合使用:建议与均线、布林带等指标搭配
6252

被折叠的 条评论
为什么被折叠?



