2016-06-20 5 views
2

データフレーム内の財務データから指数移動平均(EMA)を計算しようとすると、Pandasのewmアプローチが正しくないようです。パンダはewmを間違って計算しますか?

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

:(Falseに「調整」パラメータを使用して)パンダの説明に行くとき http://stockcharts.com/school/doku.php?id=chart_school:technical_indicators:moving_averages

は、撮影したアプローチは次のとおりです。

基本はうまく次のリンクで説明されていますこれは私の見解では間違っています。しかし、arg [0]は最初の平均(すなわち選択された期間の長さの最初の一連のデータの単純平均)ですが、最初の終値ではありません。したがって、arg [0]とarg [i]は同じデータからなることはありません。 "min_periods"パラメータを使用してもこの問題は解決されないようです。

パンダを使ってデータのEMAを正しく計算する方法を教えてください。

+1

:ここcoeff = 2/(period + 1)

は、あなたが上記の式を計算するためにパンダを使用する方法である((current_val - previous_val) * coeff) + previous_val 問題: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

COEFFを使用するための式:

githubの関連
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

あなたの「ベース」が何であるか分かりませんあなたはおそらくそれを必要としません。また、特にPython 2のために、浮動小数点の期間を隠す方が安全でしょう。それ以外の場合は、良い答え – FLab

+0

あいまいであることをお詫び申し上げます。 'base'はEWMAを計算したいDataFrameの基本列です。 – arkochhar

+0

小修正 df [ターゲット] = con.ewm(アルファ= 1.0 /ピリオド、調整= False).mean() – AbhijitG

関連する問題