본문 바로가기
Python

MFI를 통한 주식 매수/매도 시점 분석

by 아짱이아빠 2021. 4. 11. 12:30
반응형

이번에는 주식을 분석하는 지표 중 지난번 OBV(On Balance Volume) 기법에 이어 MFI(Money Flow Index)를 통한 방법을 알아보겠다.

 

파이썬을 이용하여 원하는 주식 데이터를 다운받고 그 데이터를 활용하여 MFI를 계산하고 그 결과를 주식 데이터의 종가(Close Price)에 반영하여 매수와 매도 시점을 판단하는 데에 도움을 주도록 하는 것이 목적이다. 

 

지난번에 OBV 기법을 통해 주식의 매도와 매수 시점을 판단해보았는데 하나의 기법으로만 주식의 흐름을 판단할 수 없으므로 MFI를 통해서도 매수와 매도 시점을 판단해봄으로써 주식 거래에 있어서 어느 정도의 도움이 되는지 확인해 보고자 했다.

OBV 기법을 통한 주식 매도와 매수 시점 분석은 아래 링크에 있다.

 

 

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

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

superhky.tistory.com

 

먼저 MFI에 대해 간단히 알아보겠다.

MFI는 주식의 가격과 거래량을 사용하여 주식이 과잉 매도인지 과잉 매수인지를 식별하는 지표로 사용된다.

이 지표를 통해 주식의 가격의 모멘텀이 변경된다는 일종의 경고 신호로 사용된다.

좀더 자세한 MFI 계산 방법과 결과에 대한 활용은 다음에서 코드를 얘기하면서 설명하도록 하겠다.

 

파이썬 코드는 유튜브 “Computer Science”의 강좌를 참고하였다.

 

MFI를 통한 주식 분석의 코드 구성은 다음과 같다.

 

MFI 분석 파이썬 코드 구성
(MFI 분석 파이썬 코드 구성)

 

 

[주식 데이터 불러오기 및 시각화]

 

주식 데이터를 불러와서 읽고 이를 시각화하는 데에 필요한 라이브러리는 다음과 같다.

입력 모듈
(입력 모듈)

대부분의 내용은 이전 OBV를 통한 분석이나 가상화폐 분석에서 사용한 것들과 동일하므로 설명은 하지 않겠다.

다만, 이번에는 “warning”라는 라이브러리를 사용하여 프로그램 실행 시 나오는 불필요한 경고 메시지를 숨기는 코드가 적용되었다.

‘ignore’는 메시지를 숨기는 기능이며 경고 메시지를 다시 보이게 하려면 ‘default’를 넣으면 된다.

실제로 Google Colab이나 주피터 노트북에서 한 줄씩 코드를 실행시키고 결과를 확인할 때에 불필요한 경고가 뜨면 귀찮을 때가 있는데 이러한 경우에 유용하다.

 

주식 데이터는 다음의 코드로 2020년 이후부터의 데이터를 불러와서 stock_data 변수에 저장하며 결과는 다음과 같다.

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

 

결과
(결과)

 

위의 주식 결과 중 종가(Close)를 시각화 하는 코드 및 결과는 아래와 같다.

역시 여기까지는 특별히 코드에 대해 설명할게 없다.

 

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

 

주식 종가 시각화 결과
(주식 종가 시각화 결과)



[MFI 계산 및 시각화]

 

여기서 부터는 MFI를 계산하는 내용이다.

 

MFI는 다음의 순서대로 계산한다.

먼저 평균가격을 구하고 이 평균 가격에 거래량을 곱하여 Money Flow를 구한다.

현재 가격과 전일 가격을 비교하여 Positive, Negative의 Money Flow를 계산하고 이를 14일 단위로 구한다.

14일은 정해진 것이 아니고 일반적으로 MFI에서 많이 사용했기 때문이며 정해진 값은 아니다. 즉, 나중에 MFI를 적용해서 주식 거래를 할 때에 14일이 아닌 다른 값을 적용하여 분석할 필요가 있음을 의미한다.

최종적으로 MFI는 (5)의 식을 통해 구하게 된다. 

 

MFI 계산 순서
(MFI 계산 순서)

 

(1) 평균가격은 다음의 코드와 같이 쉽게 계산하며 typical_price 변수에 저장한다. 

평균 가격
(평균 가격)

(2) Money Flow는 위에서의 평균 가격에 거래량을 곱한 것이다.

Money Flow
(Money Flow)

(3) Positive Money Flow와 Negative Money Flow를 구하는 코드이다.

먼저 각 변수에 빈 리스트를 만들고 현재의 평균가격과 전일의 평균 가격을 비교하여 각 조건에 해당할 때의 데이터를 저장한다.

평균 가격이 동일하면 0을 저장한다. 

Positive Negative Money Flow
(Positive & Negative Money Flow)

(4)을 구하기 위하여 period 변수에 14를 저장하고 다음의 코드를 통해 계산한다. 

 

14일 동안의 Positive Negative Money Flow 합
(14일 동안의 Positive & Negative Money Flow 합)

위 코드에서는 14일 동안의 합을 구하기 위해 for 문에서 정의한 i를 잘 보면 좋을 것 같다.

앞에서 period는 14로 정의했으므로 이 for 문의 i 는 13부터 시작하여 Positive Money Flow의 데이터 수만큼 수행된다.

그래서 첫 번째 순서를 계산하면 i + 1 - 14 = 0 이고 i + 1 = 14로 for 문의 첫 번째는 Positive Money Flow의 0부터 14까지 14개 즉, 14일간의 의 데이터를 합하게 된다.

그다음은 당연히 1부터 15까지 14일간의 데이터 합이 된다.

프로그래밍을 잘한다는 것은 고급 명령어를 잘 쓰고 간결하게 코드를 구성하는 능력을 말하겠지만  개인적으로는 이와 같이 14일이라는 기간만큼의 합을 for 문을 통해 구할 때에 for 문을 정의하는 이와 같은 부분도 프로그래밍 능력에 중요한 부분이 아닐까 생각된다.

(내가 워낙에 초짜다 보니 이런 걸 쉽게 정의하는 게 신기해 보여서 일지도 모르겠다.)

 

다음은 (5)번 MFI를 구하는 코드이다.

Money Flow Index
(Money Flow Index)

앞에서 구한 값들은 리스트이며 리스트 간에는 나누기나 곱하기와 같은 연산자가 적용되지 않으므로 리스트를 numpy array로 만들어 계산한다.

 

다음은 계산한 MFI를 시각화하는 코드와 결과이다.

MFI 시각화 코드
(MFI 시각화 코드)

 

MFI 시각화 결과
(MFI 시각화 결과)

 

MFI의 결과에 X축 방향으로 10, 20, 80, 90 퍼센트에 해당하는 직선을 긋기 위해 “axhline” 코드를 사용하였다.

여기서는 사용되지 않지만 만약 Y축 방향으로 직선을 그리려면 “axvline”을 사용하면 된다.

앞에서 얘기했지만 MFI 결과가 80%를 넘으면 과잉 매수가 발생한 것이고 20% 밑으로 내려가면 과잉 매도가 발생한 것으로 판단한다.



[매수 및 매도 판단]

 

앞에서 구한 MFI 결과를 바탕으로 주식의 매수 시점과 매도 시점을 판단하는 코드를 알아보겠다.

각 매수와 매도의 판단 기준은 앞에서 얘기한 바와 같이 80%를 넘느냐 20% 밑으로 내려가느냐를 기준으로 표시한다.

 

먼저 아래의 코드로 새로운 dataframe을 만들고 여기에 시작일이 14일 지난 주식 데이터에 앞에서 구한 MFI 데이터를 추가한다.

데이터의 시작일 부터 14일간은 MFI 데이터가 없기 때문에 14일 이후부터 데이터를 활용한다.

새로운 dataframe 생성
(새로운 dataframe 생성)

다음은 매도 신호와 매수 신호를 정의하는 코드이다.

이후부터는 이전에 OBV를 이용한 주식 분석에서 다룬 내용과 유사하다.

“high”라고 정의한 값보다 MFI가 크면 그때의 주식 종가에 매도 신호가 정의되고 반대로 “low”라고 정의한 값보다 MFI가 작으면 그 시점의 주식 종가에 매수 신호를 정의한다.

신호를 정의하는 코드는 이전에 OBV를 이용한 주식 분석에 다룬 내용과 유사하다.

다른 점은 OBV 분석에서는 특정 기준을 넘는 순간이나 밑으로 내려가는 순간만을 표시하기 위해 코드에 'flag'를 사용하였으나 여기서는 단순히 기준을 넘고 있을 때와 밑으로 내려가 있을 때를 표시한다는 것이다.  

 

buy & sell 신호 정의
(buy & sell 신호 정의)

위에서 정의한 내용을 아래의 코드로 실행시켜 결과를 새롭게 생성한 dataframe에 “Buy”와 “Sell” column을 만들어 저장한다.

buy & sell 정의 실행
(buy & sell 정의 실행)

아래의 코드를 이용하여 최종 결과를 시각화 한다.

 

시각화 코드
(시각화 코드)

 

결과
(결과)

최종 결과를 분석해 보면, 20년도 2월쯤 매수를 하고 4월에 매도를 하는 것으로 나왔는데 여기서는 수익이 거의 없었을 것으로 보이나 8월부터 매수를 하고 21년 2월에 매도를 하는 신호를 따랐다면 수익을 얻었을 것이다.

이 결과로 보면 MFI 지표가 실제 수익과 꽤 괜찮은 연관성을 갖었음을 알 수 있다.

 

이쯤에서 이전에 알아본 OBV 지표로 같은 기간의 주식 분석 결과는 어떠한지 비교해볼 필요가 있다.

 

OBV를 통한 결과
(OBV를 통한 결과)

위는 같은 기간의 주식 데이터를 OBV 기법으로 분석하여 매수와 매도 시점을 표현한 것이다.

OBV를 통해서도 어느 정도 수익이 발생했을 것으로 보인다.

하지만 MFI 지수는 주식의 가격이 변하는 모멘텀을 예측할 수 있는 지수여서 인지 거의 정확하게 가격이 하락하는 시점에 매도를 하거나 가격이 다시 오르는 시점에 매수를 하는 신호가 있는 반면에 OBV의 결과는 하락세가 시작되거나 상승세가 시작되고 나서 신호를 표현하는 경향이 있다. 

 

사실 다른 종목에 대해서도 이 두 가지 결과를 비교해 봤는데 결과는 위와 정 반대의 결과가 나오기도 했다. 

OBV가 더 많은 수익을 볼 수 있었던 신호를 생성했고 MFI는 주가와 반대의 결과를 보이기도 하였다.

결국 한 가지가 아닌 다양한 지표를 통해 주식을 분석할 필요가 있다.

 

그래서 두 개 이상의 주식 분석 지수를 종합 판단하여 매수/매도 신호를 생성하면 어떨까 라는 생각을 하게 되었으며 다음에는 이 주제로 알아볼 예정이다.

 

반응형

댓글