我正在尝试比较两个列表以生成买入/卖出信号。第一个列表是价格列表,而第二个列表是这些价格的简单移动平均值。
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']
答案 0 :(得分:2)
您没有循环遍历result
和avrg
的相应元素,而是循环遍历每个组合。例如,如果您将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
的 last 元素进行比较的结果。
我认为你真正想做的是比较相应的术语,我们可以使用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:我刚注意到一些奇怪的事情。当价格高于平均水平时,是不是错误的购买方式?你不应该在低于平均水平时购买,并在高于平均水平时出售吗?]
答案 1 :(得分: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']