Java如何实现与Tradingview计算结果一致的RSI指标?
RSI和Tradingview结果不一致的原因及解决办法
核心差异来自平均涨跌的平滑计算逻辑,Tradingview的RSI使用**RMA(Wilder相对移动平均)**计算平均上涨和平均下跌,你的两个实现都不符合这个逻辑。
你的实现存在的问题
- 自定义实现:你当前用的是简单算术平均,即上涨总和除以上涨次数、下跌总和除以下跌次数,和RMA的迭代平滑逻辑完全不同,结果自然不一致。
- TA-Lib实现:调用
core.rsi时第四个参数传值错误,你设置的是length-1,如果要匹配Tradingview的14周期参数,该位置需要直接传入14,而非13。另外需要注意输入的收盘价序列长度需要至少15个(14次涨跌变化需要15个收盘价计算),输出结果的最后一个值才是最新K线对应的RSI。
Tradingview RSI的正确计算步骤
Tradingview代码里的rma函数计算逻辑为:RMA = 上一期RMA值 * (周期-1)/周期 + 当期值 * 1/周期
对应14周期RSI的完整计算流程:
- 取15个连续收盘价,计算得到14个相邻收盘价的差值
- 初始平均上涨:前14个差值中所有正值的和除以14;初始平均下跌:前14个差值中所有负值的绝对值之和除以14
- 后续每新增一个收盘价差值,按RMA公式迭代更新平均上涨和平均下跌:
- 当期平均上涨 = 上期平均上涨 * 13/14 + max(当期差值, 0) * 1/14
- 当期平均下跌 = 上期平均下跌 * 13/14 + max(-当期差值, 0) * 1/14
- 最终RSI计算:
rsi = 平均下跌 == 0 ? 100 : 平均上涨 == 0 ? 0 : 100 - (100 / (1 + 平均上涨 / 平均下跌))
按这个逻辑调整你的自定义实现,或者修正TA-Lib的调用参数,就能得到和Tradingview完全一致的RSI结果。
内容的提问来源于stack exchange,提问作者FaycalAire
相关产品推荐
相关产品推荐

