【Python】RSI(相对强弱指数)技术指标入门指南


【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):

  1. 计算每日价格变化
    Changei=Pi−Pi−1(i=1,2,…,t) \text{Change}_i = P_i - P_{i-1} \quad (i=1,2,\dots,t) Changei=PiPi1(i=1,2,,t)
  2. 分离上涨(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)
  3. 初始化 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=1NGaini,AvgLoss0=N1i=1NLossi
  4. 迭代计算后续平滑平均值
    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=NAvgGaini1×(N1)+Gaini,AvgLossi=NAvgLossi1×(N1)+Lossi
  5. 计算 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=1001+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}")

五、实战使用技巧

  1. 周期适配原则

    • 日内短线:period=9(敏感捕捉波动)
    • 中线趋势:period=14(平衡灵敏度与稳定性)
    • 长线持仓:period=21(过滤短期噪音)
  2. 背离信号强化策略

    • 顶背离:价格新高但RSI未新高 → 卖出信号
    • 底背离:价格新低但RSI未新低 → 买入信号
      建议搭配MACD或成交量验证
  3. 极端值应对策略

    • RSI=100时:等待回调至70以下再入场
    • RSI=0时:等待反弹至30以上再做空

六、总结

RSI 是“市场情绪温度计”,擅长捕捉超买/超卖信号,但需注意:

  1. 滞后性:RSI信号常滞后于价格反转
  2. 适用性:震荡市中频繁失真,趋势市中更可靠
  3. 组合使用:建议与均线、布林带等指标搭配

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值