지수가중함수는 오래된 데이터에 지수감소를 적용하여 최근 데이터가 더 큰 영향을 끼지도록 가중치를 주는 함수이다.
보통 추가 메서드로 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) 그리고 당일의 가격만으로 구할 수 있으므로 전일의 지수이동평균값만 구해진다면 오히려 간단하다.
- 가장 최근의 일자에 가장 큰 가중치를 둬서 최근의 시장분위기를 잘 반영
- 단순이동평균에서와 같이 오래된 데이터를 갑자기 제외하지 않고 천천히 그 영향력을 사라지게 함
- 전 기간의 데이터를 분석대상으로 해서 가중이동평균에서 문제되는 특정 기간의 데이터만을 분석대상으로 한다는 단점도 보완함
- SMA = 46.60,금일종가는46.60,금일종가는46.75
- 승수 = 2 / (1 + n) = 2 / ( 1 + 14) = 0.133
- 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인 녹색선이 급격한 변화에 더 민감한 것을 볼 수 있다.
'Fintech' 카테고리의 다른 글
과거 데이터를 사용해 검증하는 방법, 백테스팅(Backtesting) (0) | 2023.01.26 |
---|---|
RSI(상대강도지수, Relative Strength Index)란? 지표의 수치 올바르게 이해하는 법 (0) | 2022.11.06 |
[금융] 퀀트투자 / 이동평균선(MA) / 지수이동평균선(EMA) (0) | 2022.10.06 |
[금융] 투자 / 투기, 사기 / 최소호가단위 / 서킷브레이커, 사이드카 (0) | 2022.10.02 |
이동평균선(Moving Average) 이해하기 / 단순,지수,가중 (2) | 2022.10.01 |
댓글