相对强弱指数函数 Python

1 投票
1 回答
582 浏览
提问于 2025-04-18 15:13

我正在创建一个函数,模仿股票交易者使用的相对强弱指数(RSI),用来找出偏离正常趋势的数据。RSI的计算公式是:100 - (100/1+RS),其中RS是指在某段时间内,成本中心平均值之上和之下的天数比。这里是我的代码:

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 

附言:我测试过我的cost_center_average辅助函数,它工作正常。

1 个回答

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

一旦你的代码找到第一个低于平均值的A[j][k],它就会进行RS计算,然后显示结果并结束。我可能没有完全理解你的问题,但我相信这不是你想要的结果。

撰写回答