본문 바로가기
Python

Python을 이용한 주식 및 가상화폐 분석 - MACD & Fibonacci 전략

by 아짱이아빠 2021. 5. 16. 15:24
반응형

이전 글에서 Fibonacci Retracement Level을 통해 주식 시세나 가상화폐 시세 분석을 하는 것에 대해 알아봤다.

그리고 그 이전에는 MFI와 OBV와 같은 보조 지표 분석을 통해 매수와 매도 시점을 알아내는 방법에 대해도 소개하였다.

이러한 보조 지표 등을 알아보면서 느낀 점은 한 가지 보조 지표만으로 매수와 매도 전략을 하는 것은 위험성이 클 수 있다는 것이었다.

그래서 이번에는 이전에 알아본 Fibonacci Retracement Level과 MACD 보조 지표를 결합한 분석방법을 주식과 가상화폐 시세에 적용하여 매수와 매도 시점을 알아내는 것에 대해 알아보겠다.

 

Fibonacci Retracement Level을 통한 주식 분석에 대한 내용은 아래의 링크를 참조하기 바란다.

 

 

파이썬을 이용한 주식, 가상 화폐 분석 - Fibonacci Retracement

이번에는 Fibonacci 수열을 통해 주식을 분석하는 파이썬 코드에 대해 알아보겠다. Fibonacci 수열과 이를 통한 주식 분석에 대해 간단히 알아보면 다음과 같다. 먼저 Fibonacci 수열은 13세기 수학자 레

superhky.tistory.com

 

MACD는 주가의 단기 이동 평균과 장기 이동 평균값 사이의 관계를 보여주는 지표이다.

MACD는 단기 이동 평균에서 장기 이동 평균을 뺀 값이고 Signal은 MACD의 이동 평균이다.

보통 단기는 12일, 장기는 26일, Signal은 9일로 한다.

이렇게 해서 구해낸 MACD와 Signal 간의 관계 속에서 매수와 매도 시점을 찾는데, MACD가 Signal을 상향 돌파할 때에 매수, 하향 돌파할 때에는 매도를 한다.

 

Fibonacci Retracement Level과 MACD를 조합하는 원리는 다음과 같다. 

Fibonacci Retracement Level은 하향하는 주가에서는 지지 레벨이 되고 상향하는 주가에서는 저항 레벨이 된다.

그러므로  주가가 Fibonacci Retracement Level을 하향 돌파하거나 상향 돌파하는 조건에서 MACD와 Signal간의 관계 속에서 매수와 매도 시점을 판단하는 것이다.

 

본격적으로 파이썬 코드를 살펴보겠다.

참고로 여기서 사용된 코드는 유튜브의 “Computer Science” 강좌를 참고하였다.

 

[주식 데이터 로드 및 시각화]

분석을 위해 불러오는 라이브러리와 기본적인 시세 시각화 코드는 이전 글에서와 동일하므로 이전 글들을 참고하기 바란다. 

여기서는 생략하고 결과만 보도록 하겠다. 

 

위지윅스튜디오 주식 종가 그래프
(위지윅스튜디오 주식 종가 그래프)

 

위는 요새 메타버스 관련 주로 관심을 받고 있는 위지윅스튜디오(종목코드:299900)의 2020년도부터의 종가를 시각화한 것이다.

여기서 아래의 코드를 추가하면 위에서와 같이 X축의 날짜를 45도 회전시켜 표현할 수 있다.

 

plt.xticks(rotation=45)

 

 

[Fibonacci Retracement Level 계산 및 MACD 산출]

 

아래는 Fibonacci Level을 계산하는 코드이다.

Fibonacci Retracement Level 계산 코드
(Fibonacci Retracement Level 계산 코드)

분석하는 기간의 최고가와 최저가의 차에 Fibonacci 수열을 곱하여 각 레벨을 계산하는 것이다.

자세한 사항은 이전 글을 소개되었으니 참고하기 바란다.

 

다음은 MACD와 Signal을 계산하는 코드이다.

MACD 계산 코드
(MACD 계산 코드)

파이썬에서 이동 평균은 ewm 함수를 사용하위 쉽게 구할 수 있다.

span=12로 함으로써 12일의 단기 이동 평균을 구하여 LongEMA 변수에 저장한다.

adjust는 True가 디폴트 셋팅 인데 여기서처럼 False로 하면 재귀적인 방법으로 이동평균을 구한다고 하는데 좀 어려워서 여기서 넘어가도록 하겠다.

 

MACD는 단기 이동 평균과 장기 이동 편균의 차로 구하고 이 MACD를 9일 평균으로 계산하는 것이 Signal이 된다.

Fibonacci Retracement Level과 MACD의 시각화 코드
(Fibonacci Retracement Level과 MACD의 시각화 코드)

앞에서의 Fibonacci Retracement Level을 위지윅스튜디오 주식 종가에 적용한 그래프를 그리는 코드와 MACD, Signal 라인을 시각화하는 코드는 위와 같으며 그 결과는 아래와 같다.

시각화 역시 이전 글에서 많이 중복되므로 자세한 설명은 하지 않겠다.

다만, subplot을 이용하여 두 개의 그래프를 그리면서 위쪽 그래프의 X축 라벨이 아래 그래프의 X축 라벨과 동일하므로 위쪽 그래프의 X축 라벨을 삭제하는 코드가 중간에 포함되어 있다.

Fibonacci Retracement Level과 MACD 시각화 결과
(Fibonacci Retracement Level과 MACD 시각화 결과)

 

[Fibonacci와 MACD 분석 결합]

이제부터는 앞에서 계산한 Fibonacci Retracement Level과 MACD를 결합을 정의하는 부분이다.

 

먼저 아래의 함수를 정의한다.

이 함수는 주식의 종가가 Fibonacci Retracement의 어느 레벨에 있는지를 확인한다.

Fibonacci Retracement Level 결정 함수 정의
(Fibonacci Retracement Level 결정 함수 정의)

종가(=price)가 특정 레벨보다 같거나 높으면 그 레벨과 바로 아래의 하위 레벨을 불러오는 식이다.

현재 분석하는 가격이 Fibonacci 레벨의 어느 구간에 있는지 확인하여야 MACD 분석을 통한 매수나 매도 시점과 최종 비교가 가능하므로 이 정의가 필요하다.

 

다음은 이 분석의 핵심이 되는 부분으로서 최종적으로 buy signal과 sell signal을 확인하는 부분이다.

Finonacci & MACD 분석 코드
(Finonacci & MACD 분석 코드)

코드가 다소 복잡해 보이지만 원리는 다음과 같으니 설명을 읽고 코드를 보면 이해가 쉽게 될 것이다.

기본적으로 for 문을 통해 분석하는 기간의 주식 데이터를 하나씩 분석을 수행한다.

맨 처음의 가격 데이터는 첫 Fibonacci Retracement Level을 결정하는 데 사용된다.

그다음 가격 데이터부터 하나씩 Fibonacci Retracement Level에서 변동이 있는지를 검사한다.

특정 가격의 상위 레벨과 같거나 더 높은지 또는 하위 레벨과 같거나 낮은 지를 판단하며 이에 해당한다면 Fibonacci Retracemet Level을 닿거나 돌파하는 순간으로 판단하게 된다.

이 조건이 성립할 때에 MACD 라인이 Signal 라인을 넘게되면 매수의 지점이 되어 buy signal을 생성한다.

반대로 MACD 라인이 Signal 라인 밑에 있게 되면 sell signal을 생성한다.

위의 모든 조건을 만족하지 않으면 아무 신호도 만들지 않으며 그 다음 가격 데이터 분석을 위해 다음 가격이 해당하는 Fibonacci Retracement Level을 업데이트한다.

 

여기에 한 가지 더 포함되어 있는 것은 buy signal에 의해 매수 시점이 정해지고 그때의 가격 데이터가 last_buy_price에 저장되어 sell signal이 생성될 때의 조건이 되어 이 가격보다 낮으면 sell signal이 생성되지 않게 된다.

즉, 매도 가격은 매수 가격보다 높을 때만 가능하게 되어 손해를 보지 않도록 하고 있다.

 

[결과 분석]

앞에서의 결과를 시각화하면 다음과 같다.

시각화 코드 역시 이전 글에서 알아본 것과 동일하므로 여기서는 생략하도록 하겠다.

 

위지윅스튜디오 분석 결과
(위지윅스튜디오 분석 결과)

 

21년 1월 초에 매수 신호가 있고 2월 말쯤에 매도 신호가 있음을 알 수 있다.

이후에도 각 한 번씩 더 매수와 매도 신호가 있으며 전체적으로 이 신호데로 매수와 매도가 있었다면 손해는 보지 않았을 것으로 꽤 괜찮은 결과라 생각한다.

다만, 저점에서 매수가 일어나고 고점에서 매도가 일어나지는 않았다.

아무래도 실제 시세보다 느리게 따라갈 수밖에 없는 MACD의 경향과 확률적인 부분의 Fibonacci Retracement Level 이므로 완벽을 기대할 수는 없을 것이다.

 

다음은 대표적인 가상화폐인 비트코인과 이더리움, 그리고 최근 머스크 때문에 떡상(?)한 도지 코인에 대해 이 분석을 적용해 보았다.

 

비트코인(BTC) 분석 결과
(비트코인(BTC) 분석 결과)

 

비트코인은 3월 중에 매수 신호가 있어서 이때에 만약 매수했다면 4월 중에 Fibonacci Retracement의 제일 높은 레벨에 닿으면서 매도의 찬스가 있었을 것 같으나 MACD가 Signal 라인 밑에 있어서 매도 신호가 생성되지 않았다.

이후 현재까지 매수 가격보다 낮아진 상태이거나 매수할 때와 동일한 Fibonacci Retracement Level이므로 매도하지 못하고 있는 상황이다.

결론적으로 이 분석으로는 4월 중 매도의 찬스를 놓치게 되며 전체적으로 별로 유효하지 못하다는 생각을 한다.

 

이더리움(ETH) 분석 결과
(이더리움(ETH) 분석 결과)

위는 이더리움에 대한 분석 결과이다.

이더리움은 4월부터 현재까지 많은 상승이 있었다.

Fibonacci Retracement의 각 Level을 돌파하면서 가격이 상승했고 MACD가 Signal 라인보다 계속 위에 있는 상승장이어서 아직 매도 신호가 나오지 않은 상태이다.

4월 초에 매수하고 4월 중하순에 매도함으로써 조금의 이윤을 남길 수 있었겠으나 그다지 유효해 보이지는 않는다.

 

 

도지(DOGE) 코인 분석 결과
(도지(DOGE) 코인 분석 결과)

위는 도지 코인에 대한 분석 결과이다.

도지 코인은 4월 들어 급상승과 급하락을 하였다.

그래서 4월에 매수 신호가 한 번 있고 5월 중에 매도 신호가 있었으나 실제로 시세가 정점에 있었을 때에는 매도를 하지 못한 결과가 나왔다.

 

Fibonacci Retracement Level과 MACD를 결합한 이 분석은 기본적으로 시세의 변화가 Fibonacci Retracement Level의 확률적인 가정을 따라와 줘야 하는데 가상화폐의 시세는 그렇지 않고 급상승과 급하락을 하므로 잘 맞지 않는 것으로 생각된다.

 

그러나 주식의 경우는 어느 정도 매수와 매도의 전략에 고려해 볼 만하다는 생각을 한다.

이 분석에 대한 공부를 하면서 Fibonacci Retracement Level 대신 실제 과매수 또는 과매도를 통해 시세의 흐름을 예측할 수 있는 MFI를 적용해보면 어떨까라는 생각을 했다.

그래서 다음에는 MFI와 MACD를 결합한 방법에 대해 알아보려고 한다.

 

반응형

댓글