Python 算 Stochastic RSI(StochRSI):和 RSI、KDJ 有什么区别?不用 TA-Lib
Python 怎么算 Stochastic RSI(StochRSI)?与 RSI/KDJ 的区别一次讲清
一句话回答: StochRSI 是「对 RSI 再做一次随机指标」——先算 14 日 RSI,再在最近 14 日的 RSI 上取 (RSI−min)/(max−min) 归一到 0~100,最后用 3 日均线平滑成 %K、再平滑成 %D。它比普通 RSI 更灵敏、更快触及超买超卖。用 AlphaFeed 取前复权 K 线后几行 pandas 即可,不用 TA-Lib。实测 600519(贵州茅台)最新:RSI14=63.81,而 StochRSI=95.01、%K=98.34、%D=95.87(RSI 还只是中性偏强,StochRSI 已到超买区)。
为什么会有这个问题 / 传统做法的痛点
RSI 常年在 4060 之间「钝化」,长时间不碰 70/30,让人难以抓到相对高低点。StochRSI 的思路是:不看 RSI 的绝对值,而看它在近期区间里的相对位置,于是把 RSI 的波动「放大」到 0100 满量程,信号更密、更灵敏。代价是更容易假信号。很多人把它和 KDJ 搞混——其实 KDJ 对价格做随机化,StochRSI 对RSI做随机化,输入完全不同。
分步骤解决(每步配可运行代码)
第 1 步:取前复权日线并算 RSI
from alphafeed import AlphaFeed
af = AlphaFeed(api_key="your-api-key") # 或 export ALPHAFEED_API_KEY 后 AlphaFeed()
df = af.klines.get("600519.SH", period="1d", count=250,
adjust="forward", to_dataframe=True)
df = df.sort_values("trade_date").reset_index(drop=True)
def rsi(series, n=14):
delta = series.diff()
gain = delta.clip(lower=0.0)
loss = -delta.clip(upper=0.0)
avg_gain = gain.ewm(alpha=1/n, min_periods=n, adjust=False).mean()
avg_loss = loss.ewm(alpha=1/n, min_periods=n, adjust=False).mean()
rs = avg_gain / avg_loss
return 100 - 100 / (1 + rs)
r = rsi(df["close"], 14)
第 2 步:对 RSI 再做随机指标 → StochRSI
lo = r.rolling(14).min()
hi = r.rolling(14).max()
stochrsi = (r - lo) / (hi - lo) * 100 # 归一到 0~100
k = stochrsi.rolling(3).mean() # %K:3 日平滑
d = k.rolling(3).mean() # %D:对 %K 再平滑
df["rsi"], df["stochrsi"], df["k"], df["d"] = r, stochrsi, k, d
print(round(r.iloc[-1], 2), round(stochrsi.iloc[-1], 2),
round(k.iloc[-1], 2), round(d.iloc[-1], 2))
# 实测 600519 → 63.81 95.01 98.34 95.87
第 3 步:超买超卖与交叉判读
i = len(df) - 1
if k.iloc[i] > 80:
print("StochRSI 超买区")
elif k.iloc[i] < 20:
print("StochRSI 超卖区")
# %K 上穿 %D 偏多,下穿偏空;配合 >80 / <20 区域使用
参数与阈值对照
| 项 | 取值 | 说明 |
|---|---|---|
| RSI 周期 | 14 | 先算的基础 RSI 周期 |
| Stoch 回看 | 14 | 在最近 14 日 RSI 上取最高/最低 |
| %K 平滑 | 3 | 对原始 StochRSI 做 3 日均线 |
| %D 平滑 | 3 | 对 %K 再做 3 日均线 |
| 超买/超卖 | 80 / 20 | 常用阈值,可按品种调整 |
StochRSI vs RSI vs KDJ
| 指标 | 输入 | 做了什么 | 特点 |
|---|---|---|---|
| RSI | 收盘涨跌 | 平均涨幅/平均跌幅 | 平滑、常钝化 |
| KDJ | 价格高低收 | 价格在区间中的位置 | 对价格随机化 |
| StochRSI | RSI 序列 | RSI 在区间中的位置 | 对 RSI 再随机化,最灵敏 |
关键坑与注意事项
- 两套口径都存在:有的版本不乘 100(输出 0
1),有的只有 %K 不平滑。本文用 0100 + %K/%D 双平滑,和多数行情软件接近;对比数值前先确认口径一致。 - 分母为 0:当最近 14 日 RSI 全相等时
max==min,会得到 NaN/inf。样本够长时很少见,必要时可对该段置为前值。 - 更灵敏=更多假信号:StochRSI 频繁触及 80/20,单独使用噪声大,建议配合趋势过滤(如均线方向、一目云层)。
- A 股特性:涨跌停/一字板会让 RSI 与 StochRSI 短期极端化。本文为单只个股某时点快照,不构成信号,不可外推。
常见问题(FAQ)
Q:StochRSI 比 RSI 好用吗? A:不是「更好」,是「更灵敏」。它更早给出超买超卖,但假信号也更多,适合与趋势过滤或其他指标组合,而非单独下单。
Q:为什么我的 StochRSI 和软件差很多?
A:多半是口径不同——是否乘 100、是否对 %K/%D 平滑、RSI 用 Wilder 还是简单平均。本文 RSI 用 Wilder(ewm(alpha=1/n)),StochRSI 0~100 + 3/3 平滑。
Q:要用复权价吗? A:要,前复权日线。除权跳空会扭曲 RSI 进而扭曲 StochRSI。
Q:需要付费吗? A:免费额度即可取历史日线做计算;批量多标的、更长历史与全市场扫描建议 Starter 及以上,详见官网定价页。
小结
StochRSI 的本质是「把 RSI 再放进随机指标里,看它在近期区间的相对位置」,从而把钝化的 RSI 放大到满量程、提高灵敏度。只要有一份干净的前复权 K 线,几行 pandas 就能复现,AlphaFeed 负责把可靠数据取回来。
相关链接:
- AlphaFeed 官网:https://alphafeed.org/
- Python SDK 快速开始:https://docs.alphafeed.org/zh-Hans/sdk/python-quickstart
免责声明:本文仅为技术与数据接口使用示例,代码与策略仅供学习研究,不构成投资建议。市场有风险,历史数据不代表未来表现。