[Python,Pandas,EWM] pandas ewm 의 이해

ewm(
    com=None,
    span=None,
    halflife=None,
    alpha=None,
    min_periods=0,
    adjust=True,
    ignore_na=False,
    axis=0,
)

Decay factor : 𝛼

com : center of mass|
𝛼=1/(1+𝑐𝑜𝑚), for 𝑐𝑜𝑚≥0

span : window 크기 또는 기간
𝛼 : 평활계수(EP)
금일의 지수이동평균 = (금일 종가* 𝛼 ) + 전일의 지수이동평균*(1- 𝛼 )
𝛼=2/(𝑠𝑝𝑎𝑛+1), for 𝑠𝑝𝑎𝑛≥1

haflife : 반감기
𝛼=1−𝑒𝑥𝑝(𝑙𝑜𝑔(0.5)/ℎ𝑎𝑙𝑓𝑙𝑖𝑓𝑒), for ℎ𝑎𝑙𝑓𝑙𝑖𝑓𝑒>0

alpha : 평활 계수(smoothing factor)
𝛼 : 직접 입력
0<𝛼≤1

min_perods : 주어진 window내에 있어야할 관측치의 최소 갯수

adjust : True or False

Pandas의 EWMA 개념은 아래 링크를 참조

https://pandas.pydata.org/pandas-docs/stable/user_guide/computation.html

1 + (1-a) + (1-a)^2 + ,… 의 무한 급수는 1/a 이다.
즉 Adjust가 False인 경우는 무한급수의 경우 이며 데이터가 많은 경우에는 False로 해도 된다.
데이터가 적은 경우 Adjust를 True 하는 것이 더 정확함
https://www.wolframalpha.com/input/?i=sum+%281+-+x%29%5Ei+i+from+0+to+infinite

코드 구현은 아래 참조

def myEWMA(x, winsize, adjust=False):
  # for loop count
  t = len(x) - 1
  alpha = 2.0 / (1.0 + winsize)
  p_t = np.zeros(t + 1)
  if adjust:
    p = 0.0
    adj = np.zeros(t + 1)
    a = 0.0
    for i in range(t+1):
      p = (x[i] + (1.0-alpha)*p)
      p_t[i] = p
      p = p_t[i]
      a += np.exp(i * np.log(1.0 - alpha))
      p_t[i] /=  a
  else:
    p_t[0] = x[0]
    for i in range(1,t+1):
      p_t[i] = alpha * x[i] + (1. - alpha)*p_t[i-1]

  return p_t

a = np.array([10,20,30,40,50,60,70,80,90,100])
print(myEWMA(a,2,adjust=False))
[10.         16.66666667 25.55555556 35.18518519 45.0617284  55.02057613
 65.00685871 75.00228624 85.00076208 95.00025403]
myEWMA(a,2,adjust=True)
array([10.        , 17.5       , 26.15384615, 35.5       , 45.20661157,
       55.08241758, 65.03202196, 75.01219512, 85.00457271, 95.00169354])

위의 결과와 아래 pandas와 비교 하며 동일함을 알 수 있다.

import pandas as pd
tt = pd.Series(range(tidx.shape[0]), index=tidx.index)
tt.ewm(span=2,adjust=False).mean()
0    10.000000
1    16.666667
2    25.555556
3    35.185185
4    45.061728
5    55.020576
6    65.006859
7    75.002286
8    85.000762
9    95.000254
dtype: float64
tt.ewm(span=2,adjust=True).mean()
0    10.000000
1    17.500000
2    26.153846
3    35.500000
4    45.206612
5    55.082418
6    65.032022
7    75.012195
8    85.004573
9    95.001694
dtype: float64

“[Python,Pandas,EWM] pandas ewm 의 이해”의 1개의 댓글

댓글 달기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다