본문 바로가기
Fintech

지수가중함수(EWM), 지수이동평균(EMA)

by Istj_eff 2022. 10. 3.

지수가중함수는 오래된 데이터에 지수감소를 적용하여 최근 데이터가 더 큰 영향을 끼지도록 가중치를 주는 함수이다.

보통 추가 메서드로 mean( ) 을 사용해서 지수가중평균으로 사용

DataFrame.ewm(com=None, span=None, halflife=None, alpha=None, min_periods=0, adjust=True, ignore_na=False, axis=0, times=None, method='single')

 

1. 지수이동평균(EMA)

과거의 모든 기간을 계산대상으로 하며 최근의 데이타에 더 높은 가중치를 두는 일종의 가중이동평균법이다.

단순이동평균의 계산법에 비해 복잡해 보이지만 실제로 이동평균을 산출하는 방법은 전일의 지수이동평균값과 평활계수(smoothing constant) 그리고 당일의 가격만으로 구할 수 있으므로 전일의 지수이동평균값만 구해진다면 오히려 간단하다.

 

  • 가장 최근의 일자에 가장 큰 가중치를 둬서 최근의 시장분위기를 잘 반영
  • 단순이동평균에서와 같이 오래된 데이터를 갑자기 제외하지 않고 천천히 그 영향력을 사라지게 함
  • 전 기간의 데이터를 분석대상으로 해서 가중이동평균에서 문제되는 특정 기간의 데이터만을 분석대상으로 한다는 단점도 보완함
  1. SMA = 46.60,46.60,금일종가는46.75
  2. 승수 = 2 / (1 + n) = 2 / ( 1 + 14) = 0.133
  3. EMA 계산 = (금일 종가 x 승수) + (전일 EMA x (1 – 승수)

    ex) EMA = (46.75 x 0.133) + (46.60 x 0.867)

          EMA = $46.63


Pandas ewm
  • com : 질량중심 값으로 평활계수를 계산 [ a = 1(1+com) ]
  • span : 계산 기간으로 평활계수를 계산 [ a = 2/(span+1) ]
  • halflife : 반감기를 이용하여 평활계수를 계산 [ a= e^(-ln(2) / halflife) ]
  • alpha : 평활계수를 직접 입력 [ 0 < a ≤ 1 ]
  • min_periods : 계산을위한 최소 기간
  • adjust : 상대적 가중치의 불균형을 해소하기위해 조정계수로 나눌지의 여부입니다. 대체로 값이 많을수록 adjust를 하는것이 유리
  • ignore_na : 가중치를 계산할때 누락값을 무시할지 여부

2. 간단하게 지평선 보기

# 데이터 만들기
data = {'val':[1,4,2,3,2,5,13,10,12,14,np.NaN,16,12,20,22]}
df = pd.DataFrame(data).reset_index()
print(df)

[out]

    index   val
0       0   1.0
1       1   4.0
2       2   2.0
3       3   3.0
4       4   2.0
5       5   5.0
6       6  13.0
7       7  10.0
8       8  12.0
9       9  14.0
10     10   NaN
11     11  16.0
12     12  12.0
13     13  20.0
14     14  22.0

 

 

  • 기본적으로는 com / span / halflife를 통한 평활계수의 계산, 또는 alpha를 통해 평활계수를 직접 입력하여 지수가중평균을 표현
df2 = df.assign(ewm=df['val'].ewm(alpha=0.3).mean()) # val열에 ewm 메서드적용 후 df에 추가
ax = df.plot(kind='bar',x='index',y='val') # ax에 df의 bar chart 생성
ax2= df2.plot(kind='line',x='index', y='ewm', color='red', ax=ax) # ax2에 df2의 line chart 생성후 ax에 추가
plt.show() # 그래프 출력

 

alpha에 따른 차이

  • alpha는 평활계수로써, 자동 계산이 가능하지만, alpha 인수를 직접 입력하여 설정이 가능
  • alpha가 클수록 더 큰 변화에 민감하며, alpha가 작을수록 평활한 그래프가 생성
df2 = df.assign(ewm_a_low=df['val'].ewm(alpha=0.1).mean()) #alpha=0.1로 df2 생성
df3 = df.assign(ewm_a_high=df['val'].ewm(alpha=0.7).mean()) #alpha=0.7로 df3 생성
ax = df.plot(kind='bar',x='index',y='val') 
ax2= df2.plot(kind='line',x='index', y='ewm_a_low', color='red', ax=ax) # alpha=0.1 은 적색
ax3= df3.plot(kind='line',x='index', y='ewm_a_high', color='green', ax=ax) # alpha=0.7 은 녹색
plt.show()

 

→ alpha가 0.1인 적색선보다. alpha가 0.7인 녹색선이 급격한 변화에 더 민감한 것을 볼 수 있다.

댓글