2016-06-20 4 views
2

При попытке вычислить экспоненциальную скользящую среднюю (EMA) из финансовых данных в кадре данных кажется, что подход Pandas «ewm» неверен.Неужели Pandas неправильно вычисляет ewm?

Основа хорошо объясняется в следующей ссылке: http://stockcharts.com/school/doku.php?id=chart_school:technical_indicators:moving_averages

При переходе к панде объяснению, подход заключается в следующем (с помощью параметра «настроить», как False):

weighted_average[0] = arg[0]; 
    weighted_average[i] = (1-alpha) * weighted_average[i-1] + alpha * arg[i] 

Это, на мой взгляд, неверно. «Arg» должен быть (например) закрывающими значениями, однако arg [0] является первым средним значением (т. Е. Простым средним значением первой серии данных длины выбранного периода), но НЕ первое значение закрытия , arg [0] и arg [i], следовательно, никогда не могут быть из одних и тех же данных. Использование параметра «min_periods», похоже, не разрешает это.

Может ли кто-нибудь объяснить мне, как (или если) Pandas можно использовать для правильного вычисления EMA данных?

+1

Родственный GitHub issue: https://github.com/pydata/pandas/issues/13638 – naught101

ответ

3

Существует несколько способов инициализации экспоненциальной скользящей средней, поэтому я бы не сказал, что панды делают это неправильно, просто разные.

Вот бы способ вычислить его, как вы хотите:

In [20]: s.head() 
Out[20]: 
0 22.27 
1 22.19 
2 22.08 
3 22.17 
4 22.18 
Name: Price, dtype: float64 

In [21]: span = 10 

In [22]: sma = s.rolling(window=span, min_periods=span).mean()[:span] 

In [24]: rest = s[span:] 

In [25]: pd.concat([sma, rest]).ewm(span=span, adjust=False).mean() 
Out[25]: 
0   NaN 
1   NaN 
2   NaN 
3   NaN 
4   NaN 
5   NaN 
6   NaN 
7   NaN 
8   NaN 
9  22.221000 
10 22.208091 
11 22.241165 
12 22.266408 
13 22.328879 
14 22.516356 
15 22.795200 
16 22.968800 
17 23.125382 
18 23.275312 
19 23.339801 
20 23.427110 
21 23.507635 
22 23.533520 
23 23.471062 
24 23.403596 
25 23.390215 
26 23.261085 
27 23.231797 
28 23.080561 
29 22.915004 
Name: Price, dtype: float64 
2

Вы можете вычислить EWMA с помощью альфа или коэффициента (span) в панде ewm функции.

Формула для использования альфа: (1 - alpha) * previous_val + alpha * current_val где alpha = 1/period

Формула для использования коэфф: ((current_val - previous_val) * coeff) + previous_val где coeff = 2/(period + 1)

Вот как вы можете использовать панд для вычисления выше формулы:

con = pd.concat([df[:period][base].rolling(window=period).mean(), df[period:][base]]) 

if (alpha == True): 
    df[target] = con.ewm(alpha=1/period, adjust=False).mean() 
else: 
    df[target] = con.ewm(span=period, adjust=False).mean() 
+0

Я не понимаю, что такое «база» в вас r, вам, вероятно, это совсем не нужно. Кроме того, было бы безопаснее скрытый период для плавания, в частности для python 2. В противном случае хороший ответ – FLab

+0

Извинения за неясность. 'base' является базовым столбцом в DataFrame, на котором вы хотите вычислить EWMA. – arkochhar

+0

небольшая коррекция df [target] = con.ewm (alpha = 1.0/period, adjust = False) .mean() – AbhijitG