使用numpy RMA在python中创建Tradingview RSI

lsmepo6l  于 2023-11-18  发布在  Python
关注(0)|答案(1)|浏览(159)

这里有一些链接,我用来拿出代码
https://www.tradingview.com/pine-script-reference/v5/#fun_ta.rma
所以我一直在搜索,找出如何创建rsi像tradingview和后,看了一吨的stackoverview问题,我能够找到一个真正帮助我找出问题是什么.这是答案在这里Pandas.Series.ewm for calculating a RSI Indicator, with Wilders Moving Average
事实上,第一个平均值是使用过去rsi长度的平均值计算的.像这样

  1. avg_gain[period] = gain[1 : period + 1].mean()

字符串
然后,在您这样做之后,您应用rma tradingview计算https://www.tradingview.com/pine-script-reference/v5/#fun_ta.rma

  1. pine_rma(src, length) =>
  2. alpha = 1/length
  3. sum = 0.0
  4. sum := na(sum[1]) ? ta.sma(src, length) : alpha * src + (1 - alpha) * nz(sum[1])


所以我想出的公式是这样的,我检查了一下,所有的东西都是98%的准确率......通常它是由.1或.05 ......但仍然超级超级接近

  1. import numpy as np
  2. def qf_tv_calc_rsi_wilder(prices: np.array, period: int):
  3. prices_shift = np.roll(prices, 1)
  4. prices_shift[0] = np.nan
  5. pchg = (prices - prices_shift) / prices_shift
  6. alpha = 1 / period
  7. gain = np.where(pchg > 0, pchg, 0)
  8. avg_gain = np.full_like(gain, np.nan)
  9. loss = np.where(pchg < 0, abs(pchg), 0)
  10. avg_loss = np.full_like(loss, np.nan)
  11. avg_gain[period] = gain[1 : period + 1].mean()
  12. avg_loss[period] = loss[1 : period + 1].mean()
  13. for i in range(period + 1, gain.size):
  14. avg_gain[i] = alpha * gain[i] + (1 - alpha) * avg_gain[i - 1]
  15. avg_loss[i] = alpha * loss[i] + (1 - alpha) * avg_loss[i - 1]
  16. rs = avg_gain / avg_loss
  17. rsi = 100 - (100 / (1 + rs))
  18. return rsi


this is my rsi
this is tradingviews rsi ... toward the start it gets a little crazy but that is because i only downloaded 200 candles while tradingview is using like 3000
所以我的问题是在for循环中,我试图向量化它,但它不起作用

  1. avg_gain[period + 1 :] = alpha * gain[period + 1 :] + (1 - alpha) * avg_gain[period]
  2. avg_loss[period + 1 :] = alpha * loss[period + 1 :] + (1 - alpha) * avg_loss[period]


它会吐出一些疯狂的数字.有谁知道我怎么才能摆脱for循环?

798qvoo8

798qvoo81#

此脚本将给予一个相当接近的RSI值,而无需循环遍历数据集。
https://github.com/ImDakshitha/tradingview_rsi
但可能需要更大的数据集来获得更准确的结果(大约100个数据点)

相关问题