0

クラスの 1 つに問題があります。この特定のクラスは、リスト (日付と価格を含む) を指定して移動平均を計算することになっています。日数 (ユーザーによる入力)。これが私のコードです:

class Moving_Average:

def calculation(self, alist:list,days:int):
    m = days
    prices = [float(i) for i in alist[1::2]]
    average = [0]* len(prices)
    signal = ['']* len(prices)
    for m in range(0,len(prices)-days+1):
        average[m+2] = sum(prices[m:m+days])/days
        if prices[m+2] < average[m+2]:
            signal[m+2]='SELL'
        elif prices[m+2] > average[m+2] and prices[m+1] < average[m+1]:
            signal[m+2]='BUY'
        else:
            signal[m+2] =''
    average = [round(average[i],2) for i in range(0,len(average))]
    return average,signal

これは、3 日間の平均を計算したい場合にうまく機能します。しかし、入力として 2 日を指定して平均を計算しようとすると、インデックス エラーが発生します。日数として 4 を入力しようとすると、結果は次のようになります。

[0, 0, 33.81, 33.74, 33.51, 33.31, 33.28, 33.49, 33.85, 34.21, 34.43, 34.62, 34.75,   
34.88, 34.86, 34.57, 34.26, 34.45, 34.69, 35.13, 35.59, 35.51, 0], ['', '', '', '', 
'SELL', 'SELL', 'SELL', 'BUY', '', '', '', '', '', '', '', '', 'SELL', 'SELL', 'BUY', 
'', 'SELL', 'BUY', ''])

それがいつあるべきか:

[0, 0, 0, 33.81, 33.74, 33.51, 33.31, 33.28, 33.49, 33.85, 34.21, 34.43, 34.62, 34.75, 
34.88, 34.86, 34.57, 34.26, 34.45, 34.69, 35.13, 35.59, 35.51], ['', '', '', '', 
'SELL', 'SELL', 'SELL', 'BUY', '', '', '', '', '', '', '', '', 'SELL', 'SELL', 'BUY', 
'', 'SELL', 'BUY', ''])

つまり、先頭ではなく末尾に 0 を追加します。

4

2 に答える 2

1

移動平均を計算するために adequeと a を一緒に使用してみませんか? maxlen=daysまた、出力リストを事前に割り当てる代わりに、必要に応じて作成してください。リストにインデックスを作成したり、range();を使用して反復したりすることは避けてください。特にインデックスの計算で、それを頻繁に行っていることに気付いた場合は、おそらく難しい方法で行っています。

import collections

class MovingAverage(object)::

    def calculate(self, alist, days=2):

        averages = []
        signals  = []
        days     = float(days)   # make sure average is always float
        prices   = [float(n) for n in alist[1::2]]
        window   = collections.deque(maxlen=days)

        # generate moving averages and signals
        for price in prices:
           window.append(price)
           averages.append(0)
           signals.append("")
           if len(window) == days:   # window is full, we can calc moving avg
               mavg = sum(window) / days
               averages[-1] = mavg
               if price < mavg:
                    signals[-1] = "SELL"
                elif price > mavg:
                    signals[-1] = "BUY"

        averages[:] = ("%.2f" % a for a in averages)
        averages[:days] = [""] * days

        return averages, signals
于 2013-11-04T21:30:49.343 に答える
1

要素 にアクセスしようとしているため、ループ内でインデックス エラーが発生します。average[m+2]ここで、averageは lengthlen(prices)ですが、 の値mlen(prices) - 2( と仮定してdays == 2) であるためm == len(prices)、 と はリストの範囲外です。

の最初の要素にアクセスすることはaverageなく、 or の最初または 2 番目の要素を記述することもありませaveragesignaldays == 4おそらくこれが、ケースで余分なゼロを取得している理由です。Python はゼロベースのインデックスを使用することに注意してください。

個人的には、日付と価格を 1 つの長いリストにまとめるのは得策ではないと思います。日付と価格のタプルのリストの方がよいでしょう。また、m = daysスクリプトの先頭にある行は何もしないため、削除する必要があります。

于 2013-11-04T21:13:35.193 に答える