2016-06-20 7 views
2

데이터 프레임의 재무 데이터에서 지수 이동 평균 (EMA)을 계산할 때 Pandas의 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"는 닫는 값과 같아야하지만, arg [0]은 첫 번째 평균 (즉, 선택한 기간 길이의 첫 번째 데이터 계열의 단순 평균)이지만 첫 번째 닫기 값은 아닙니다 . 따라서 arg [0]과 arg [i]는 같은 데이터에서 나올 수 없습니다. "min_periods"매개 변수를 사용하면이 문제가 해결되지 않는 것 같습니다.

팬더를 사용하여 데이터의 EMA를 제대로 계산하는 방법을 설명 할 수 있습니까?

+1

관련 GitHub의 : 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 곳 COEFF를 사용하는 alpha = 1/period

공식 :

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에서 float으로 변환하는 것이 더 안전합니다. 그렇지 않으면 좋은 대답 – FLab

+0

모호한 것에 대해 사과드립니다. 'base'는 EWMA를 계산하려는 DataFrame의 기본 열입니다. – arkochhar

+0

작은 수정 df [대상] = con.ewm (알파 = 1.0/마침표, 조정 = 거짓) .mean() – AbhijitG