본문 바로가기
Python

OBV를 통한 주식 매입/매도 시점 분석

by 아짱이아빠 2021. 1. 31. 12:49
반응형

이번에는 파이썬을 이용하여 주식 데이터를 분석하는 방법에 대해 알아보겠다.

주식 데이터를 분석하는 방법에는 여러 가지 있으나, 이번에 알아볼 것은 OBV를 이용하는 방법이고 이를 파이썬을 통해 구현해 보겠다.

이전에도 얘기했지만 파이썬 공부를 위해 여러 가지 프로젝트를 해보고 있다. 파이썬 뿐만 아니라 주식에 대한 공부도 할 겸 이 주제를 정했으며 파이썬 코드는 유튜브 동영상 강의를 참고하였다.

 

OBV에 대해 간단히 알아보겠다.

먼저 OBVOn Balance Volume의 약자이며 주식의 거래량은 항상 주가에 선행한다는 것을 전제로 거래량을 통해 분석을 하는 기법이다.

거래량 분석을 통해 주식이 매집단계에 있는지 분산 단계에 있는지 알아낼 수 있으며 거래량이 중심이 된 투자 판단을 내릴 수 있다.

 

OBV의 계산은 다음과 같다.

   (1)   If 오늘 주식 종가 > 전날의 주식 종가, 이전까지의 거래량 합산에 오늘 거래량을 합함

   (2)   If 오늘 주식 종가 < 전날의 주식 종가, 이전까지의 거래량 합산에 오늘 거래량을 뺌

 

주가는 별다른 변화가 없거나 떨어졌는데 OBV가 상승했다면 이후 주가가 상승할 가능성이 있다고 볼 수 있으며 반대로 주가가 상승하는데 OBV가 하락하고 있다면 매도세력이 있으므로 주가는 하락할 가능성이 있다고 볼 수 있다.

 

이제부터 본격적으로 주가 분석을 해보겠다.

앞으로 알아볼 프로그램은 다음의 구조를 가지고 있다.

 

OBV를 이용한 주식 분석 프로그램 구조
(OBV를 이용한 주식 분석 프로그램 구조)

 

위의 구조에서 핵심이 되는 부분은 OBV/OBV_EMA를 구하는 부분과 이를 통해 주식을 사는 시점(Buy Signal)과 파는 시점(Sell Signal)을 생성하는 부분이라 할 수 있다.

 

분석할 주식을 불러와서 위에서 얘기한 방식으로 OBV를 구하고 OBV의 지수이동평균(EMA, Exponential Moving Average)을를 구하여 이 OBVOBV_EMA가 넘는 순간이 주식을 매입할 시점이 되고 OBVOBV_EMA 아래로 내려가는 지점이 주식을 매도하는 시점이 된다.

 

최종적으로 이 시점들을 주식 종가 그래프에 표현함으로써 주식 매입/매도 활동에 얼마큼 효과적인지 알아볼 것이다.

 

 

[1. 모듈 Import]

이 프로그램에는 다음의 모듈들이 사용된다.

모듈 import
(모듈 import)

위에서 “plt.Style.use(‘fivethirtyeight’)”은 그래프 스타일을 결정한다.

다른 그래프 스타일은 “print(plt.style.available)”을 통해 가능한 스타일을 확인할 수 있다.

 

 

[2. 주식 데이터 블러오기]

아래는 yahoo finance에서 주식 데이터를 가져오는 코드이다.

주식 데이터 로드
(주식 데이터 로드)

주식 데이터는 코스피 종목이며 코스닥 종목은 KQ를 적용하고 코드를 적으면 된다.

가져온 주식 데이터는 “stock_data” 변수에 저장한다.

두 번째 줄은 분석할 데이터 수를 줄이기 위해 과거부터 1150개의 데이터를 잘라내는 내용이다.

 

불러온 주식 데이터는 다음의 코드를 통해 주식의 종가(Close)를 그래프로 시각화한다.

주식 종가 시각화 코드
(주식 종가 시각화 코드)

 

주식 종가 그래프
(주식 종가 그래프)

 

[3. OBV OBV_EMA 분석]

다음은 OBV 구하는 코드이다.

OBV 산출 코드
(OBV 산출 코드)

앞에서도 얘기했지만, OBV는 주식의 현재 종가가 이전날 종가보다 높으면 이전까지의 거래량에 현재 거래량을 더하고 반대로 현재 종가가 이전날 종가보다 낮으면 현재 거래량을 빼줌으로써 산출할 수 있다.

 

아래는 산출한 OBV의 지수이동평균을 구하여 OBV_EMA 이름으로 저장한다.

OBV 지수이동평균을 구하는 코드
(OBV 지수이동평균을 구하는 코드)

이동평균선은 과거 며칠 동안의 주가 평균을 구하고 이를 계속 이어서 표시하는 선이다.

이동평균선과 현재의 주가의 괴리가 얼마나 벌어져 있는가를 통해 주식 매매를 결정하기도 한다.

이러한 이동평균선에는 단순이동평균(SMA), 지수이동평균(EMA), 가중이동평균(WMA)등을 사용하는데 여기서는 지수이동평균을 이용한다.

 

지수이동평균은 과거 특정한 기간의 주가를 단순 평균하는 것이 아니고 최근의 가격에 더 높은 가중치를 두어 산출하므로 과거보다는 최근의 시장 분위기를 잘 반영한다고도 할 수 있다.

이러한 지수이동평균은 파이썬에서 위의 코드와 같이 쉽게 구할 수 있으며, 20일의 지수이동평균을 구하기 위해 “span”20을 넣었다.

 

OBV OBV_EMA는 앞에서 불러온 stock_data에 각 colume을 추가하여 넣게 된다.

OBVOBV_EMA를 그래프로 시각화하면 다음과 같다.

OBV & OBV_EMA
(OBV & OBV_EMA)

주황색 선이 OBV 라인이며 보라색 선이 OBV_EMA 라인이다.

 

 

[4. 매입(Buy)과 매도(Sell) 신호 생성]

다음은 OBVOBV_EMA를 이용하여 주식을 사야 하는 시점인 Buy signal과 주식을 팔아야 하는 시점인 Sell Signal을 구해보겠다.

앞에서도 얘기했지만 OBV가 OBV_EMA를 넘을 때가 Buy 시점이고 반대로 OBV가 OBV_EMA 밑으로 내려갈 때가 Sell 시점이 된다.

이를 아래와 같이 정의한다.

Buy Signal / Sell Signal 정의
(Buy Signal / Sell Signal 정의)

 

col1col2를 비교하면서 각 조건이 맞을 때 주식의 종가를 저장한다.

여기서 Flag의 역할은 두 개의 비교 대상이 서로 교차가 이루어지는 시점에만 데이터를 저장할 수 있게 하는 역할을 한다.

 

위의 Definition은 다음의 코드를 통해 실행되고 stock_datacolumn이 추가된다.

definition 실행
(definition 실행)

아래의 stock_data의 결과이다.

stock_data 결과
(stock_data 결과)

 

[5. 결과 시각화]

마지막은 앞에서 수행한 결과를 시각화하는 것이다.

결과는 주식의 종가에 매입 시점과 매도 시점을 그래프에 표현한 것이며 다음의 코드로 수행한다.

결과 시각화 코드
(결과 시각화 코드)

 

alpha는 그래프의 투명도를 세팅하는 것으로 이를 통해 그래프 위에 signal 표시가 잘 보이도록 하였음을 알 수 있다.

 

다음은 최종 결과이다.

OBV 분석을 통한 주가 분석 결과
(결과)

 

위의 결과를 보면, Buy Signal에서 주식을 매입했을 때 항상 주식이 오르진 않았다.

또한, Sell Signal에서 매도를 했을 때 항상 주식이 떨어진 것도 아니고 오른 경우도 있다.

그렇지만 전체적으로 보면 10월부터 다음 해 1월까지 약 3개월 동안 대체적으로 매입 시점 이후 주가가 오르고 주가가 떨어진 지점에서 매도신호가 생성됨으로써 결과가 나쁘진 않은 것으로 보인다.

 

지금까지 주식의 거래량을 통해 주가를 분석하는 방법인 OBV와 지수이동평균선 EMA를 이용하여 주식의 매입 시점과 매도 시점을 분석하는 내용을 파이썬을 통해 구현하는 방법을 알아봤다.

 

파이썬을 공부하면 할수록 참 직관적이고 쉽게 많은 것을 해볼 수 있는 언어라는 생각을 하게 된다.

그리고 이 프로그램을 공부하면서 주식에 대한 공부도 조금은 할 수 있었다.

반응형

댓글