相对强弱指数函数Python

时间:2014-07-29 16:46:17

标签: python

我正在创建一个模拟股票交易者用来查找偏离正常趋势的数据的相对强弱指数(RSI)的函数。 RSI的等式是:100 - (100/1 + RS)其中RS =成本中心平均值之上的X天数/低于成本中心平均值的X天数。这是我的代码:

def RIS(A):
    X = cost_center_average(A)
    a = 0
    b = 0

    for i in range(len(X)):
        for j in range(len(A)):
            for k in range(len(A[i])):
                if A[j][0] in X[i]:
                    if A[j][k] > X[i][1]:
                        a = a + 1
                    else:
                        b = b + 1
                        RS = a/b
                        result = 100 - (100/(1+RS))
                        print A[j], result
                        break

以下是辅助函数(cost_center_average)('cost_center_sum')('mean'):

def cost_center_average(A):
    X = cost_center_sum(A)
    Y = []
    for i in range(len(X)):
        Y += [[X[i][0]]+ [mean(X[i][1:])]]
    return Y

NUMBER_OF_MONTHS = 12
def cost_center_sum(A):
dep = dict()
for row in A:
    if row[0] not in dep:
        dep[row[0]] = [0.0 for x in xrange(NUMBER_OF_MONTHS)]
    for i in xrange(NUMBER_OF_MONTHS):
        dep[row[0]][i] += row[i+2]
ret = list()
for department in sorted(dep.iterkeys()):
    x = [department]
    x.extend(dep[department])
    ret.append(x)
return ret


def mean(values):
"""Returns the mean.
"""
return sum(values)*1.0/len(values)

我的输入A是一个列表列表,其中每个内部列表包含成本中心ID,员工ID和月度数据。我基本上希望函数匹配成本中心ID,计算过量(a)和下(b),然后运行RSI等式。但是,我的代码必定是错误的,因为我的输出是列表A[j],每个列表都有80。结果应该有不同的值,但由于某些原因我编写代码的方式,它总是返回80的结果。有没有人知道我的逻辑/代码出错了?

示例输入:

[[136676.0, 12097.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.333334],[136710.0, 10273.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.333334],[136711.0, 10139.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.333334],[136712.0, 10271.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.333334],[136761.0, 10564.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.327274, 0.0, 0.0, 0.0, 0.545457],[136797.0, 10273.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.333334]]]

示例输出:

[136676.0, 12097.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.333334] 80
[136710.0, 10273.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.333334] 80
[136711.0, 10139.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.333334] 80
[136712.0, 10271.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.333334] 80
[136761.0, 10564.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.327274, 0.0, 0.0, 0.0, 0.545457] 80
[136797.0, 10273.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.333334] 80 

P.S。我测试了我的cost_center_average辅助函数,它可以正常工作

1 个答案:

答案 0 :(得分:0)

在Python中,缩进对代码的执行方式很重要。例如:

if A[j][k] > X[i][1]:
  a = a + 1
else:
  b = b + 1
  RS = a/b
  result = 100 - (100/(1+RS))
  print A[j], result
  break

只要您的代码发现FIRST A [j] [k]低于平均值,您的代码就会执行RS计算,然后继续显示结果并终止。我可能会误解你的问题,但我确实认为这不是你想要的行为。