빠른 이동평균, Zero Lag EMA (ZLEMA) 파이썬 코딩

빠른 이동평균, Zero Lag EMA 파이썬 코딩

이동평균선은 짧은 시간 동안에 발생한 심한 가격 변동을 보다 긴 시간에서의 변화로 바꿔서 노이즈를 줄여주는 역할을 합니다. 노이즈 없이 추세를 화인할 수 있다는 것은 이동평균선의 장점입니다만, 시장의 변화에 느리게 반응한다는 것은 이동평균선의 단점이기도 합니다. 이번 포스팅에서는 이런 단점을 보완한 한템포 빠른 이동평균을 파이썬 코딩을 통해 이해해 보겠습니다.

 

 


글의 순서

지수이동평균 (EMA, Exponential Moving Averages)
Zero Lag EMA (ZLEMA)
Zero Lag EMA 계산 방법
EMA와 ZLEMA를 비교하는 파이썬 코드


지수이동평균 (EMA, Exponential Moving Averages)

지수이동평균은 최근의 데이터에 가중치를 부여해서 평균을 구하는 방식입니다. 그래서 최근의 가격 변동을 잘 반영해줍니다. 또한 오래된 지수이동평균 데이터가 천천히 사라지므로, 이동평균이 급격하게 변화되지 않습니다.

 

 


Zero Lag EMA (ZLEMA)

일반적인 EMA는 실제 가격 움직임에 느리게 반응합니다. 이를 개선한 EMA가 바로 Zero Lag EMA(ZLEMA)입니다. ZLEMA는 일반적인 EMA보다 지연(Lag)을 줄여 더 빠르게 가격 변화를 반영하도록 설계되었습니다.

ZLEMA는 시장의 노이즈를 걸러주며, ZLEMA를 활용하면 빠른 반응을 유지할 수 있습니다. 즉, ZLEMA는 추세를 더 빠르고 정확하게 반영해줍니다.

임펄스 MACD (Impulse MACD)를 구할 때도 ZLEMA를 활용합니다. 지난 포스팅에서 활용했던 calc_zlema()가 바로 ZLEMA를 구하는 함수인데, 이번 포스팅에서는 이 함수를 좀 더 심도 있게 살펴보고, 기존의 EMA와 비교해 보겠습니다.


Zero Lag EMA 계산 방법

ZLEMA는 과거 데이터를 보정하기 위해 지연된 EMA를 활용하며, 계산된 EMA 값에서 지연을 제거합니다.

step1) EMA 계산에서 지연을 줄이기 위한 보정값, lag 계산

lag = (length – 1) // 2

여기서, length는 ZLEMA를 계산할 EMA의 기간을 의미합니다. 이부분은 EMA의 지연을 줄이기 위한 핵심부분입니다. 만약 length가 34라면, //가 몫을 구하는 연산자이므로, 33을 2로 나눈 몫인 16이 lag 값이 됩니다.

최근 데이터에 더 큰 가중치를 부여하는 EMA의 특성상 EMA의 중심은 약간 뒤(최근 위치)로 지연됩니다. 이 지연효과를 반영하기 위해 데이터의 절반보다 좀 더 앞쪽(더 과거의 위치)으로 당깁니다. 일반적인 EMA에서는 중심값의 위치 때문에 최근 데이터에 빠르게 반응하지 못하는 경우가 생기는데, 중심값의 위치를 더 과거의 데이터로 설정하여 이를 해소하려는 것입니다. length-1 을 사용한 이유가 바로 이 때문입니다.

step 2) 입력 데이터(series)를 lag만큼 뒤로 이동 시킴

lagged_series = series.shift(lag)

이는 입력된 데이터(=과거의 종가)를 lag만큼 뒤로 이동시킵니다. 일반적으로 현재의 EMA를 과거의 종가로부터 구하는 데, 이 때문에 지연이 생깁니다. 이 지연을 보정하기 위해 lagged_series를 사용할 것입니다.

step 3) 현재의 EMA 계산

ema = series.ewm(span=length, adjust=False).mean()

과거의 종가(series)를 이용하여 현재의 지수이동평균을 구합니다. 참고로, EMA는 최근 데이터에 더 큰 가중치를 부여하며, span=length는 EMA를 계산할 기간을 의미합니다.

step 4) 지연된 EMA 계산

ema_lagged = lagged_series.ewm(span=length, adjust=False).mean()

step 2)의 lagged_series(지연된 데이터)에 대해 EMA를 계산합니다.

step 5) Zero Lag EMA 계산 : ZLEMA = EMA + (EMA – EMA_lagge)

return 2 * ema – ema_lagged

Zero Lag EMA(ZLEMA)는 지연 효과(Lag)를 제거하거나 최소화하기 위해 설계된 EMA입니다. 일반적인 EMA에서는 지연 효과로 인해 최근 데이터에 빠르게 반응하지 못할 수 있습니다. 이를 보정하기 위해 ZLEMA는 현재의 EMA 값을 2배 한 다음, 여기서 지연된 EMA 값을 빼는 방식을 사용합니다.


파이썬 코딩 : EMA와 ZLEMA 비교

EMA와 ZLEMA를 비교할 수 잇도록 아래의 파이썬 코드를 작성하였습니다. Zero Lag EMA가 기존의 EMA보다 얼마나 빠르게 캔들을 따라가고 있는지를 확인하실 수 있습니다. 아래의 파이썬 코드는 Binance API를 활용하여 비트코인의 일별 데이터를 가져오고, 이를 기반으로 지수이동평균(EMA)과 빠른 지수이동평균(Zero Lag EMA)를 Impulse MACD를 계산하여 시각화합니다.

임펄스 MACD (Impulse MACD)를 구하는 지난 포스팅에서 활용했던 calc_zlema()의 함수가 그대로 사용되었습니다.

캔들스틱 차트를 그리는 부분, 그림 파일 이름을 설정하는 부분은 시장을 분석하는데 활용도가 높습니다. 유심히 봐주시기 바랍니다.

EMA, Zero Lag EMA(ZLEMA) 비교


마치며 …

이번 포스팅에서는 EMA와 ZLEMA(Zero Lag EMA)를 비교하며, ZLEMA가 기존 EMA에 비해 시장에 얼마나 더 빠르게 반응하는지를 살펴보았습니다. ZLEMA는 EMA의 지연 효과를 줄임으로써 최근 데이터 변화에 더욱 민감하게 반응하며, 을 더 명확하게 포착할 수 있도록 설계된 지표입니다. 특히, ZLEMA는 시장의 신호 왜곡을 최소화하여 트레이더가 보다 정확한 판단을 내릴 수 있도록 돕습니다. EMA와 ZLEMA의 차이를 이해하고 이를 매매 전략을 세우는데 활용해보시기 바랍니다.

 

 

함께 참고하면 좋은 글
임펄스 MACD (IMPULSE MACD) 파이썬 코딩
시계열 데이터 분석 : 지수 이동평균 (EMA)
호크아이 거래량 지표 (HawkEye Volume Indicator) 파이썬 코딩
볼린저밴드, BBW, 파이썬 pyplot 캔들스틱 차트에 표시 방법
캔들 차트의 의미와 파이썬 pyplot으로 그리는 캔들스틱 차트
파이썬 바이낸스 API로 시계열 데이터를 가져오는 파이썬 프로그래밍
바이낸스 API 보안을 위한 환경 변수 설정 : 윈도우 10
파이썬 바이낸스 API로 차트 분석 : 판다스 이동평균선


참고자료

▶ John Ehlers and Ric Way, ZERO LAG (well, almost)
▶ TrendSpider, What is the Zero-Lag Exponential Moving Average (ZLEMA)

Leave a Comment