pandas 从熊猫数据帧计算 RSI

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/39702156/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-09-14 02:05:31  来源:igfitidea点击:

Calculate RSI from pandas dataframe

pythonpandasdataframedivision

提问by CronosVirus00

I have got a df with value from forex market and I'm trying to put into the data frame the RSI, relative strength index(10), for each row in the df.

我从外汇市场获得了一个具有价值的 df,我正在尝试将 df 中每一行的 RSI、相对强度指数 (10) 放入数据框中。

df.head()
Out[3]: 
        Date      Time     Open     High      Low    Close  Volume  OpenInt
0 2016-09-16  00:05:00  0.75183  0.75186  0.75160  0.75161       0        0
1 2016-09-16  00:10:00  0.75156  0.75156  0.75145  0.75149       0        0
2 2016-09-16  00:15:00  0.75156  0.75166  0.75152  0.75165       0        0
3 2016-09-16  00:20:00  0.75164  0.75165  0.75150  0.75156       0        0
4 2016-09-16  00:25:00  0.75156  0.75174  0.75153  0.75156       0        0

RSI is an indicator that tells you when the product is oversold or overbought; RSI = 100 - 100 / (1 + RS) where RS is the average gain of up periods in a given time frame / the average of loss of down period in a given time frame. In my case, time frame is 10.

RSI 是告诉您产品何时超卖或超买的指标;RSI = 100 - 100 / (1 + RS) 其中 RS 是给定时间范围内上行周期的平均增益/给定时间范围内下行周期的平均损失。就我而言,时间范围是 10。

df.change = df.Open - df.Close # find out if there is a gain or a loss

df.gain = df.change [df.change > 0] #column of gain

df.loss = df.change [df.change < 0]# column of loss

df.again = df.gain.rolling(center=False,window=10) #find the average gain in the last 10 periods 

df.aloss = df.loss.rolling(center=False,window=10) #find the average loss in the last 10 periods

Now is where the troubles begin; I need to get the RS:

现在是麻烦开始的地方;我需要得到 RS:

df.rs = df.again/df.aloss

TypeErrorTraceback (most recent call last)
<ipython-input-13-2886bcd78f42> in <module>()
----> 1 df.rs = df.again/df.aloss

TypeError: unsupported operand type(s) for /: 'Rolling' and 'Rolling'

Thank you for the help, Cronos

谢谢你的帮助,克罗诺斯

EDIT

编辑

df.gain.head(6)
Out[31]: 
0    0.00022
1    0.00007
3    0.00008
5    0.00002
7    0.00003
8    0.00002

df.loss.head(6)
Out[32]: 
2    -0.00009
6    -0.00019
9    -0.00013
14   -0.00002
15   -0.00011
20   -0.00008
dtype: float64

回答by DanGoodrick

delta = df.Close.diff()
window = 15
up_days = delta.copy()
up_days[delta<=0]=0.0
down_days = abs(delta.copy())
down_days[delta>0]=0.0
RS_up = up_days.rolling(window).mean()
RS_down = down_days.rolling(window).mean()
rsi= 100-100/(1+RS_up/RS_down)

回答by Rajib Kumar Dey

For average gain or loss, opening price doesn't matter. It have to calculate always with closing price compared to previous candle stick's closing price.

对于平均收益或损失,开盘价并不重要。它必须始终以收盘价与之前烛台收盘价相比较的方式进行计算。

def rsiFunc(prices, n=14):
deltas = np.diff(prices)
seed = deltas[:n+1]
up = seed[seed>=0].sum()/n
down = -seed[seed<0].sum()/n
rs = up/down
rsi = np.zeros_like(prices)
rsi[:n] = 100. - 100./(1.+rs)

for i in range(n, len(prices)):
    delta = deltas[i-1] # cause the diff is 1 shorter

    if delta>0:
        upval = delta
        downval = 0.
    else:
        upval = 0.
        downval = -delta

    up = (up*(n-1) + upval)/n
    down = (down*(n-1) + downval)/n

    rs = up/down
    rsi[i] = 100. - 100./(1.+rs)

return rsi

I took it from https://github.com/mtamer/python-rsi/blob/master/Stock%20Screener/rsi.py

我从https://github.com/mtamer/python-rsi/blob/master/Stock%20Screener/rsi.py