본문 바로가기

주식 분석

기술적 분석 (1) - 이동평균선

 주식 투자를 할 경우에 종목에 대한 분석을 합니다. 분석은 크게 기본적 분석과 기술적 분석으로 나눕니다. 기본적 분석은 쉽게 주식(종목)의 내재가치(Fundamental)을 분석합니다. 기술적 분석은 과거 주식의 가격이나 거래량 등의 자료를 분석합니다. 기본적 분석에 가장 핵심이 되는 자료인 재무정보는 1분기 당 한번씩, 그것도 일정한 간격을 두고 발표됩니다. 그에 반해 기술적 분석에 가장 핵심이 되는 거래 자료는 거래일 마다 변동이 있죠. 

 그래서 단기간에 이익을 거두려는 사람들이 더 중점을 두는 분석은 기술적 분석 입니다. 기술적 분석은 이동평균선, MACD, RSI 등의 여러 지표를 바탕으로 하게 됩니다. 

 

 이번 글에서는 이동평균선의 의미, 구현, 시각화 등의 내용을 다뤄보겠습니다.

 


삼성전자 차트 (영웅문)

 이동평균선은 기술적분석의 가장 기본이 되는 지표 입니다. 위의 차트는 키움증권 HTS에서 가져온 차트입니다. 주식을 하는 누구나 이런 차트는 반드시 보게 되어있습니다. 

 이동평균선은 N일 동안의 데이터를 평균낸 데이터 입니다. 일반적으로 5일, 60일, 120일을 각각 단기, 중기, 장기 이동평균선이라고 말합니다. 즉 단기, 중기, 장기의 추세라고 말할 수 있습니다.

 

 이동평균선을 추세를 보기위해 활용하는 경우도 있지만, 지지선, 저항선으로 활용하는 경우도 많습니다. 지지선이나 저항선은 주가의 심리적 '벽'이라고 할 수 있습니다. 주가가 오르는 추세에서 '저항선'을 만나면 오르지 못할 수도 있고, 주가가 내리는 추세에서 '지지선'을 만나면 다시 반등할 수도 있습니다. 심리적이라고 말하는 이유는 이동평균선이 실제 주식의 가치를 반영하는 게 아니라 기술적 지표이기 때문입니다.

 가볍게 말하자면, 지지선은 '그래도 이것보단 주가가 높아야 하지 않을까?' 저항선은 '그래도 이 가격은 너무 높은 것 같은데...' 라고 생각해봅니다

 

 이동평균선 중 위의 지표는 '단순 이동 평균' 입니다. 5일 이동 평균선이라고 한다면, 5일 동안의 데이터를 단순히 평균 계산한 지표 입니다. 이럴 경우 어제의 주가와 3일전의 주가가 동일한 영향을 주게 됩니다. 120일 이동 평균선이면 120일 간의 주가가 동일한 영향을 주는 것이구요. 이러한 지표의 단점을 보완하고자 사용하는 지표가 '가중 이동 평균'과 '지수 이동 평균' 입니다. 

 가중 이동 평균은 최근의 주가에 더 큰 가중치를 부여해서 계산합니다.

 지수 이동 평균은 최근의 주가에 더 큰 가중치를 부여하면서, 과거의 모든 데이터도 영향을 주도록 계산합니다.

 가장 직관적으로 이해 할 수 있는 단순 이동 평균을 가장 많이 사용하고, 가중치를 사용하고 싶다면 지수 이동평균을 많이 사용하는 하는 걸로 보입니다.

 

 이동평균선을 거래에 활용하는 방법으로는 서로 다른 일수로 계산한 이동평균법의 배열을 확인하는 방법입니다.

 

1) 정배열, 역배열

정배열

 위 그림처럼 단기의 이동평균선이 위쪽에 장기 이동평균선이 아래쪽에 위치를 하게 되면 정배열이라고 부릅니다. 단기 이동평균선이 값이 높다는 건, 최근의 주가가 계속 상승하고 있다는 의미 입니다. 이러한 배열이 있을 때는 주식이 상승하고 있는 추세로 볼 수 있고, 주식을 사면 가격이 오르지 않을까? 라는 것이죠.

 역배열은 위 배열의 반대입니다. 최근 주가의 가격이 계속 떨어지는 하락 추세이기 때문에 투자를 하지 말라는 말이죠.

 

2) 골든크로스, 데드크로스

 가장 기본적인 기술적 지표가 이동평균선이고, 기술적 지표를 활용하는 가장 기본적인 거래 신호가 골든크로스, 데드크로스라고 할 수 있습니다.

골든크로스

 보시다시피 단기 역배열 차트 였습니다. 단기 이동평균선이 가장 아래에 있다가 주가가 상승하면서 중기, 단기 이동평균선을 뚫고 올라가는 모습입니다. 위 차트에서 그려놓은 빨간색 동그라미 지점이 골든크로스 입니다. 물론 골든 크로스 지점이 정확히 어디냐는 사람들마다 다릅니다. 단기를 5일 이동평균선, 장기를 120일 이동평균선 으로 따질때는 위와 같습니다. 

 단기 이동평균선이 중기, 장기 이동평균선을 뚫고 올라갈 정도면 그 상승 흐름이 굉장히 크다고 볼 수 있습니다. 그래서 저 골든크로스는 '매수'의 신호로 생각하는 경우가 많습니다.

 데드 크로스는 위와 반대의 상황으로, 단기 이동평균선이 중기, 장기 이동평균선을 뚫고 하락합니다. '매도'의 신호로 볼 수 있습니다.

 


 이동평균선을 Python으로 계산하는 법, 차트를 그리는 법을 말씀드려보겠습니다. 모델링, 백테스팅 과정등을 직접할게 아니라면 HTS나 MTS를 활용하는 편이 훠어어얼씬 간단하고 정확합니다.

 먼저 library를 load 해주고, 데이터를 불러오는 코드 입니다. 데이터를 불러오는 방식은 각자 가지고 있는 데이터에 따라 달라지게 됩니다.

.
import pandas as pd
import numpy as np

path_dir = './data'
data = np.loadtxt(path_dir + '/' + '000660_from_2010.csv', delimiter = ',')
data = pd.DataFrame(data)
data.columns = ['Open', 'High', "Low", "Close", "Volumn", "Adj"]

 다음은 이동평균선을 계산하는 코드입니다. 굉장히 간단한 수식이면서, pandas를 이용하면 그 간단한 수식을 더 간단하게 코딩할 수 있습니다. 저는 단순 이동 평균과 지수 이동 평균만을 계산했습니다.

.
def cal_mv(data, N) :
    mv_n = data.rolling(window=N).mean()

    return mv_n

def cal_emv(data, N) :
    emv_n = data.ewm(span=N).mean()
    
    return emv_n
    
data["MV_5"] = cal_mv(data["Close"], 5)
data["MV_20"] = cal_mv(data["Close"], 20)
data["MV_60"] = cal_mv(data["Close"], 60)
data["MV_120"] = cal_mv(data["Close"], 120)
data["EMV_5"] = cal_emv(data["Close"],5)
data["EMV_20"] = cal_emv(data["Close"],20)
data["EMV_60"] = cal_emv(data["Close"],60)
data["EMV_120"] = cal_emv(data["Close"],120)

 위와 같이 작성을 하면 이동평균 값이 계산이 됩니다.

 

다음은 python의 library를 이용해서 주가와 이동평균선의 그림을 그려보겠습니다.

먼저 python에서 시각화를 할때 가장 많이 사용하는 matplotlib를 이용해보았습니다.

.
import matplotlib.pyplot as plt

plt.plot(data.index, data['Close'], label='Close')
plt.plot(data.index, data['MV_5'], label='MV5')
plt.plot(data.index, data['MV_20'], label='MV20')
plt.plot(data.index, data['MV_60'], label='MV60')
plt.plot(data.index, data['MV_120'], label='MV120')

plt.rcParams["figure.figsize"] = (20,14)
plt.legend(loc="best")

plt.title("Moving Average")
plt.grid()
plt.show()

 

그런데 위와 같은 그림을 그리면, HTS나 인터넷의 차트와는 다른 불편함이 존재합니다. 차트를 확대하기도 번거롭고, 각 포인트들의 값을 확인하기도 어렵습니다. 원하는 점에 마우스 포인터를 놓으면 차트의 값이 보인다던가, 드래그로 차트를 확대한다던가 하는 것은 차트가 'interactive' 해야 합니다. 한글로 번역하면 상호작용 할 수 있는 차트이고, python에도 상호작용이 가능한 방식이 몇가지 있습니다.

 그 중 plotly 라는 패키지를 이용했습니다. 그래프가 이쁜보이기도 하고, 사용하는 방식도 어렵지 않기 때문입니다. [plotly는 python 외에도 R, Julia 등의 언어에서 데이터 분석, 시각화 도구를 개발하는 회사라고 합니다.]

 

.
import plotly.graph_objects as go

fig = go.Figure()
fig.add_trace(go.Scatter(x=data.index, y=data["Close"],
                        mode='lines',
                        line=dict(color='black', width=4),
                        name="Close"))
fig.add_trace(go.Scatter(x=data.index, y=data["MV_5"],
                        mode='lines',
                        name="MV5"))
fig.add_trace(go.Scatter(x=data.index, y=data["MV_20"],
                        mode='lines',
                        name="MV20"))
fig.add_trace(go.Scatter(x=data.index, y=data["MV_60"],
                        mode='lines',
                        name="MV60"))
fig.add_trace(go.Scatter(x=data.index, y=data["MV_120"],
                        mode='lines',
                        name="MV120"))
fig.update_layout(title='Close and Moving Average@5,20,60,120',
                   xaxis_title='days',
                   yaxis_title='Stock Value')

fig.show()

 위 처럼 원하는 포인트의 정보를 알 수 있습니다. 기존 HTS, 웹의 차트처럼 드래그를 이용해서 확대를 할 수도 있습니다. python으로 시각화를 하거나, 특히 전처리, 탐색적 데이터 분석등을 진행 하시는 분들에게 유용할 듯 합니다.

 

 마지막 그림은 단순 이동 평균과 지수 이동 평균을 비교해본 그림 입니다.


 사실 위와 같은 지표들을 실제 활용할 때는 유의할 점이 있습니다. 이동평균선은 가장 먼저 배우는 기술적 지표이고, 골든크로스, 데드크로스는 가장 먼저 배우는 매수, 매도 신호 입니다. 기술적 분석을 하는 사람은 '전부 다 아는' 내용 이라는 것입니다.

 단순히 생각해서 골든 크로스에 주식을 사면 주가가 오르겠구나? 하는 생각을 맨 처음 하게 됩니다. 그 다음은 골든 크로스에 가기 직전에 사면 이득을 더 많이 보겠구나? 겠죠. 거기에 더해서 차트가 후행지표라는 점까지 고려해보면 위의 내용들만 가지고는 주식 시장에서 이득을 보기가 쉽지 않습니다. 

 하지만 주식 거래를 하는 사람들이 모두 보고 있는 정보이기도 해서, 추세를 본다거나 지지선, 저항선으로 활용하는 경우는 많습니다. 또한 고수들은 본인들이 활용하는 N일이 다르다고 합니다. 5일 이동평균선을 단기 추세로 생각하는 사람들도 있지만, 3일 이동평균선을 단기 추세로 봐서 좀더 빠르게 추세를 보고자 하는 사람들이 있다는 것입니다.

 

 

 저는 딥러닝, 머신러닝을 주식 모델링에 활용하고자 합니다. 모델링 과정에서 주식의 종가 뿐만 아니라 이동 평균 값을 변수로 넣으면 모델이 더 잘 작동할까요? 이동 평균 값은 단순 이동 평균이나 지수 이동 평균 중 무엇을 활용하는게 좋을까요? 아니면 둘다 활용하는게 좋을까요? 

 확실한 답변은 없습니다만, 주가를 모델링 하는 경우에 추가 변수로써 많이 활용하는 것으로 보입니다. 딥러닝, 머신러닝의 학습을 조금 더 쉽게 해주기 위해 정보를 추가로 넣어주는 것으로 생각됩니다.

 

 이와 비슷하게, 시간 정보를 훈련에 반영하는 RNN 계열의 모델링 보다, CNN의 경우에 지수 이동 평균의 유용성이 더 클 것이라고 예상해봅니다. 주가 모델링 자체가 딥러닝에서도 쉽지는 않습니다. 지수 이동 평균의 경우에는 각각의 포인트가 시간적인 정보, 과거의 데이터 정보를 어느정도 반영합니다. 그래서 학습이 더 용이해질 것이라고 조심스럽게 예상해봅니다.

 

 골든 크로스 등의 신호를 모델링에 활용해 볼 수도 있습니다. 변수를 만들기 나름 이지만, 인터넷을 찾아보면 단기 이동평균선의 값이 장기 이동평균선의 값보다 커질 때를 지정해서, 그 값을 매수 신호로 사용합니다. 모델링에서는 이를 변수로 만들어야 하니, one-hot encoding 등을 활용 해볼 수 있습니다.