0

我正在尝试比较两个列表以生成买入/卖出信号。第一个列表是价格列表,而第二个列表是这些价格的简单移动平均线。

result = [590.0, 600.0, 590.0, 580.0, 570.0, 560.0, 570.0]
avrg = [580.0, 590.0, 593.33, 590.0, 580.0, 570.0, 566.67]
signal = ''

for prices in range(len(result)):
    for averages in range(len(avrg)):
        if result[prices] > avrg[averages]:
            signal = 'BUY'
        elif result[prices] < avrg[averages]:
            signal = 'SELL'
    lst.append(signal)

输出是

['BUY', 'BUY', 'BUY', 'BUY', 'BUY', 'SELL', 'BUY']

输出应该是

['BUY', 'BUY', 'SELL', 'SELL', 'SELL', 'SELL', 'BUY']
4

2 回答 2

2

您不是循环遍历 and 的相应元素resultavrg而是遍历每个组合。例如,如果你停留print(result[prices], avrg[averages])在循环内,你会看到

590.0 580.0
590.0 590.0
590.0 593.33
590.0 590.0
590.0 580.0
590.0 570.0
590.0 566.67
600.0 580.0
600.0 590.0
600.0 593.33
[.. etc.]

所以signal被附加的那个实际上是result[prices]最后一个元素比较的结果avrg

我认为您真正想做的是比较相应的术语,我们可以使用zip它。此外,在 Python 中,我们可以直接遍历列表,而不需要通过索引来访问它们。例如:

>>> list(zip(result, avrg))
[(590.0, 580.0), (600.0, 590.0), (590.0, 593.33), (580.0, 590.0), 
(570.0, 580.0), (560.0, 570.0), (570.0, 566.67)]

所以我们可以写

lst = []
for price, average in zip(result, avrg):
    if price > average:
        signal = 'BUY'
    else:
        signal = 'SELL'
    lst.append(signal)

(为简单起见忽略price == average大小写)

产生

>>> lst
['BUY', 'BUY', 'SELL', 'SELL', 'SELL', 'SELL', 'BUY']

在这里,我们甚至可以使用列表推导来代替循环:

>>> ['BUY' if price > average else 'SELL' for price, average in zip(result, avrg)]
['BUY', 'BUY', 'SELL', 'SELL', 'SELL', 'SELL', 'BUY']

但是逻辑越复杂,你最好简单地编写一个清晰的 for 循环。

无论如何,我认为基本问题是你正在做一个完整的所有价格与所有平均值的比较,并在你真正想要比较相应元素时取最后一个值。

[PS:我刚刚注意到一些奇怪的事情。当价格高于平均水平时,不是错误的购买方式吗?你不应该在低于平均水平时买入,在高于平均水平时卖出吗?]

于 2013-05-12T22:32:52.790 回答
0
result = [590.0, 600.0, 590.0, 580.0, 570.0, 560.0, 570.0]
avrg = [580.0, 590.0, 593.33, 590.0, 580.0, 570.0, 566.67]
signal = []
for i in range(len(result)):
  if (result[i] > avrg[i]):
    signal.append('BUY')
  else:
    signal.append('SELL')

>>> signal
['BUY', 'BUY', 'SELL', 'SELL', 'SELL', 'SELL', 'BUY']
于 2013-05-13T16:38:39.733 回答