본문 바로가기
지속가능티끌/Data.Math.Phys

Exponential Smoothing (Exponential Moving Average, EMA),

by i.got.it 2016. 2. 27.

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

 


 

댓글



 

비트코인




암호화폐       외환/나스닥/골드         암호화폐/외환/나스닥/골드
     
현물 |선물 인버스 |선물 USDT       전략매니저(카피트레이딩)         프랍 트레이더 온라인 지원가능. MT4,MT5