차밍이
[Python] 거래량 막대 그래프, 캔들스틱 차트에 같이 표현하기 - 파이썬 주식투자(4) 본문
목차
이전 글에서 파이썬에서 캔들스틱 차트로 kospi 지수 또는 주식 차트를 그리는 방법을 알아보았습니다.
이번 글에서는 기존의 Candlestick chart + 거래량 막대그래프를 그려보겠습니다.
기존 내용은 skip 하고 거래량 그래프 부분을 진행하겠습니다.
부족한 부분은 이전 글과 아래 코드를 통해서 참고해주세요.
[Python] pandas_datareader 코스피 코스닥 지수 데이터 가져오기 // 파이썬 주식투자(1)
[Python] KOSPI 이동평균선, 주가 이동평균선 구하기 // 파이썬 주식투자(2)
[Python] 캔들 스틱 차트 그리기, Candlestick Chart 그리기 - 파이썬 주식투자(3)
이전 소스코드 종합
from mpl_finance import candlestick2_ohlc
import matplotlib.ticker as ticker
import matplotlib.pyplot as plt
from pandas_datareader import data
from datetime import datetime
import pandas as pd
import numpy as np
# 데이터를 가져올 날짜 설정
start_date = datetime(2020,5,8)
end_date = datetime(2020,10,8)
# 야후에서 코스피 데이터 가져오기
kospi_df = data.get_data_yahoo("^KS11", start_date, end_date)
# 지수 이동평균선 데이터 구하기
kospi_df['MA3'] = kospi_df['Close'].rolling(3).mean()
kospi_df['MA5'] = kospi_df['Close'].rolling(5).mean()
kospi_df['MA10'] = kospi_df['Close'].rolling(10).mean()
kospi_df['MA20'] = kospi_df['Close'].rolling(20).mean()
fig = plt.figure(figsize=(20,10))
ax = fig.add_subplot(111)
index = kospi_df.index.astype('str') # 캔들스틱 x축이 str로 들어감
# 이동평균선 그리기
ax.plot(index, kospi_df['MA3'], label='MA3', linewidth=0.7)
ax.plot(index, kospi_df['MA5'], label='MA5', linewidth=0.7)
ax.plot(index, kospi_df['MA10'], label='MA10', linewidth=0.7)
# X축 티커 숫자 20개로 제한
ax.xaxis.set_major_locator(ticker.MaxNLocator(10))
# 그래프 title과 축 이름 지정
ax.set_title('KOSPI INDEX', fontsize=22)
ax.set_xlabel('Date')
# 캔들차트 그리기
candlestick2_ohlc(ax, kospi_df['Open'], kospi_df['High'],
kospi_df['Low'], kospi_df['Close'],
width=0.5, colorup='r', colordown='b')
ax.legend()
plt.grid()
plt.show()
그래프 프레임 잡기
일반적인 주가 그래프는 위의 사진과 같습니다.
위쪽에는 일봉 캔들 차트가 아래에는 거래량 막대그래프가 위치합니다.
matplotlib
의 subplot2grid
함수를 사용해서 구간을 나누어줍니다.
fig = plt.figure(figsize=(20,10))
top_axes = plt.subplot2grid((4,4), (0,0), rowspan=3, colspan=4)
bottom_axes = plt.subplot2grid((4,4), (3,0), rowspan=1, colspan=4, sharex=top_axes)
bottom_axes.get_yaxis().get_major_formatter().set_scientific(False) # 거래량 값 그대로 표현
주가 그래프를 넣을 top_axes
부분과 거래량을 넣을 bottom_axes
부분으로 총 2개 부분으로 나누어 그래프 구역을 설정하였습니다.
여기서 구간을 나누는 방법인 rowspan과 colspan은 wikidocs에 설명이 더 잘 나와있으니 해당 부분을 참고하시면 좋을 것 같습니다.
거래량 그래프
우선 matplotlib에서 그래프를 그릴 때, 색깔을 설정하는 방법에 대해 알아보겠습니다.
일단, 다음과 같이 실행을 하면 그래프에 색깔이 빨간색으로 입혀집니다.
fig = plt.figure(figsize=(20,10))
ax = fig.add_subplot(111)
# 거래량 그래프
ax.bar(index, kospi_df['Volume'], color='r')
# 그래프 title과 축 이름 지정
ax.xaxis.set_major_locator(ticker.MaxNLocator(10))
ax.set_title('KOSPI Volume', fontsize=22)
ax.set_xlabel('Date')
plt.grid()
plt.show()
하지만 color = 'r'
또는 다른 색 'b', 'g'
등을 주더라도 단색으로만 표현됩니다.
그래서 각 막대 별로 원하는 색깔을 주기 위해 각각 지정해주어야 합니다.
이때, 형식은 color를 리스트 형식으로 넣습니다.
example : color = ['r' , 'r', 'b', 'b', ... ]
이런 식으로 해주어야 각각 색깔을 다르게 지정할 수 있습니다.
거래량 그래프에서 빨간색과 파란색 구분하기
거래량 그래프는 전일 대비 거래량이 늘어나면 빨간색
전일 대비 거래량이 감소하면 파란색으로 표현됩니다.
# 색깔 구분을 위한 함수
color_fuc = lambda x : 'r' if x >= 0 else 'b'
# kospi 거래량의 차이
kospi_df['Volume'].diff().fillna(0) ## 첫 행은 값이 Nan이므로 0으로 채워줌
# 색깔 구분을 위한 함수를 apply 시켜 Red와 Blue를 구분한다.
color_df = kospi_df['Volume'].diff().fillna(0).apply(color_fuc)
# 구분된 값을 list 형태로 만들어준다.
color_list = list(color_df)
>>> ['r', 'b', 'r', 'b', 'r', 'r', 'b', 'r', 'b', 'b', ... 많음]
-
DataFrame에서 diff() 매소드를 사용해서 차이를 구합니다.
-
차이가 0보다 크면 : 전일보다 거래량이 증가 >> 빨간색을 의미하는 'r'
-
차이가 0보다 작으면 : 전일대비 거래량이 감소한 것 >> 파란색 'b'
-
이것을 List 형태로 만들어 그래프 color에 지정해주면 됩니다.
# 그래프를 그릴때, color = color_list를 넣어서 색깔을 지정함
ax.bar(index, kospi_df['Volume'], color=color_list)
여기까지 진행된 것
현재까지 진행된 거래량 그래프를 그려보면 아래와 같습니다.
fig = plt.figure(figsize=(20,10))
ax = fig.add_subplot(111)
# 거래량 그래프
ax.bar(index, kospi_df['Volume'], color=color_list)
ax.get_yaxis().get_major_formatter().set_scientific(False) # 거래량 값 그대로 표현
# 그래프 title과 축 이름 지정
ax.xaxis.set_major_locator(ticker.MaxNLocator(10))
ax.set_title('KOSPI Volume', fontsize=22)
ax.set_xlabel('Date')
plt.grid()
plt.show()
최종 그래프 그리기 & 최종 소스코드 및 결과
#----------------------------------------------------------------------------------#
# 그래프 구역 나누기
fig = plt.figure(figsize=(20,10))
top_axes = plt.subplot2grid((4,4), (0,0), rowspan=3, colspan=4)
bottom_axes = plt.subplot2grid((4,4), (3,0), rowspan=1, colspan=4, sharex=top_axes)
bottom_axes.get_yaxis().get_major_formatter().set_scientific(False)
#----------------------------------------------------------------------------------#
# 인덱스 설정
idx = kospi_df.index.astype('str')
# 이동평균선 그리기
top_axes.plot(idx, kospi_df['MA3'], label='MA3', linewidth=0.7)
top_axes.plot(idx, kospi_df['MA5'], label='MA5', linewidth=0.7)
top_axes.plot(idx, kospi_df['MA10'], label='MA10', linewidth=0.7)
# 캔들차트 그리기
candlestick2_ohlc(top_axes, kospi_df['Open'], kospi_df['High'],
kospi_df['Low'], kospi_df['Close'],
width=0.5, colorup='r', colordown='b')
#----------------------------------------------------------------------------------#
# 거래량 날짜 지정
color_fuc = lambda x : 'r' if x >= 0 else 'b'
color_list = list(kospi_df['Volume'].diff().fillna(0).apply(color_fuc))
bottom_axes.bar(idx, kospi_df['Volume'], width=0.5,
align='center',
color=color_list)
#----------------------------------------------------------------------------------#
# 그래프 title 지정
top_axes.set_title('KOSPI INDEX', fontsize=22)
# X축 티커 숫자 20개로 제한
top_axes.xaxis.set_major_locator(ticker.MaxNLocator(10))
# X축 라벨 지정
bottom_axes.set_xlabel('Date', fontsize=15)
top_axes.legend()
plt.tight_layout()
plt.show()
위에서 만들었던 Frame에 기존 소스코드와 거래량 막대 바 그래프를 집어넣으면 완성됩니다.
이렇게 하여 python을 사용하여 캔들스틱 차트와 거래량 그래프를 함께 그려보는 방법을 알아보았습니다.
KOSPI 지수 이외에도 코스닥 지수 또는 다른 종목들도 위와 같이 그래프를 그려볼 수 있습니다.
다른 주식들의 데이터를 가져오는 방법은 이전 글을 통해서 확인할 수 있습니다.
[Python] pandas_datareader 코스피 코스닥 지수 데이터 가져오기 // 파이썬 주식투자(1)
'투자 > Quant & BackTest' 카테고리의 다른 글
EPS와 PER이 무엇이며, 수익률에 미치는 영향은 ? (1) | 2022.12.24 |
---|---|
[퀀터스] 퀀트 투자 팩터의 신뢰성 검증(1) - 10분위 테스트 - PER,PBR,PSR,POR (1) | 2022.12.19 |
[Python] 주식 오버나잇(Overnight) 효과 파악 분석 - 파이썬 주식투자(5) (0) | 2020.12.22 |
[Python] 캔들 스틱 차트 그리기, Candlestick Chart 그리기 - 파이썬 주식투자(3) (6) | 2020.10.12 |
[Python] KOSPI 이동평균선, 주가 이동평균선 구하기 // 파이썬 주식투자(2) (1) | 2020.10.11 |
[키움 OpenAPI] 자동 로그인 설정하기 (0) | 2020.08.28 |
[키움 OpenAPI] mfc100.dll이(가) 없어.. 시스템 오류 해결방법 (1) | 2020.07.06 |
[키움 openAPI] OpenAPI OCX를 탑재한 프로그램을 종료하신 후 확인버튼을 눌러주시기 바랍니다. (0) | 2020.06.20 |