Python 相对强度指数函数

Python 相对强度指数函数,python,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

我正在创建一个函数,它模仿股票交易者用来寻找偏离正常趋势的数据的相对强度指数(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\u center\u average
)(“cost\u center\u sum”)(“mean”):

我的输入
A
是一个列表列表,其中每个内部列表包含成本中心ID、员工ID和月度数据。我基本上希望该函数匹配成本中心ID,计算超出(
a
)和低于(
b
)的数量,然后运行RSI方程。但是,我的代码一定是错误的,因为我的输出是列表
A[j]
,每个列表80。result应该有不同的值,但由于某种原因,按照我编写代码的方式,它总是返回80的“result”。有人知道我的逻辑/代码哪里出错了吗

样本输入:

[[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\u center\u average
helper函数,它在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计算,然后继续显示结果并终止。我可能误解了您的问题,但我确实认为这不是您想要的行为。

您是否可以提供帮助函数和示例输入以及预期和实际输出,以便其他人可以实际运行此功能并查看问题?还有,这是你实际使用的缩进吗?只是添加了它。是的,所有的缩进都与我的实际代码和
成本_中心_总和
相符<代码>平均值?你真的应该在第一个下面打印结果吗?那么你认为错误是因为我在else语句下面打印了结果吗?看起来肯定不对。如果将其拆分为更小、更简单的函数,可能会更容易。例如,首先编写一个函数,它只获取一行月度数据和成本中心的相应平均值,然后返回该行的RSI。然后,您可以轻松地测试它并从中构建。同样,考虑一个由成本中心键入的字典,用于你的成本中心的平均值。你说得对。我想让它在结束前浏览整个内部列表。我是否应该将RS和结果值移到循环之外以避免提前终止?这将是一个良好的开端。无论哪个循环需要全部遍历,都需要将最终计算移到该循环之外。如果您遇到更多问题,我还建议您遵循jonrsharpe的建议,因为这样您的代码将更容易调试。
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