2013-05-12 49 views
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'] 

回答

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'] 
2

你不是遍歷的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是真的的avrg最後元相比較result[prices]的結果。

我想你真正想要做的是比較相應的條款,我們可以使用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:我剛注意到一些奇怪的東西。當價格高於平均水平時,是不是買錯了?你不應該買的時候是低於平均水平,而銷售時,它的上面?]