2016-06-20 26 views
2

當試圖從數據框中的財務數據計算指數移動平均數(EMA)時,看起來Pandas的ewm方法是不正確的。熊貓計算ewm是否錯誤?

基本的使用下面的鏈接很好的解釋: http://stockcharts.com/school/doku.php?id=chart_school:technical_indicators:moving_averages

當去熊貓的解釋,採取的方法如下(使用「調整」參數爲假):

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」參數似乎無法解決此問題。

任何人都可以解釋我是如何(或如果)熊貓可以用來正確計算EMA的數據?

+1

相關的github問題: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

可以在熊貓ewm函數中使用阿爾法或係數(span)計算EWMA。

使用阿爾法公式:(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代碼,你可能根本不需要它。此外,將隱蔽期更安全,特別是對於蟒蛇2.另外好的答案 – FLab

+0

道歉,因爲模棱兩可。 'base'是您想要計算EWMA的DataFrame中的基本列。 – arkochhar

+0

小修正 df [target] = con.ewm(alpha = 1.0/period,adjust = False).mean() – AbhijitG