使用熊猫的相对强度指数计算

时间:2019-02-14 19:03:10

标签: python pandas finance

我正在尝试使用大熊猫计算相对强度指数(RSI),并且似乎无法适当地采用here提供的解决方案。为什么它不返回RSI系列?

import pandas_datareader.data as web
import datetime
start = datetime.datetime(2018, 2, 8)
end = datetime.datetime(2019, 2, 8)
stock = 'TNA'
price = web.DataReader(stock,'yahoo', start, end)

n = 14

def RSI(series):    
    delta = series.diff()
    u = delta * 0 
    d = u.copy()
    i_pos = delta > 0
    i_neg = delta < 0
    u[i_pos] = delta[i_pos]
    d[i_neg] = delta[i_neg]
    rs = moments.ewma(u, span=27) / moments.ewma(d, span=27)
    return 100 - 100 / (1 + rs)

print(rsi(price, n))

1 个答案:

答案 0 :(得分:0)

这里是黑暗中的镜头,因为您没有提供太多背景信息。

pandas.stats.moment.ewma在0.23.0中不再受支持。现在可以使用pd.Series.ewm实现指数加权的窗口。这将返回exponentially-weighted-windows object窗口对象,如果不提供滚动窗口的方法,则该窗口对象无法在任何等式中使用。这是可用方法的列表:

rs.agg         rs.apply       rs.count       rs.exclusions  rs.max         rs.median      rs.name        rs.skew        r.sum
rs.aggregate   rs.corr        rs.cov         rs.kurt        rs.mean        rs.min         rs.quantile    rs.std         rs.var

我假设您从here复制了上面的函数,而该函数似乎并没有回答OP。如果要使用范围为price.Close的系列n进行此分析,并计算每个指数加权窗口的mean

import pandas_datareader.data as web
import datetime
import pandas as pd

ewma = pd.Series.ewm
start = datetime.datetime(2018, 2, 8)
end = datetime.datetime(2019, 2, 8)
stock = 'TNA'
price = web.DataReader(stock,'yahoo', start, end)

n = 14

def RSI(series,n):    
    delta = series.diff()
    u = delta * 0 
    d = u.copy()
    i_pos = delta > 0
    i_neg = delta < 0
    u[i_pos] = delta[i_pos]
    d[i_neg] = delta[i_neg]
    rs = ewma(u, span=n).mean() / ewma(d, span=n).mean()
    return 100 - 100 / (1 + rs)

print(RSI(price.Close,n))