[파이썬] matplotlib 라이브러리를 활용한 금융 데이터 시각화

2023. 10. 4. 14:33DATA PROGRAMMING/PYTHON

matplotlib은 데이터 자료를 시각화하는 대표적인 파이썬의 라이브러리이다.

파이썬으로 배우는 알고리 트레이딩(개정판 - 2쇄)의 내용을 공부하며 정리한 글이다.

 

 

matplotlib을 활용한 금융 데이터 시각화

 

matplotlib 기본

import matplotlib.pyplot as plt

x = range(0, 100)
y = [v*v for v in x]
plt.plot(x, y)


plt.show()

아주 간단한 코드 작성으로 이차함수의 일부분 만들 수 있었다.

 

한 화면에 여러 개의 그래프 그리기

한 화면에 여러 그래프를 표현하고 싶으면 figure함수를 활용하면 된다.

 

 

fig = plt.figure()
ax1 = fig.add_subplot(2, 1, 1)
ax2 = fig.add_subplot(2, 1, 2)

plt.show()

2행 1열로 만들고 ax1을 1행에 들어간 그래프, ax2를 2행에 들어간 그래프로 설정한다.

 

 

import numpy as np
import matplotlib.pyplot as plt

x = np.arange(0.0, 2 * np.pi, 0.1)
sin_y = np.sin(x)
cos_y = np.cos(x)

fig = plt.figure()
ax1 = fig.add_subplot(2, 1, 1)
ax2 = fig.add_subplot(2, 1, 2)

ax1.plot(x, sin_y, 'b--')
ax2.plot(x, cos_y, 'r--')

plt.show()

numpy를 통해 사인과 코사인값을 구할 수 있다. x값에 0부터 파이까지(사인, 코사인 함수의 한 주기)의 값을 0.1 간격으로 저장하고, 이 값들에 대한 사인 코사인값들을 표현하는 그래프를 1행과 2행에 각각 출력한다.

 

set_xlabel, legend 함수 등을 활용해 라벨과 x축, y축 이름을 설정할 수 있다.

x = np.arange(0.0, 2 * np.pi, 0.1)
sin_y = np.sin(x)
cos_y = np.cos(x)

fig = plt.figure()
ax1 = fig.add_subplot(2, 1, 1)
ax2 = fig.add_subplot(2, 1, 2)

ax1.set_xlabel('x')
ax1.set_ylabel('sin(x)')

ax2.set_xlabel('x')
ax2.set_ylabel('cos(x)')

ax1.plot(x, sin_y, 'b--', label = 'sin(x)')
ax2.plot(x, cos_y, 'r--', label = 'cos(x)')

ax1.legend(loc='upper left')
ax2.legend(loc='upper left')
plt.show()

 

 

*matplotlib의 객체들

 

matplotlib을 활용한 금융 데이터 시각화

 

이번엔 matplotlib을 활용하여 '애플'의 수정 종가와 거래량을 시각화해 보려고 한다.

 

import numpy as np
import matplotlib.pyplot as plt
import yfinance as yf
import datetime
import pandas as pd

start_date = datetime.datetime(2021, 7, 1)
end_date = datetime.datetime(2021, 12, 31)

df = yf.download('AAPL', start=start_date, end=end_date)

우선 yfinance를 활용해 2021년 7월 1일부터 2021년 12월 31일까지 애플의 데이터를 가져와 데이터프레임 형태로 저장해 준다.

 

fig = plt.figure(figsize=(12, 8))

top_axes = plt.subplot2grid((4,4), (0,0), rowspan=3, colspan=4)
bottom_axes = plt.subplot2grid((4,4), (3,0), rowspan=1, colspan=4)

subplot을 사용하지 않고 subplot2grid 함수를 사용하면 grid를 활용하여 조금 더 디테일한 그래프를 표현할 수 있다.

우선 너비가 12, 높이가 8인 figure를 생성하고, 4*4의 그리드 중 위 3행, 전체 열을 top_axes, 마지막 행, 전체 열을 bottom_axes에 저장한다. 

파란 부분이 top_axes, 빨간 부분이 bottom_axes이다.

 

 

bottom_axes.get_yaxis().get_major_formatter().set_scientific(False)

해당 코드를 통해 bottom_axes(거래량 값) 매우 커졌을 시에 지수 형태로 표현되지 않게 해준다.

 

plt.tight_layout()

그래프의 크기를 여백 없이 자동으로 맞춰준다.

 

 

 

top_axes.plot(df.index, df['Adj Close'], label='Adjusted Close')
bottom_axes.plot(df.index, df['Volume'])


plt.show()

이제 각 데이터 값을 대입해 주면 그래프를 표현할 수 있다.

top_axes.plot(df.index, df['Adj Close'], label='Adjusted Close')
bottom_axes.plot(df.index, df['Volume'])


plt.show()

 

 

 

matplotlib을 활용한 캔들 차트 시각화

 

캔들 차트는 주가를 볼 때 가장 많이 사용하는 차트이다. 이를 matplotlib을 통해서 시각화할 수 있다.

캔들 차트는 저가, 종가, 시가, 고가가 모두 포함되며 시가와 종가 중 누가 크냐에 따라 빨간색 봉과 푸른색 봉으로 구분해 줘야 한다. 여기선 mpl_finance 모듈을 사용하면 편리하게 그릴 수 있다.

 

import mpl_finance as matfin


start_date = datetime.datetime(2021, 12, 1)
end_date = datetime.datetime(2021, 12, 31)

df = yf.download('AAPL', start=start_date, end=end_date)

fig = plt.figure(figsize=(12, 8))
ax = fig.add_subplot(111)
matfin.candlestick2_ohlc(ax, df['Open'], df['High'], df['Low'], df['Close'], width=0.5, colorup='r', colordown='b')

plt.show()

 

이번엔 x축에 해당 날짜를 달아보자. 여기선 day 모듈과 ticker 모듈이 사용된다.

 

day_list = []
name_list = []
for i, day in enumerate(df.index):
    if day.dayofweek == 0:
        day_list.append(i)
        name_list.append(day.strftime('%Y-%m-%d') + '(Mon)')

ax.xaxis.set_major_locator(ticker.FixedLocator(day_list))
ax.xaxis.set_major_formatter(ticker.FixedFormatter(name_list))

for문과 enumerate를 통해 df의 index(해당 연월일)의 day를 enumerate한다. 만약 dayofweek가 0 이라면 (0은 월요일을 뜻함) 이 값들의 인덱스를 day_list에 추가하고, 해당 연월일과 월요일이란 표시를 name_list에 추가한다. 이 값들과 ticker 함수를 활용하여 사용한다. 여기서

ax.xaxis.set_major_locator(ticker.FixedLocator(day_list))
ax.xaxis.set_major_formatter(ticker.FixedFormatter(name_list))

plt.xticks(day_list,name_list)

로 간단하게 표현할 수도 있다.

 

plt.grid()를 통해 격자까지 함께 출력할 수 있다.

 

 

 

matplotlib을 활용한 막대그래프 만들기

 

industry = ['통신업', '의료정밀', '운수창고업', '의약품', '음식료품', '전기가스업', '서비스업', '전기전자', '종이목재', '증권']
fluctuations = [1.83, 1.30, 1.30, 1.26, 1.06, 0.93, 0.77, 0.68, 0.65, 0.61]

fig = plt.figure(figsize=(12, 8))
ax = fig.add_subplot(111)

ypos = np.arange(10)
rects = plt.barh(ypos, fluctuations, align='center', height=0.5)
plt.yticks(ypos, industry)


plt.xlabel('등락률')
plt.show()

역시 yticks를 사용하면 각각 fluctuations 값이 있던 자리에 industry 값들을 ticker로 만들어 줄 수 있다.