- 주가 불러오는 법은 이전 강좌참조
- 모든 투자는 개인의 판단 아래 이루어져야 합니다.
- 최종 업데이트 일자: 2023년 9월 8일
과거 주식의 가격이나 거래량 같은 자료를 이용하여 주가 변화의 추세를 발견하여 미래의 주가를 예측하는 방법입니다. 대체적으로 주가는 이미 시장의 수요와 공급에 결정된다는 가정아래 시작하여, 일반적으로 주식거래의 과거자료의 차트를 수단으로 하여, 주가변화 추세를 찾아내고 이를 이용하여 주가를 예측하는 방법론입니다. 따라서 기술적 분석을 지지하는 사람들은 주가의 장단기적인 추세나 거래량 등과 같은 것을 통해 미래의 주가를 예측할 수 있다고 이야기합니다.
기술적 분석의 장점은 이해하기 쉽고 접근 하기 쉽다는 데 있습니다. 대부분의 MTS(Moblie Trading System)이나 HTS(Home Trading System)에서도 기술적 분석에서 사용하는 대부분의 방법론을 기본으로 제공하며, 직관적으로 이해하는 데도 쉽습니다.
하지만, 장기적인 추세를 반영하기 힘들다는 점과 급격한 시장변화가 생겼을 때 대응할 수 없다는 것이 단점입니다.
그럼에도 불구하고, 기술적분석에 대해 이해해야 하는 근본적인 이유는 단기적으로 주식의 가격이 고평가 되어있는지 등과 같이 매수타이밍과 매도타이밍을 잡을 때 참고할 수 있는 자료가 될 수 있기 때문입니다.
MACD는 Moving Average Convergence & Divergence의 약자로 주가의 장기이동선과 단기 이동선이 수렴 또는 발산하는 지를 보는 지표입니다. MACD관련 차트를 바라볼 때는 크게 MACD선과 Signal Line(시그널선)으로 구성됩니다.
먼저 MACD의 선의 경우, 단기이동평균(7~15일)과 장기이동평균(20~30일)의 차이를 의미하게 됩니다. 단기이동평균이 장기이동평균보다 클 경우에는, MACD선이 양수가 되며, 주가가 상승하는 시그널로 여겨지곤 합니다. 반대로, 장기이동평균이 단기이동편균보다 클 경우에는, MACD선이 음수가 되며 주가가 떨어지는 시그널로 여겨집니다.
다음 Signal선의 경우에는 일정기간(7일~10일)의 MACD의 이동평균선을 나타냅니다. MACD선과 Signal선이 교차하는 시점이 단기이동평균과 장기이동평균의 차이가 가장 큰 것으로 보고 이때는 매수 또는 매도 시그널로 잡습니다. 즉, MACD선이 시그널선 위로 올라가는 시점을 매수타이밍, 반대로 MACD선이 시그널선 아래로 내려가게 되면 매도타이밍으로 봅니다.
이제 이를 Python으로 구현하여 봅시다. 보통 MACD와 같은 기술적분석을 활용할 때는 종가를 이용하기 때문에 종가를 불러왔습니다. 이동평균을 구할 때 쓰는 함수는 .rolling()이라는 함수입니다.
stock_price['Ndays_MA']=stock_price['Close'].rolling(N).mean()
N일 만큼의 이동평균을 구할 수 있는 함수는 위와 같습니다. 저 같은 경우에는 N에 각각 7과 28을 넣어 7일이동평균과 28일이동평균을 구했고, Matplotlib이라는 패키지를 이용하여, 그래프로 그려보았습니다.
이제 위의 이동평균선을 이용해서 MACD선과 Signal선을 그려보겠습니다. MACD선은 단기이동평균에서 장기 이동평균에서 뺀 것이기 때문에 아래와 같이 코드를 작성하였고, 그래프를 그려보았습니다.
stock_price['MACD']=stock_price['7MA']-stock_price['28MA']
stock_price['Signal']=stock_price['MACD'].rolling(7).mean()
2020년의 경우, 연초의 코로나의 영향으로 인해 급격하게 떨어질 때, MACD가 Signal선보다 아래있었으며, 이후 상승장에서부터는 MACD가 Signal 선보다 높다는 것을 확인할 수 있었습니다.
Stochastic 의 사전적인 뜻은 "확률적인" 이라는 뜻입니다. 그렇다보니, 이 방법론은 주식이 매번 오르고 매번 떨어지지 않는다라는 슈터의 확률과 같은 접근으로 바라보는 지표입니다.
Stochastic Method는 주식의 가격이 과열적으로 올랐다면, 확률적으로 떨어질 것이라고 생각하고, 반대로 주식의 가격이 과하게 떨어졌다면, 다시 확률적으로 올라갈 것이라고 생각하는 방법론입니다. 이러한 Stochastic Method에는 Fast Stochastic과 Slow Stochastic이 존재합니다.
먼저 Fast Stochastic의 경우 위와 같은 공식에 의해서 구해지고, 이 값이
80%이상일 경우에는, 주식의 가격이 너무 과열되어 있다는 것을 의미(매도시그널)하고, 반대로 값이 20%이하일 경우에는, 주식의 가격이 너무 과하게 떨어졌다는 것을 의미(매수시그널)합니다.
하지만, Fast Stochastic의 경우, 단기매매의 경우에는 활용되기는 하지만, 그래프의 변화가 잦기 때문에, 잘못된 신호가 발생할 수 있어 잘 사용되지는 않는다. 이를 보안하기 위해 이 Fast Stochastic의 값을 일정기간(보통 5일)의 이동평균선을 그린 것을 Slow Stochastic이라고 한다. 이렇게 이동평균선을 활용하게 되면 그래프의 변화가 적어져 확인하기 쉬워집니다.
stock_price['Min_Close_N']=df['Close'].rolling(N).min()
stock_price['Max_Close_N']=df['Close'].rolling(N).max()
MACD때와 같이 rolling(N)을 이용하여 최근 N일간의 최저가와 최고가를 구할 수 있습니다.
stock_price['Fast_Stochastic']=(stock_price['Close']-stock_price['Min_Close_N'])/(stock_price['Max_Close_N']-stock_price['Min_Close_N'])
위와 같이 하여 아까 나왔던 Fast Stochastic 공식을 작성할 수 있다.
이제 나온 값을 N일간 이동평균 시켜 Slow Stochastic을 구해줄 것이다.
stock_price['slow_Stochastic']=stock_price['Fast_Stochastic'].rolling(N).mean()
필자같은 경우에는 N일을 7일로 지정하여 아래와 같이 그래프를 그려보았습니다. 기준이 0.8이상일 때는 시장이 과열되었다고 판단하고, 반대로 0.2이하일때는 주식이 과하게 떨어졌다고 판단할 수 있을 것입니다.
<제시하는 기준은 대체로 사용되는 기준일 뿐이고, 본인이 원하는 기준으로 바꾸어도 됩니다.)
이 그래프를 통해 2020년 3월부근에서는 위의 기준으로 보았을 때 주가가 너무 떨어졌다는 것을 확인 할 수 있으며, 지속적인 상승장이었던 2020년 11월 이후로는 과열되었다는 것을 확인할 수 있습니다.
RSI는 Relative Strength Index로 상대강도지수라고 불리는 방법입니다. 일정기간(보통 14일)동안 주가의 상승폭과 하락폭을 비교하여 주식이 상승되는 수치가 큰지, 반대로 하락하는 수치가 큰지 상대적인 수치를 백분율로 나타낸 지표입니다. RSI를 구하는 공식은 아래와 같습니다.
이 RSI수치는 백분율로 표현되기 때문에 당연히 0에서 100사이이며, 대체로 30이하일 경우에는 매수, 반대로 70이상일 경우에는 매도를 해야되는 시그널로 판단합니다.
여기서 사용할 핵심 코드는 .diff()라는 코드와 .where()라는 코드입니다.
Result=(DataFrame.diff())
먼저 .diff() 코드는 두 값의 변화량을 보여주는 코드입니다. 이번에는, 전날과의 주가 변화량을 파악하기 위해 사용하였습니다.
result = DataFrame.where(condition, replacement)
.where는 주어진 조건을 분류하고 만족하지 않는 행 또는 요소를 다른 값으로 대체하는 데 사용됩니다. 이 코드를 활용해서 위의 .diff()를 통해 얻어진 변화량을 양수와 음수로 변화하는데 사용하였습니다.
stock_price['delta']=(stock_price['Close'].diff())
stock_price['delta_plus'] = stock_price['delta'].where(stock_price['delta']>=0,0)
stock_price['delta_minus'] = stock_price['delta'].where(stock_price['delta']<0,0).abs()
stock_price['AU']=stock_price['delta_plus'].rolling(14).mean()
stock_price['DU']=stock_price['delta_minus'].rolling(14).mean()
stock_price=stock_price.dropna()
stock_price['RS']=stock_price['AU']/stock_price['DU']
stock_price['RSI']=100-(100/(1+stock_price['RS']))
stock_price
필자같은 경우에는 RSI를 구할 때 N=14로 잡고 작성하였습니다. 위의 구한 RSI를 그래프로 표현하였을 때 아래와 같습니다.
주가와 비교해보았을 때에도 코로나때 주가가 급격하게 빠졌던 3월에는 매수 시그널이 나왔으며, 11월 이후 주가가 급격하게 올랐을 때는 매도 시그널이 나오는 것을 확인할 수 있습니다.
CCI는 Commodity Channel Index라고 불리는 지표로 주가와 주가의 일정기간의 이동평균선을 비교하여, 주가가 평균값에서 얼마나 차이나는지 알아보는 방법입니다. 원래는 선물이나 주가의 계절성과 주기성을 알아보기 위해 고안되었지만, 지금은 주가가 기간의 평균값과의 높낮이를 비교하여, 0을 기준으로 (+)값은 과매수구간 반대로 (-)값은 과매도구간으로 나누어, 주가의 가격을 예측하는 방법으로 발전되었습니다. CCI의 수식은 아래와 같습니다.
CCI를 구현하기 위해 전에 썼었던 .rolling(N)을 그대로 사용할 것 입니다. 저는 Typical Price를 구하기 위해서는 7일의 이동평균을 SMA를 그리기 위해서는 14일의 이동평균을 사용하였습니다.
stock_price['High_Average']=stock_price['High'].rolling(7).mean()
stock_price['Low_Average']=stock_price['Low'].rolling(7).mean()
stock_price['Close_Average']=stock_price['Close'].rolling(7).mean()
stock_price['Typical_Price']=(stock_price['High_Average']+stock_price['Low_Average']+stock_price['Close_Average'])/3
stock_price['SMA']=stock_price['Typical_Price'].rolling(14).mean()
stock_price['Sigma']=(stock_price['Typical_Price']-stock_price['SMA']).abs().rolling(14).mean()
stock_price['CCI']=(stock_price['Typical_Price']-stock_price['SMA'])/(stock_price['Sigma']*0.015)
코드만 보았을 때는 지금까지 사용했었던 코드들 만을 사용하여 작성할 수 있었습니다.
CCI 값들을 그림으로 그려보면 위와 같습니다. 0을 기준으로 (+)값은 과매수구간 반대로 (-)값은 과매도구간으로 보면, 2020년 초에는 과매도구간이므로 매수타이밍을 의미합니다. 반대의 경우에는 시장이 과열되어 기대하는 가격보다 높은 시장가를 형성했다는 뜻이므로 매도타이밍이라고 볼 수 있을 수 있을 것입니다. 실제로 그때 주가는 연간 최저가를 찍었으며, 매수하기 좋은 타이밍으로 볼 수 있습니다. 또한 급격하게 올랐었던 2020년 6월에 매도 타이밍이 있었으며, 2020년 11월에도 매수타이밍이 있어, 2020년 12월에 매도하였을 때 수익이 있었다는 것을 어느정도 예상할 수 있습니다.