传统RSI策略的核心是超卖买入、超买卖出的均值回归逻辑,识别出超卖/超买机会。
这里尝试基于网络资料,探索RSI相对强弱指数因子的计算方法,以及在实践中的应用逻辑。
1 RSI指标计算
RSI(相对强弱指数)的核心逻辑是衡量近期涨幅与跌幅的比值。
最常用的周期是14天(N=14)。
1.1 计算过程
计算分为三步,请按顺序操作:
第1步:计算每日的价格变动
上涨幅度(U) = 今日收盘价 − 昨日收盘价(若为负数,则记为 0)
下跌幅度(D)= 昨日收盘价 − 今日收盘价(若为负数,则记为 0)
(注:U 和 D 均为正值,二者不会同时大于0)
第2步:计算平均涨幅和平均跌幅
这里有两种主流算法,结果略有不同。
1)Wilder 原始平滑法(最常用)
先计算首日的初始平均值:AvgU₁ = 前14天U的总和 / 14,AvgD₁ = 前14天D的总和 / 14。
从第15天开始,使用递推公式:
AvgUₜ = (AvgUₜ₋₁ × 13 + 今日U) / 14
AvgDₜ = (AvgDₜ₋₁ × 13 + 今日D) / 14
本质是一种指数移动平均,赋予近期更大权重
TradingView默认使用 Wilder 法
2)简单移动平均 SMA
直接计算过去14天 U 和 D 的算术平均值。即 `AvgU = SUM(近14天U)/14`,每天滚动计算。
通达信、同花顺等软件默认使用此方法
第3步:计算 RS 和 RSI
相对强弱(RS) = AvgU / AvgD
RSI 值 = 100 - 100 / (1 + RS)
需要注意的是,若 AvgD = 0,即14天从未下跌,则 RSI 直接定义为 100。
1.2 数值示例
假设N=14
若某段周期内,平均涨幅为 10,平均跌幅为 5,则 RS = 10/5 = 2。
代入公式:RSI = 100 − (100 / (1+2)) = 100 − 33.33 = 66.67。
2 RSI因子
因为不同股票的 RSI 绝对值受波动率影响无法横向对比。
量化多因子选股或回测中,通常不会直接使用原始的 RSI(0~100)数值。
RSI因子通常指基于 RSI 衍生出的信号值或标准化值。
RSI最大局限性在于本质上是一个震荡市策略,在强趋势市场中容易失效。
实战中需要根据市场状态灵活调整参数和阈值,或与其他指标配合使用。
2.1 原始RSI因子
这里经常作为反转因子,即(取反)。
直接取当前股票的标准 RSI 数值(如14日RSI)。
RSI越高,未来短期下跌概率越大;
RSI越低,未来反弹概率越大。
最传统的是标准阈值法,将RSI数值划分为四个区域:
| RSI区间 | 市场状态 | 传统操作信号 |
|---|---|---|
| 80以上 | 极强/超买 | 卖出(物极必反) |
| 50~80 | 强势 | 买入/持有 |
| 20~50 | 弱势 | 卖出/观望 |
| 20以下 | 极弱/超卖 | 买入(伺机建仓) |
RSI > 70视为超买,发出卖出信号;
RSI < 30视为超卖,发出买入信号。
参数通常设为14日周期。
2.2 RSI 差分因子(动量衰减)
RSI_Diff = 今日RSI - 前N日RSI
比如减去5日前RSI。
衡量RSI的变动斜率。若 RSI 虽高但开始掉头向下(差分转负),是更强的卖出信号。
2.3 RSI 标准化因子
在每一个调仓日,计算全市场所有股票的 RSI 的Z-score
(个股RSI - 全市场RSI均值) / 全市场RSI标准差
剔除市场整体情绪影响,选出相对自身行业/市场处于超买或超卖的个股。
3 RSI计算实践
3.1 计算避坑提醒
1)除零处理
若遇到连续大涨(AvgD=0),RSI 直接赋值为 100,千万不能除以 0。
3)数据对齐
计算前务必确保收盘价序列是复权价格,否则除权除息会导致跳空,使 RSI 数值失真。
3)初始值影响
Wilder 法在第一个平均值计算时,如果仅用前14天简单平均,前20个左右的 RSI 值参考意义不大,一般建议预热至少 50~100 根 K 线后再使用。
3.2 Python计算代码
以下时计算RSI的python代码时示例,采用简单移动平均 SMA。
import pandas as pd
import numpy as np
def calculate_rsi(data, period=14):
# data 为包含 'close' 列的 DataFrame
delta = data['close'].diff()
gain = (delta.where(delta > 0, 0)).rolling(window=period).mean()
loss = (-delta.where(delta < 0, 0)).rolling(window=period).mean()
# 注意:这里用的是 SMA 法;若需 Wilder 法,将 rolling_mean 改为 ewm(alpha=1/period)
rs = gain / loss
rsi = 100 - (100 / (1 + rs))
# 处理除零(loss=0)
rsi = rsi.fillna(100)
return rsi
如果构造"取反后的反转因子,在计算出上述 RSI 原始值后,直接乘以 -1即可。
更精确的做法是当 RSI 从超买区(>70)回落跌破70时赋值为 -1(空头信号),从超卖区(<30)回升突破30时赋值为 +1(多头信号)。
reference
RSI超买/超卖交易策略
https://www.shinnytech.com/articles/trading-strategy/mean-reversion/rsi-strategy
相对强弱指标(RSI)
https://www.cfachina.org/inv/zsyd/qhabc/jsmfx/201510/t20151023_20308.html
RSI 钩形反转策略
https://doc.stocksharp.com/zh/api-examples/0092_RSI_Hook_Reversal
RSI Hook Reversal Strategy (C#)
https://stocksharp.com/zh/store/stocksharp.strategies.0092_rsi_hook_reversal