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
애타게 찾고 있던 내용이었는데, 포스팅 해주셔서 정말 고맙습니다!