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
Calculate RSI from pandas dataframe
提问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