Скользящее среднее ряда данных


Как я могу переработать этот код, что ЕМА(х, 5) возвращает данные в emaout? Я пытаюсь вложить все в одно определение.

Сейчас его в петлю и деф.

x = [32.47, 32.70, 32.77, 33.11, 33.25, 33.23, 33.23, 33.0, 33.04, 33.21]

def ema(series, period, prevma):
    smoothing = 2.0 / (period + 1.0)                
    return prevma + smoothing * (series[bar] - prevma)

prevema = x[0] 
emaout =[]

for bar, close in enumerate(x):
    curema = ema(x, 5, prevema) 
    prevema = curema
    emaout.append(curema)

print 
print emaout

х может быть и NumPy массива.



1202
0
задан 9 сентября 2011 в 02:09 Источник Поделиться
Комментарии
1 ответ


  1. ЕМА использует серии в одном месте, где он ссылается серия[бар]. Но бар-это глобальная переменная, которая не одобряется. Перейдем серия[бар] вместо серии ЕМА.

  2. Это будет серия[бар] в течение цикла, но серия[бар] это то же самое как можно ближе, так что пропустим это.

  3. период ЕМА используется только для расчета сглаживания. Давайте посчитаем сглаживания снаружи и передавать его в.

  4. Но теперь EMA в одну линию, так давайте подставлять ее

  5. Давайте оставим все эту логику внутри функции

  6. Мы используем перебрать в цикле for, но мы не используем бар

Результат:

x = [32.47, 32.70, 32.77, 33.11, 33.25, 33.23, 33.23, 33.0, 33.04, 33.21]

def function(x, period):
prevema = x[0]
emaout =[]

smoothing = 2.0 / (period + 1.0)
for close in x:
curema = prevma + smoothing * (close - prevma)
prevema = curema
emaout.append(curema)

return prevema
print
print function(x, 5)

Мы можем лучше с помощью библиотеки numpy.

def function(x, period):
smoothing = 2.0 / (period + 1.0)
current = numpy.array(x) # take the current value as a numpy array

previous = numpy.roll(x,1) # create a new array with all the values shifted forward
previous[0] = x[0] # start with this exact value
# roll will have moved the end into the beginning not what we want

return previous + smoothing * (current - previous)

1
ответ дан 9 сентября 2011 в 03:09 Источник Поделиться