본문 바로가기
Python

파이썬 주식, 가상 화폐 분석 - Death & Golden Cross

by 아짱이아빠 2021. 7. 16. 22:39
반응형

파이썬으로 Death Cross와 Golden Cross를 구현하여 주식이나 가상 화폐의 흐름이 상승할 것인지 하락할 것인지 예측하는 방법에 대해 알아보겠다.

 

먼저 간단히 Death Cross와 Golden Cross의 정의에 대해 알아보겠다. 

Death Cross는 단기  이동평균선이 장기 이동평균선 아래로 내려갈 때를 말하며 가격이 하락하는 표시로 활용된다.

반대로 Golden Cross는 단기 이동평균선이 장기 이동평균선 위로 올라갈 때를 말하며 가격이 상승할 것이라는 표시로 활용된다.

 

일반적으로 50일을 단기 이동평균선으로 하고 200일을 장기 이동평균선으로 한다.

 

다음은 본격적으로 파이썬 구현에 대해 알아보겠다.

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

 

분석에 사용되는 파이썬 모듈은 아래와 같다. 

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
plt.style.use('fivethirtyeight')
import FinanceDataReader as fdr

 

그리고 아래는 2019년도부터 이더리움의 원화 데이터를 불러와서 stock_data에 저장하는 코드이다.

stock_data = fdr.DataReader('ETH/KRW','2019')

 

달러화로 데이터를 받으려면 KRW 대신 USD를 넣으면 되며, 특정 월부터의 데이터 분석을 원하면 “2019,6”과 같이 수정하면 된다.

또한, ‘ETH/KRW’ 대신 주식 코드를 넣으면 주식 데이터를 불러올 수 있다.  

 

stock_data에 저장된 데이터는 아래의 코드로 시각화 할 수 있다.

plt.figure(figsize=(12,4))
plt.plot(stock_data.Close, lw=0.8)
plt.title('Close Price')
plt.xlabel('Date')
plt.ylabel('Price')
plt.xticks(rotation=45)
plt.show()

 

이더리움 데이터의 종가만을 그래프로 시각화한 것이며 아래와 같다.

2019년도 부터의 이더리움 가격
(2019년도 부터의 이더리움 가격)

이제 단기와 장기 이동평균을 구하는 부분이다.

def SMA(data, period=30, column='Close'):
  return data[column].rolling(window=period).mean()

 

파이썬의 Pandas DataFrame에서는 rolling 함수를 이용해서 이동평균을 아주 쉽게 구할 수 있다.

이동평균을 구하는 것을 정의하고(def) 아래와 같이 데이터와 원하는 평균 날짜를 입력하여 구한 이동평균을 기존 데이터의 새로운 column에 추가한다. 

stock_data['ShortSMA'] = SMA(stock_data, 50)
stock_data['LongSMA'] = SMA(stock_data, 200)

 

이제 이더리움의 종가와 50일 단기이동평균, 200일 장기이동평균을 아래의 코드를 이용하여 도식화하고 그 결과는 아래와 같다.

column_list = ['ShortSMA', 'LongSMA', 'Close']
stock_data[column_list].plot(figsize=(12,7),lw=0.8)
plt.title('Death / Golden Cross')
plt.show()

 

이더리움 Death & Golden Cross
(이더리움 Death & Golden Cross)

위의 그래프처럼 가격 차이가 심한 경우에 Death Cross와 Golden Cross 구분을 잘할 수 없을 수 있다.

 

그래서 추가적인 코드로 어느 날에 cross가 일어났는지 한번에 확인할 수 있다.

 

아래의 코드는 for 문을 이용하여 분석하려는 종가 데이터 전체 중에 단기 이동평균이나 장기 이동평균이 교차되는 지점이 오면 print 문으로 그때의 날짜와 함께 특정 문구를 출력하게 한 것이다. 

def death_golden_cross():
  first_cross = 0
  for i in range(0, len(stock_data)):
    if stock_data['ShortSMA'][i] < stock_data['LongSMA'][i] and first_cross ==0:
      print('Death cross on day', stock_data.index[i], ':expect the price to continue to fall')
      first_cross=1
    elif stock_data['ShortSMA'][i] > stock_data['LongSMA'][i] and first_cross ==1:
      print('Golden cross on day', stock_data.index[i], ':expect the price to continue to rise')
      first_cross=0

 

여기서 ‘first_cross’는 각 cross가 일어나는 지점만 번갈아 표시하기 위해 사용되었으며 이전 포스트에서 매수와 매도 시점을 표시하는 flag와 같은 역할을 한다.

 

위에서 정의한 부분을 아래의 코드로 실행 시킨다.

death_golden_cross()

 

 

그리고 결과는 아래와 같다.

 

이더리움 Death & Golden Cross 결과
(이더리움 Death & Golden Cross 결과)

 

앞의 그래프에서 잘 확인할 수 없었던 부분을 찾아 출력을 시킴으로써 확인이 쉽다.

 

이더리움은 21년도 중반부터 하락하기 시작해서 조만간 Death Cross가 일어날 것으로 보이며 21년도 하반기 내내 하락이 일어날 수 있으므로 투자에 유의할 필요가 있어 보인다.

 

아래는 비트코인(BTC)에 대한 분석 결과이다. 

비트코인 분석 결과 그래프
(비트코인 분석 결과 그래프)
비트코인 분석 결과
(비트코인 분석 결과)

 

이미 6월에 Death Cross가 있었고 역시 올해 하반기에는 하락세가 이어질 것으로 보인다.

 

아래는 보유하고 있는 현대바이오(048410) 주식에 대한 결과이다.

 

현대바이오 분석 결과 그래프
(현대바이오 분석 결과 그래프)
현대바이오 분석 결과
(현대바이오 분석 결과)

단기적으로 상승을 보고 투자했는데 결과는 이 추세로는 Death Cross가 발생할 것 같아 보인다. 

그러나 아직 발생하지 않았으므로 본격적인 하락세가 시작되었다고 믿고 싶지 않다. 

 

마지막으로 역시 투자 중에 있는 유니셈(036200) 주식에 대한 분석이다.

 

유니셈 분석 결과 그래프
(유니셈 분석 결과 그래프)
유니셈 분석 결과 그래프
(유니셈 분석 결과)

역시 작년 5월에 Golden Cross 이후 계속적인 상승이 있었고 최근 약간의 하락이 있었으나 아직 장기 이동평균과 단기 이동평균 간의 차이가 있어 금세 Death Cross가 일어날 것 같진 않다.

그전에 목표주가에 도달해서 매도를 해야 하는데 걱정이다.

 

여기까지 이동평균을 구해 주가에서 Death Cross와 Golden Cross를 확인하는 파이썬 코드에 대해 알아봤다.

 

반응형

댓글