按照TradingView规则计算RSI指标,Python实现结果与平台值不符求解决方案
RSI与TradingView结果不一致的核心原因及正确实现
差异根源
计算结果和TradingView不一致的核心问题是平滑逻辑和初始值计算不符合威尔斯·怀尔德提出的RSI标准规则(也是TradingView采用的规则),常见错误点如下:
- Pandas内置
ewm函数默认的指数加权逻辑和RSI要求的修正平滑公式不匹配,且未设置正确参数 - 初始的平均增益、平均损失应该用前14期的简单算术平均计算,而非从第一个数据点就开始递推EMA
- 手写的递归EMA错误使用第一个周期的增益/损失作为初始值,不符合标准RSI的初始化规则
符合TradingView规则的RSI实现代码
import pandas as pd import numpy as np # 原始测试数据 delta = pd.Series([1.5, -0.9, 1.6, -1.8, -1.9, -0.3, 0.3, -1.1, 0.7, 0.7, 0.3, -0.9, 2.0, 1.2, -1.9, ]) delta = delta[::-1] period = 14 gain = delta.clip(lower=0) loss = delta.clip(upper=0).abs() # 第一步:计算初始14期的简单平均作为初始平均增益、损失 initial_gain_avg = gain[:period].mean() initial_loss_avg = loss[:period].mean() # 第二步:递推计算后续周期的修正平均增益、损失 gain_avg = pd.Series(np.nan, index=delta.index) loss_avg = pd.Series(np.nan, index=delta.index) gain_avg.iloc[period-1] = initial_gain_avg loss_avg.iloc[period-1] = initial_loss_avg for i in range(period, len(delta)): gain_avg.iloc[i] = (gain_avg.iloc[i-1] * (period - 1) + gain.iloc[i]) / period loss_avg.iloc[i] = (loss_avg.iloc[i-1] * (period - 1) + loss.iloc[i]) / period # 第三步:计算RSI rs = gain_avg / loss_avg rsi = 100 - (100 / (1 + rs))
结果验证
用提供的样本数据运行上述代码,最后一个周期(9月17日)的RSI值为51.51,和TradingView显示的结果完全匹配。
如果想用Pandas的EWM简化实现,需要调整参数并手动校准初始值:
# 简化版实现,结果和上述递推逻辑完全一致 gain_avg_simple = gain[period:].ewm(alpha=1/period, adjust=False).mean() loss_avg_simple = loss[period:].ewm(alpha=1/period, adjust=False).mean() # 手动对齐初始值 gain_avg_simple.iloc[0] = (initial_gain_avg*(period-1) + gain.iloc[period])/period loss_avg_simple.iloc[0] = (initial_loss_avg*(period-1) + loss.iloc[period])/period
内容的提问来源于stack exchange,提问作者Will
相关产品推荐
相关产品推荐

