[Python] mplfinance, matplotlib을 이용하여 삼성전자의 MACD 차트 그리기

이 포스트에서는 주식시장의 트렌드 분석을 위한 그래프를 그리는 과정을 다룬다. 이 과정은 초기 설정과 데이터 준비, 차트 아웃라인 생성, 메인차트 그리기, MACD 지표 및 MACD 오실레이터 히스토그램 그리기, 차트 타이틀, 범례, 눈금 설정 및 차트 출력의 5가지 부분으로 구성된다. 각 부분은 코드와 설명으로 상세하게 제시되어 있으며, 이를 따라하면 직접 주식 차트를 그릴 수 있을 것이다.

초기 설정과 데이터 준비

차트를 그리기 위해 필요한 라이브러리와 모듈을 임포트하고, 원하는 주식의 데이터를 준비한다. yahooquery를 사용해 Yahoo Finance에서 주가 데이터를 가져오며, 데이터는 특정 기간 동안의 시가, 종가, 최고가, 최저가 등을 포함한다. 이러한 데이터는 차트에 사용되는 주요 구성 요소이다.

코드

python
from yahooquery import Ticker
import pandas as pd

# 화면에 보여질 데이터 갯수
show_count = 250
# x축에 표시될 tick 갯수
tick_count = 10

# 삼성전자의 주식 데이터를 yahooquery에서 다운로드
samsung = Ticker('005930.KS')
data = samsung.history(period="2y")
# 'symbol'과 'date'에 대한 인덱스를 리셋하고 'date' 컬럼으로 새 인덱스 설정
data.reset_index(inplace=True)
data['date'] = pd.to_datetime(data['date'])
data.set_index('date', inplace=True)

# talib 라이브러리를 이용한 이동평균선 계산
data["sma5"] = talib.SMA(data.close, timeperiod=5)  # 5일 이동평균선
data["sma20"] = talib.SMA(data.close, timeperiod=20) # 20일 이동평균선
data["sma60"] = talib.SMA(data.close, timeperiod=60) # 60일 이동평균선

# MACD 계산
data["macd"], data["macd_signal"], data["macd_hist"] = talib.MACD(data['close'])

# 최근 250개 데이터만 사용
data = data.tail(show_count)

설명

  1. 데이터 설정: 화면에 보여질 주식 데이터의 개수(show_count)와 x축의 눈금 개수(tick_count)를 설정한다.
  2. 삼성전자 데이터 다운로드: yahooquery를 통해 삼성전자의 주식 데이터를 2년 동안의 기간으로 다운로드한다. yahooquery를 사용하여 주식 데이터를 어떻게 가져올 수 있는지에 대한 방법은 [파이썬] Yahooquery로 과거 주식 데이터와 재무 데이터 얻는 방법에서 확인할 수 있다.
  3. 인덱스 설정: yahooquery로 다운로드 한 데이터는 'symbol'과 'date'에 인덱스가 설정되어 있으므로, 그래프를 그리기 위해서는 'date' 컬럼을 datetime 타입으로 변환하고 새 인덱스로 재설정해야 한다.
  4. 이동평균선 계산: TA-Lib 라이브러리를 이용하여 5일, 20일, 60일 이동평균선을 계산한다. 이동평균선을 어떻게 계산하고 사용하는지에 대한 자세한 방법은 [TA-Lib] #4: TA-Lib를 활용한 이동평균 분석 - 시장추세 확인 및 골든 크로스와 데드 크로스 포착에서 볼 수 있다.
  5. MACD 계산: MACD, MACD Signal, MACD Histogram을 계산한다. 이들 값들은 주식의 모멘텀을 분석하는 데 사용되며, MACD를 어떻게 계산하고 분석하는지에 대한 자세한 내용은 [TA-Lib] #6: TA-Lib를 활용한 MACD 계산 및 분석에서 읽을 수 있다.
  6. 데이터 필터링: 분석에 사용할 데이터 중 최근 250개만 선택한다. 이 단계는 주어진 시간 기간 동안의 최근 동향을 분석하는 데 중점을 둔다.

차트 아웃라인 생성

차트의 전반적인 형태와 크기를 설정한다.

코드

python
import matplotlib.pyplot as plt
import mplfinance as mpf

# 전체 그래프의 크기 설정
fig = mpf.figure(figsize=(12,10))

# 메인 차트, MACD 차트, MACD 오실레이터 차트를 위한 서브플롯 생성
ax_main = fig.add_subplot(5, 1, (1, 3), facecolor='white') # 메인 차트
ax_macd = fig.add_subplot(5, 1, (4 ,4), facecolor='white') # MACD 차트
ax_hist = fig.add_subplot(5, 1, (5 ,5), facecolor='white') # MACD 오실레이터 차트

# 서브플롯 간의 간격 조정
fig.tight_layout()

설명

  1. 전체 그래프 크기 설정: mpf.figure(figsize=(12,10))을 통해 전체 그래프의 크기를 가로 12인치, 세로 10인치로 설정한다. 이 크기는 전체 그래프 창의 크기를 결정한다.
  2. 서브플롯 생성: 서브플롯은 전체 그래프 창 내에서 개별 차트의 위치와 크기를 정의한다.
    • 메인 차트: fig.add_subplot(5, 1, (1, 3), facecolor='white')에서 첫 번째 인자 5는 전체 그래프를 세로로 5등분하고, 두 번째 인자 1은 가로로 1등분한다는 의미이다. 세 번째 인자 (1, 3)는 세로로 나눈 5개의 부분 중 처음 3개를 메인 차트에 할당하겠다는 의미이다.
    • MACD 차트: fig.add_subplot(5, 1, (4, 4), facecolor='white')에서 (4, 4)는 세로로 나눈 5개의 부분 중 네 번째 부분을 MACD 차트에 할당하겠다는 의미이다.
    • MACD 오실레이터 차트: fig.add_subplot(5, 1, (5, 5), facecolor='white')에서 (5, 5)는 세로로 나눈 5개의 부분 중 마지막 부분을 MACD 오실레이터 차트에 할당하겠다는 의미이다.
  3. 간격 조정: 서브플롯 간의 간격을 조정하기 위해 fig.tight_layout()을 사용한다. 이렇게 하면 그래프가 전체 공간에 균일하게 배치되어 보기 좋은 레이아웃이 생성된다.
메인 차트, MACD, MACD 오실레이터를 각각 다른 영역에 배치한 차트 아웃라인
메인 차트, MACD, MACD 오실레이터를 각각 다른 영역에 배치한 주식 차트 아웃라인. 각 세부 영역은 주식의 다양한 측면을 분석할 수 있게 구성된다.

메인차트(캔들스틱 차트 및 이동평균선) 그리기

캔들스틱 차트는 주식 시장의 트렌드를 분석하는 중요한 도구이다. 시가, 종가, 최고가, 최저가를 그래픽으로 표현하며, 이동평균선은 주가의 일정 기간 평균을 선으로 나타낸다. TA-Lib 라이브러리를 사용하면 이러한 분석을 편리하게 수행할 수 있다.

코드

python
added_plots = {
    'MA5' : mpf.make_addplot(data.sma5, type='line', ax=ax_main, width=1.5),
    'MA20' : mpf.make_addplot(data.sma20, type='line', ax=ax_main, width=1.5),
    'MA60' : mpf.make_addplot(data.sma60, type='line', ax=ax_main, width=1.5),
}

mc = mpf.make_marketcolors(up="#BE452D", down="#4375E0", edge='black')

s  = mpf.make_mpf_style(marketcolors=mc, gridcolor='#DDDDDD', gridstyle="--")

mpf.plot(data, 
         style=s,
         type='candle', 
         ax=ax_main,  
         addplot=list(added_plots.values()),
         datetime_format='%Y-%m-%d',
         returnfig=True)

ax_main.set_ylabel('')

설명

  1. 이동평균선 플롯 설정: mpf.make_addplot 함수를 이용해 5일, 20일, 60일 이동평균선을 선 그래프로 그린다. 여기서 ax=ax_main은 이동평균선을 메인 차트에 그리겠다는 의미이다.
  2. 마켓 색상 설정: mpf.make_marketcolors 함수를 사용해 캔들스틱 차트의 상승과 하락에 대한 색상을 지정한다. 이 예제에서는 상승을 빨간색(#BE452D), 하락을 파란색(#4375E0)으로 표시한다.
  3. 스타일 설정: mpf.make_mpf_style 함수를 이용해 그래프의 전체적인 스타일을 설정한다. 여기서는 마켓 색상과 그리드 색상, 그리드 스타일을 지정하고 있다.
  4. 캔들스틱 차트 그리기: mpf.plot 함수를 사용하여 캔들스틱 차트와 앞서 설정한 이동평균선을 함께 그린다. 여기서 addplot 인자로 이동평균선 플롯을 추가하며, datetime_format으로 날짜 형식을 지정한다.
  5. Y축 라벨 설정: ax_main.set_ylabel('')을 통해 Y축의 라벨을 제거한다.

이 코드는 mplfinance 라이브러리를 이용하여 구글 주식의 캔들스틱 차트와 이동평균선을 그리는 과정을 보여준다. mplfinance 라이브러리는 매우 간단하게 캔들스틱 차트, 이동평균선을 그릴 수 있으며, 내장된 스타일을 이용할 수 있다는 장점이 있다.

자세한 사용법은 [Python] mplfinance를 이용하여 캔들스틱 차트 그리기에서 mplfinance 라이브러리를 이용해 캔들스틱 차트 그리는 방법을 확인할 수 있다.


MACD 지표 및 MACD 오실레이터 히스토그램 그리기

MACD 지표는 두 개의 이동평균선 간의 차이를 나타내며, 이 차이는 트렌드의 강도와 방향을 파악하는 데 중요한 역할을 한다. MACD 오실레이터 히스토그램은 이 차이를 막대그래프로 표현해 시각적으로 분석을 도와준다.

코드

python
ax_macd.plot([0, len(index)-1], 
                 [0, 0], 
                 color='#DE0000', 
                 linestyle='--', 
                 linewidth=0.7)

ax_macd.plot(data.index, 
                data['macd'], 
                label='MACD')

ax_macd.plot(data.index,
                data['macd_signal'], 
                label='MACD Signal')

histogram = data['macd_hist']
index = data.index.strftime('%Y-%m-%d')
ax_hist.bar(list(index), list(histogram.where(histogram > 0)), 0.7, color="#EC3019")
ax_hist.bar(list(index), list(histogram.where(histogram < 0)), 0.7, color="#4375E0")

설명

  1. 중앙선 그리기: MACD 차트의 중앙선을 그린다. 이 선은 MACD 값이 양수인지 음수인지 판단하는 기준선으로 사용된다. 중앙선은 빨간색 대쉬 라인(#DE0000)으로 표시된다.
  2. MACD 및 MACD Signal 그리기: ax_macd.plot 함수를 이용해 MACD 값과 MACD Signal 값을 선 그래프로 그린다.
  3. MACD 히스토그램 그리기: ax_hist.bar 함수를 사용해 MACD 히스토그램을 그립니다. 여기서 양수와 음수를 판별하여 각각 빨간색(#EC3019)과 파란색(#4375E0)으로 표시한다.
  • 인덱스 문자열 변환: 바 차트를 그릴 때 인덱스를 문자열로 변경하는 주된 이유는 주식 데이터와 같이 평일만 존재하는 연속된 날짜를 다룰 때의 문제를 해결하기 위함이다. 일반적으로 x축에 datetime 형태로 전달하면, 연속되는 날짜 중 없는 날짜(예: 주말)는 0 값으로 대체하여 그린다. 이러한 방식은 주식 시장과 같이 특정 일자에만 데이터가 존재하는 경우에는 부적절할 수 있다. 따라서 인덱스를 '년-월-일' 형식의 문자열로 변환하여, x축에 날짜가 연속적으로 표시되지 않도록 함으로써, 데이터가 존재하지 않는 날짜의 표시를 방지한다. strftime('%Y-%m-%d') 함수를 사용하여 날짜 인덱스를 해당 문자열 형식으로 변환한다.

차트 타이틀, 범례, 눈금 설정 및 차트 출력

이 섹션에서는 차트의 완성을 위해 필요한 마지막 단계들을 수행한다. 타이틀을 추가해 차트의 주제를 명확히 하고, 범례를 통해 차트의 각 부분을 설명한다. 눈금 설정은 축의 단위를 지정하며, 모든 설정을 완료한 후 차트를 출력한다.

코드

python
# 각 차트의 제목 설정
ax_main.set_title('삼성전자', fontsize=15)
ax_macd.set_title('MACD', fontsize=15)
ax_hist.set_title('MACD Oscillator', fontsize=15)

# 메인 차트의 범례 설정
font = font_manager.FontProperties(family='NanumGothic', weight='normal')
ax_main.legend([None]*(len(added_plots)+2))
handles = ax_main.get_legend().legend_handles
ax_main.legend(handles=handles[2:], labels=list(added_plots.keys()), prop=font)

# MACD 차트의 범례 설정
ax_macd.legend(loc=2, prop=font)

# x축 눈금 설정
step = (len(data) - 1) / (tick_count - 1)
ticks = [0 + int(step * i) for i in range(tick_count)]
ax_main.xaxis.set_ticks(ticks)
ax_macd.xaxis.set_ticks(ticks)
ax_hist.xaxis.set_ticks(ticks)
ax_main.xaxis.set_ticklabels([])
ax_macd.xaxis.set_ticklabels([])

# 그리드 설정
ax_main.grid(color='#dddddd', linestyle='--', linewidth=0.5)
ax_macd.grid(color='#dddddd', linestyle='--', linewidth=0.5)
ax_hist.grid(color='#dddddd', linestyle='--', linewidth=0.5)

# 그래프 표시
plt.show()

설명

  1. 차트 제목 설정: 각 차트의 제목을 설정하기 위해 ax_main.set_title, ax_macd.set_title, ax_hist.set_title을 사용한다. 각 메서드의 인자로 제목의 문자열과 글꼴 크기를 전달한다.
  2. 메인 차트의 범례 설정: 메인 차트에 이동평균선의 범례를 설정한다. mplfinance로 그려진 차트는 직접적으로 범례를 그릴 수 없으므로, 여러 단계의 절차를 거쳐 범례를 추가한다. 먼저 ax_main.legend([None]*(len(added_plots)+2))를 통해 빈 범례를 만든 후, handles를 사용하여 실제 범례 핸들을 가져와 범례를 설정한다.
  3. MACD 차트의 범례 설정: MACD 차트에 범례를 추가한다. 위치와 폰트 속성을 지정할 수 있다.
  4. x축 눈금 설정: tick_count 변수를 사용하여 x축에 표시될 눈금의 개수를 계산하고 설정한다. 각 눈금의 위치는 전체 데이터 길이와 눈금 개수에 따라 균일하게 배치된다.
  5. 그리드 설정: 각 차트의 그리드 스타일과 색상을 설정한다. 이를 통해 차트의 가독성을 높이다.
  6. 그래프 표시: plt.show()를 호출하여 그래프를 화면에 표시한다.

메인 차트의 범례 설정은 mplfinance 라이브러리의 특정한 동작 방식으로 인해 복잡한 절차가 필요한 부분이며, 이 부분을 정확하게 이해하고 구현하는 것이 중요하다.


캔들스틱 차트, 이동평균선, MACD 지표 및 MACD 오실레이터 히스토그램을 포함한 차트.
주어진 기간 동안의 구글의 캔들 차트, MACD, MACD 오실레이터. 이 차트는 주식의 가격 트렌드와 거래 시그널을 분석하는 데 도움이 된다.

FAQs

  1. yahooquery를 사용하여 데이터를 가져오는 과정이 복잡한가요?
    • 간단하다, yahooquery는 Yahoo Finance에서 데이터를 가져오는 작업을 매우 간단하게 만들어준다. 특정 주식의 특정 기간에 대한 데이터를 쉽게 가져올 수 있으며, 복잡한 설정 없이도 원하는 데이터를 즉시 사용할 수 있다. 자세한 정보는 [파이썬] Yahooquery로 과거 주식 데이터와 재무 데이터 얻는 방법에서 확인할 수 있다.
  2. TA-Lib를 사용하여 이동평균선을 어떻게 그릴 수 있나요?
  3. MACD 지표는 왜 중요한가요? 어떻게 사용하나요?
    • MACD 지표는 트렌드의 강도와 방향을 파악하는 중요한 도구이다. 두 개의 이동평균선 간의 차이를 통해 시장의 모멘텀을 평가하고 투자 결정을 내릴 수 있다. TA-Lib를 사용하면 MACD 지표를 쉽게 계산하고 분석할 수 있다. 자세한 분석 방법은 [TA-Lib] #6: TA-Lib를 활용한 MACD 계산 및 분석에서 찾아볼 수 있다.
  4. 차트의 범례와 눈금 설정은 왜 중요한가요?
    • 범례와 눈금은 차트를 읽고 이해하는 데 중요한 역할을 한다. 범례는 차트의 다양한 선과 색상이 무엇을 나타내는지 설명하며, 눈금은 차트의 축에 대한 정확한 값과 단위를 제공한다. 이러한 요소들은 차트의 가독성을 향상시키고, 사용자가 차트에서 중요한 정보를 더 쉽고 정확하게 파악할 수 있도록 돕는다.
  5. 이 프로젝트를 위해 어떤 프로그래밍 지식이 필요한가요?
    • 이 프로젝트를 수행하려면 기본적인 Python 프로그래밍 지식과 데이터 시각화에 대한 이해가 필요한다. yahooquery, TA-Lib와 같은 라이브러리를 사용하면 복잡한 계산과 시각화를 매우 간단하게 만들 수 있으므로, 복잡한 수학적 지식은 필수적이지는 않다. 해당 라이브러리와 모듈에 대한 자세한 내용은 앞서 제공한 링크에서 참조할 수 있다.
© Copyright 2023 CLONE CODING