: Chart Data 전처리와 관련하여 올리는 3번 째 글이다. "학습시킬 Data가 이렇게 중요한가? 그냥 넣으면 되지 않나" 라고 생각할 수도 있지만, 그 동안 본인의 경험으로는 Data를 분석에 알맞게 전처리 하는 작업이, 좋은 모델을 사용하는 것보다 중요하다고 느꼈다. GIGO (Garbage In, Garbage Out). 쓰레기를 넣으면 쓰레기가 나올 확률이 높기 때문이다.
또한, 그만큼 가격 차트 데이터에 대한 보조 지표가 정말 많다. 모든 보조 지표를 이번 학습에서는 사용하지 않겠지만, 유의미하다고 판단되는 보조 지표는 될 수 있으면 많이 추가할 예정이다. 그리고, 이번 글에서는 지표에 대한 상세 설명은 생략하도록 하겠다. 대신 Data의 의미를 하나씩 짚어가면서 넘어가는데 초점을 맞추고자 한다.
1. EMA (Exponetial Moving Average)
: EMA(지수이동평균)를 설명하기 전에 먼저 MA(단순이동평균)을 언급하자면, MA는 정말 단순하게 현재 시점을 기준으로 특정 시점 이전까지에 대한 값의 평균을 의미한다. 예를 들어 "오늘 기준 MA10"(Day 단위)이라고 하면, 오늘부터 10일 전 까지의 가격에 대한 평균을 나타낸다. 그렇다면 MA는 왜 보는 걸까?
MA는 앞에서 살짝 언급을 했지만, 현재 시점의 가격만으로 미래를 예측하기에는 정보가 너무 부족하기 때문에, 과거에 대한 정보도 함께 녹아있는 Data가 추가된다면, 미래를 예측하는데 있어서 정확도를 높일 수 있기 때문이다. 현재 시점의 가격과 거래량도 무척 중요하지만, MA를 함께 고려한다면 현재 가격과 거래량에 대한 흐름을 어느 정도 파악할 수 있다.
예를 들어, 현재 삼성전자 주식 가격이 100원이라고 하자. 그렇다면, 앞으로 가격이 오를 것인가? 떨어질 것인가?라는 질문을 받았을 때, 어떻게 판단을 해야할까? 뭐... 삼성전자는 무조건 오를거니깐 일단 사자!!라고 하면서 살 수도 있겠지만, 우리는 삼성전자만 살게 아니니깐 다르게 생각해야 한다. 정답은 오르든지, 떨어지든지, 아니면 그대로인지 셋 중에 하나다. 결국 찍는 수 밖에 없다는 것이다.
그렇다면 여기에 추가로 현재 가격은 100원이고, MA5는 150원이라고 하자. 5일 치의 평균이 150원이라는 의미는 5일 동안 최소 150원 이상의 가격이 있었던 적이 있고, 과거에는 대체적으로 100원보다는 높은 가격대를 형성했다고 판단할 수 있다. 즉, 이는 곧 가격이 하락하는 추세였다고 판단할 수 있다. 반대로, MA5가 50원일 때는, 가격이 최근 5일동안 전반적으로 상승했다고 짐작할 수 있다. 결과적으로, MA를 함께 비교할 경우에는 대략적인 가격의 추세를 짐작할 수 있게 된다.
다시 한 번 질문을 해보자. 삼성전자 주식 가격이 100원이고 MA5가 50원이라고 하자. 그렇다면, 앞으로 가격이 오를 것인가? 떨어질 것인가?라는 질문에 어떤 대답을 해야할까? 정답은 오르든지, 떨어지든지, 아니면 그대로인지 셋 중에 하나다. 이럴 경우, 앞서 100원 밖에 모를 때와 상황이 다를게 뭐가 있겠냐라고 하겠지만, 단순히 추세가 상승을 보인다고 해서 다음 주식 가격이 오를거라고 판단하는 것은 섣부른 행동이다. MA로 판단할 수 있는건 과거부터 현재까지의 가격에 대한 추세이지, 이 추세만으로 다음 가격을 예측하기에는 부족한 부분이 많다.
추후 언급하겠지만, 이러한 이유 때문에 많은 분석가들은 현재 추세가 아직 유효한지 판단할 수 있는 모멘텀 지표를 함께 분석함으로써, 의사결정에 대한 불확실성을 낮추고자 노력한다.
다시 본론으로 돌아와서, EMA는 날짜가 현재에 가까울수록 더 많은 가중치를 부여하여, 최근의 가격을 좀 더 중요하게 바라보는 보조 지표이다. 이 때, 모든 날짜에 대한 가중치가 동일하면, MA와 같다. 추가적으로 설명하면, 가중이동평균(WMA)은 가중치가 일정한 비율로 감소하는 것과 달리, EMA는 이 가중치가 지수적으로 감소하는 가중치를 적용한다. 그리고 EMA는 WMA과 비교했을 때, 조금 더 현재에 대한 비중을 높이는 경향이 있고, 본인은 현재의 가격에 대한 비중이 높은 가격이 미래 가격을 예측하는데, 조금 더 유효할 것 같아서 EMA로 변환을 진행했다.
windows = [5, 10, 20, 60, 120]
for window in windows:
# Normalization된 종가
chart_data['close_norm_ema{}'.format(window)] = \
chart_data['close_norm'].ewm(span = window, min_periods = window, adjust=False).mean()
# log 변환되기 전의 거래량
chart_data['volume_ema{}'.format(window)] = \
chart_data['volume'].ewm(span = window, min_periods = window, adjust=False).mean()
# log 변환
chart_data['volume_transform_ema{}'.format(window)] = chart_data['volume_ema{}'.format(window)].apply(lambda x : \
math.log10(x/1000) if x/1000 > 1 else 0 )
windows에 있는 숫자들은 EMA에 대한 연산 기간을 의미한다. 일 자를 기준으로 한다면, 각각 5일, 10일, 20일 등을 의미한다. 여기서 .ewm 메소드에 대해 간단히 설명하면, ewm은 pandas dataframe의 한 method로 EMA를 쉽게 계산해주는 함수이다. span은 기간을 의미하며, min_periods는 해당 Dataframe에 요구하는 최소 기간이며, adjust는 EMA를 계산할 때, 분모를 무한급수를 적용하여 계산할지 안할지에 대한 여부이다.
사실 adjust가 True일 때와, False일 때 결과값 차이가 크지 않지만, adjust를 False로 할 경우, 등비수열의 합으로 이루어져 있는 분모를 일일이 계산하는게 아니라 무한등비급수의 공식을 적용하여 간단하게 계산하기 때문에, Data의 크기가 클 경우 adjust = False로 해놓으면 속도가 더욱 빠르다.
종가(Close Price) 차트를 한 번 살펴보자.
plt.figure(figsize=(20,10))
plt.plot(chart_data['close_norm'], label = 'Norm')
for window in windows:
print(window)
plt.plot(chart_data['close_norm_ema{}'.format(window)], label = window)
plt.legend()
plt.show()
전문가들은 위의 차트만 보고도 다음 추세를 어느 정도 예측할 수 있겠지만, 본인은 아니기 때문에 그래프를 어떻게 해석해야할 지 감이 안잡혔다. 그러나, 해석은 못하더라도 EMA 그래프에서 나타나는 특징들은 발견할 수 있었다.
1) 급격한 하락, 상승 구간에서 각 기간에 대한 EMA의 간격이 벌어진다.
2) 상승 구간에서는 EMA5가 EMA120을 항상 추월하는 교차점이 있다.
3) 반대로 하락이 있기 전에는 항상, EMA5가 EMA120 보다 떨어지는 교차점이 존재한다.
위의 특징들을 모든 차트에 일반화시킬 수는 없지만, 위의 가격 차트만 봤을 때, 지극히 단순하게 2), 3)만 따라서 매수, 매도를 했었도 수익이 났을 것이다. 이렇듯, 일반 차트에서는 보기 힘든 특징들을 EMA 차트와 함께 살펴봄으로써, 인사이트를 도출할 수 있다. 이는 곧, 학습 데이터를 통해 긍정적인 기대와 이어질 수 있다.
거래량(Volume) 차트를 한 번 살펴보자.
plt.figure(figsize=(20,10))
plt.plot(chart_data['volume_norm'], label = 'Norm')
for window in windows:
print(window)
plt.plot(chart_data['volume_norm_ema{}'.format(window)], label = window)
plt.legend()
plt.show()
위의 차트를 보고 당황할 수도 있겠지만, 위의 거래량은 지난 글에서 언급했듯이 거래량에 대해 log(10) 변환을 취한 그래프이다. 다시 한 번 언급하자면, log변환을 취함으로써 거래량의 선형적인 성격을 유지하는 동시에, 거래량 상승분에 대한 Scale을 줄임으로써 보다 안정적인 학습이 진행될 수 있도록 하기 위함이다. EMA는 변환을 하기 전에 대한 거래량에 적용했고, 변환 뒤 EMA를 계산하게 되면 완전히 다른 결과가 나오기 때문이다. ( log(mean(x)) != mean(log(x)) )
음.. 위의 차트만을 보고 직관적으로 해석하기에는 어려움이 좀 있는 것 같다. 그러나, 거래량 차트는 가격 차트와 함께 분석했을 때, 보이지 않던 특징들을 도출해 낼 수 있을 것이다.
이렇게 EMA에 대한 설명이 어느 정도 끝난 것 같다. 공식이나 이론적인 부분은 최대한 설명을 안하긴 했는데, 고작 EMA 하나 하면서 글을 왜 이렇게 길게 썼나 싶다.. 아직 MACD Oscillator, ROC, DMI & ADX 등 설명할 보조 지표가 많이 남긴 했다. 그래도 급하게 가는 것 보다 차근차근 제대로 진행하는 것이 목표이기 때문에 속도를 조절해가면서 진행하고자 한다.
'Auto Trading > Pretreating' 카테고리의 다른 글
Chart Data 전처리 (6) : OBV / RSI / CMF (0) | 2020.10.27 |
---|---|
Chart Data 전처리 (5) : Stochastic Oscillator / CCI / 이격도 / Bollinger Band (0) | 2020.10.25 |
Chart Data 전처리 (4) : MACD / ROC & Momentum / DMI & ADX (0) | 2020.10.18 |
Chart Data 전처리 (2) : 결측치 처리 / Normalization / Transformation (1) | 2020.10.14 |
Chart Data 전처리 (1) : Why? & How? (0) | 2020.10.10 |