2014-04-05 2 views
1

Я почесываю голову на этом, так как я действительно смущен. Я пытаюсь вычислить скользящее среднее на массив numpy. Массив numpy загружается из txt-файла.ошибка python - скользящее среднее на множестве numpy

Я также пытаюсь напечатать мою функцию smas (скользящую среднюю, которую я вычисляю на загруженных данных) и не могу этого сделать!

вот код.

def backTest(): 
    portfolio = 50000 
    tradeComm = 7.95 

    stance = 'none' 
    buyPrice = 0 
    sellPrice = 0 
    previousPrice = 0 

    totalProfit = 0 

    numberOfTrades = 0 
    startPrice = 0 


    startTime = 0 
    endTime = 0 
    totalInvestedTime = 0 
    overallStartTime = 0 
    overallEndTime = 0 

    unixConvertToWeeks = 7*24*60*60 
    unixConvertToDays = 24*60*60 
    date, closep, highp, lowp, openp, volume = np.genfromtxt('AAPL2.txt', delimiter=',', unpack=True, 
                  converters={ 0: mdates.strpdate2num('%Y%m%d')}) 


    window = 20 
    weights = np.repeat(1.0, window)/window 
    smas = np.convolve(closep, weights, 'valid') 

    prices = closep[19:] 

    for price in prices: 
     if stance == 'none': 
      if prices > smas: 
       print "buy triggered" 
       buyPrice = closep 
       print "bought stock for", buyPrice 
       stance = "holding" 
       startTime = unixStamp 
       print 'Enter Date:', time.strftime('%m/%d/%Y', time.localtime(startTime)) 

      if numberOfTrades == 0: 
       startPrice = buyPrice 
       overallStartTime = unixStamp 

      numberOfTrades += 1 


     elif stance == 'holding': 
      if prices < smas: 
       print 'sell triggered' 
       sellPrice = closep 
       print 'finished trade, sold for:',sellPrice 
       stance = 'none' 
       tradeProfit = sellPrice - buyPrice 
       totalProfit += tradeProfit 
       print totalProfit 
       print 'Exit Date:', time.strftime('%m/%d/%Y', time.localtime(endTime)) 
       endTime = unixStamp 
       timeInvested = endTime - startTime 
       totalInvestedTime += timeInvested 

       overallEndTime = endTime 

       numberOfTrades += 1 

     previousPrice = closep 

здесь ошибка:

Traceback (most recent call last): 
    File "C:\Users\antoniozeus\Desktop\backtester2.py", line 180, in <module> 
backTest() 
    File "C:\Users\antoniozeus\Desktop\backtester2.py", line 106, in backTest 
if prices > smas: 
ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all() 
+0

Из-за ошибки похоже, что closep представляет собой несколько значений. Не могли бы вы подтвердить? – heretolearn

+0

он делает ... closep представляет собой массив цен закрытия для акций Apple –

+0

В этом случае вы должны использовать цикл для итерации по массиву и проверить условие или, как говорит ошибка, используйте «a.any()», если вы хотите проверить, больше ли значение в массиве, чем moveAverage или «a.all()», чтобы проверить, больше ли значение в массиве, чем moveAverage – heretolearn

ответ

1

Если у вас есть массив Numpy с 1-D, есть очень гладкий способ делать скользящих средних с использованием cumsum (через https://stackoverflow.com/a/14314054/1345536):

def moving_average(a, n=3) : 
    ret = np.cumsum(a, dtype=float) 
    ret[n:] = ret[n:] - ret[:-n] 
    return ret[n - 1:]/n 

У вашего фрагмента кода есть много кода, который посторонний к проблеме.

+0

Он использовал только одну строку для этого: 'np.convolve (DATA_TO_MA, weight, 'valid')' –

+1

Вправо. В таком случае это, вероятно, должно быть отправлено на http://codereview.stackexchange.com вместо этого? PS - Не знал о «действительном» варианте для свертки; это гораздо лучший подход. Очень круто; благодаря! –

+0

'valid' управляет поведением скользящей средней, здесь особенно когда' DATA_TO_MA' короче, чем 'Weights'. Попробуйте 'np.convolve (диапазон (10), np.repeat (1.0, 20)/20, 'full')' V.S. 'same' или' valid' –

1

Изменение closep > smas до closep[-1] > smas[-1] или closep[0] > smas[0] должно быть решением в соответствии с вашим предполагаемым поведением.

ли closep[-1] > smas[-1] или closep[0] > smas[0] зависит от ваших данных: самая актуальная цена, это последняя строка файла txt, или первым в файле txt? Дважды проверьте это.

Чтобы получить все возможные «купить» спусковые и их цены закрытия, без использования цикла:

if stance == 'none': 
    buyPrice_list=closep[19:][closep[19:] > smas] #change it to [:-19] if the current price is the first row. 

Тогда buyPrice_list хранит все цены закрытия на бай триггеров. См. Boolean indexing, http://wiki.scipy.org/Cookbook/Indexing.

+0

одна проблема с этим - это то, что мне нужно было изменить closep [19:]> smas, потому что я получил ошибку: «ValueError: операнды не могли быть переданы вместе с фигурами (522) (503) ' –

+0

Нет, вас интересует текущая цена закрытия, а не то, что ВСЕ предыдущие цены закрытия 522 должны быть выше SMA. Таким образом, нет, просто получите самое последнее, нарезайте как 'array' by '[0]', так и '[-1]' в зависимости от ваших данных. Если вы хотите сделать последнее, вам нужно '(closep [19:]> smas) .all()' –

+0

, поэтому я последовал за этими inxs и заметил, что backtester немедленно останавливается ... потому что это не цикл, я я просто смотрю на один период. но у меня есть ряд цен закрытия и массив скользящих средних ... –

Смежные вопросы