Exponential Smoothing - 정의.
용어 : EMA (Exponential Moving Average) 라는 용어로 더 많이 알려져 있다. 특히 금융 매매대상(주식, 선물등) 에서 EMA 많이 사용됨.
시계열 데이터의 평활(smoothing) 방법 중 하나로 exponential window 를 갖는 low pass filter 적용한 효과를 준다. 결과적으로 신호에서 고주파성분 제거된 평활처리.
Formula.
정확한 주파수 기반의 Low Pass Filter 처럼 컷오프 주파수 개념이 있지 않기 때문에 대상 원시데이터에서 상기 formula 적용시 smoothing factor 값을 변경해보면서 의도하는 스무딩 결과가 나오는 것을 확인하면서 최종 smoothing factor 값 결정해야한다.
smoothing factor 를 1 로 하면 원파형과 같은 결과, smoothing factor 를 0으로 하면 ema 결과가 항상 초기값이 출력됨. 즉 수평선.
N moving average 에 해당하는 exponential smoothing 의 factor 관계 : smoothing factor = 2/(N+1)
Exponential Smoothing - 적용예.
붉은색 스텝라인 : 원시데이터.
파랑색 :Moving Average 20 point.
갈색 : Exponential Smoothing. smoothing factor 0.095238095 (=2/(20+1))적용.
EMA 코드 구현
파이썬
- 파이썬 클래스 형식으로 ema 구현.
## Exponential Moving Average
class EMA:
def __init__(self, n_sma, x0): # constructor
self.n_sma = n_sma # SMA 의 N 에 해당.
self.s_factor = 2./(self.n_sma+1.) # n_sma 에 해당하는 스무딩팩터.
self.init_ema(x0)
def init_ema(self, x0):
self.st = x0 # ema 결과값.
self.st_prev = self.st # 직전 st 값 받아둘 변수.
return self.st
def get_ema(self,xt):
self.st = self.s_factor * xt + (1.-self.s_factor)*self.st_prev
self.st_prev = self.st # 다음 계산시 활용하기 위하여 직전값으로 받아둠.
return self.st
# 클래스 ema 활용예.
# 클래스 인스턴스 생성하면서 n 값 , 시계열 첫 데이터 전달. - 생성시 첫데이터 전달하지 않고 아래 init_ema 함수 호출하여 전달가능.
my_ema_1 = EMA(10.,0.)
#my_ema_1.init_ema(1.) # 시계열 첫 데이터 전달하여 ema 초기화.
for x_sample in range(1,10):
print(x_sample, my_ema_1.get_ema(x_sample))
""" 출력 SMA N 이 10인 경우.
1 0.18181818181818182
2 0.5123966942148761
3 0.9646882043576258
4 1.516563076292603
5 2.1499152442394025
6 2.849930654377693
7 3.6044887172181124
8 4.403672586814819
9 5.2393684801212155
"""
C++ 클래스
/*
Exponential Moving Average.
St = alpha * (1- alpha) * St-1
S0 = x0
*/
class CCyMath_EMA
{
private:
double s_factor; // smoothing factor
long n_sma; // s_factor = 2/(n_sma +1)
double s_prev;
double s_now;
public:
double Init(long _n_sma,double _v_init);
double EMA(double _v);
};
double CCyMath_EMA::Init(long _n_sma,double _v_init)
{
n_sma = _n_sma;
s_prev = _v_init;
s_now = s_prev;
s_factor = 2./((double)n_sma + 1.);
return s_now;
}
double CCyMath_EMA::EMA(double _v)
{
s_now = s_factor * _v + (1. - s_factor) * s_prev;
s_prev = s_now;
return s_now;
}
첫 등록 : 2016.02.27
최종 수정 : 2021.10.06
단축 주소 : https://igotit.tistory.com/680
'지속가능티끌 > Data.Math.Phys' 카테고리의 다른 글
IIR 필터. 스텝 응답 실측. (0) | 2016.05.24 |
---|---|
딥러닝 신경망과 기존 신경망 본질적 차이점. (0) | 2016.03.11 |
Moving Average, LOWESS (LOESS) 적용 결과 비교. (0) | 2016.02.26 |
Stochastic Process, Random Process (0) | 2016.02.23 |
HMM (Hidden Markov Model) 개요. (0) | 2016.02.23 |
댓글