You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

按照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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.04 03:21:01