본문 바로가기
파이썬과 주식

7. 주가 데이터 그래프 그리기(2) feat. Matplotlib

by 에쓰지 2022. 7. 16.
※ 늦게라도 "코딩"을 배워야겠다는 사람이 있다면 혹시라도 도움이 될까해서 그동안 알게 된 내용을 공유하려고 합니다.

지난 회차에 맵플로립(Matplotlib)을 이용하여 주가 데이터의 그래프를 그리는 방법을 알아봤습니다.

2022.07.11 - [파이썬과 주식] - 6. 주가 데이터 그래프 그리기 (1) feat. Matplotlib

 

6. 주가 데이터 그래프 그리기 (1) feat. Matplotlib

※ 늦게라도 " 코딩"을 배워야 겠다는 사람이 있다면 혹시라도 도움이 될까해서 그동안 알게 된 내용을 공유하려고 합니다. 지난 회차에 파이썬의 판다스 라이브러리에 loc,iloc를 이용하여 데이

pmxsg.tistory.com

 

이번 회차에는 지난 회차에 이어서 주가 데이터 그래프 그리기를 해보겠습니다.

지난회차는 주가 변동 부분의 그래프까지 그려봤습니다. 이번 회차는 이동평균과 거래량 그래프를 추가해 보겠습니다.

지금까지 만들어지 코드와 그래프 입니다.

import pandas as pd

import matplotlib
matplotlib.rcParams['font.family'] ='Malgun Gothic' # 폰트설정
matplotlib.rcParams['font.size'] = 15 # 글자크기
matplotlib.rcParams['axes.unicode_minus'] = False 

import matplotlib.pyplot as plt

df = pd.read_csv("삼성전자_V2.csv")

plt.figure(figsize=(15,10))
plt.plot(df["Date"],df["종가"], color="navy" , linewidth = 3)
plt.title("삼성전자 주가", color = "blue", fontsize = 25, fontweight = "bold")
plt.xticks([1,30,60,90,120,150,180,210,240],rotation = 45 )
plt.xlabel("기간", color= "green" , loc = "right")
plt.ylabel("단위 : 원", color = "red", loc = "top")

삼성전자_V2.csv
0.02MB


1. 여러 데이터 그래프 그리기

 

선 그래프를 그리는 함수는 plot( ) 입니다.

주가변동 그래프를 그릴 때 plot(df["Date",df["종가"]) 를 이용해 그렸습니다.

다른 데이터의 그래프를 추가하려면 plot( ) 함수를 추가하면 됩니다.

다만, x축에 들어갈 데이터는 똑같아야 합니다. 따라서, x축에는 df["Date"]가 위치합니다.

이동평균 데이터를 하나씩 넣으면 됩니다.

일단 y축 데이터에 5일 평균선을 추가해 보겠습니다.

import pandas as pd

import matplotlib
matplotlib.rcParams['font.family'] ='Malgun Gothic' # 폰트설정
matplotlib.rcParams['font.size'] = 15 # 글자크기
matplotlib.rcParams['axes.unicode_minus'] = False 

import matplotlib.pyplot as plt

df = pd.read_csv("삼성전자_V2.csv")

plt.figure(figsize=(15,10))
plt.plot(df["Date"],df["종가"], color="navy" , linewidth = 3)
plt.title("삼성전자 주가", color = "blue", fontsize = 25, fontweight = "bold")
plt.xticks([1,30,60,90,120,150,180,210,240],rotation = 45 )
plt.xlabel("기간", color= "green" , loc = "right")
plt.ylabel("단위 : 원", color = "red", loc = "top")
plt.plot(df["Date"],df["5일_이동평균"])

plt.plot(df["Date"],df["5일_이동평균"]) 한줄 추가하였습니다.

Matplotlib에서는 필요한 함수를 한 줄씩 추가하면 손쉽게 원하는 모양을 얻을 수 있습니다.자 이제 나머지 20일,60일,120일 이동평균도 추가하겠습니다.

plt.figure(figsize=(15,10))
plt.plot(df["Date"],df["종가"], color="navy" , linewidth = 3)
plt.plot(df["Date"],df["5일_이동평균"])
plt.plot(df["Date"],df["20일_이동평균"])
plt.plot(df["Date"],df["60일_이동평균"])
plt.plot(df["Date"],df["120일_이동평균"])
plt.title("삼성전자 주가", color = "blue", fontsize = 25, fontweight = "bold")
plt.xticks([1,30,60,90,120,150,180,210,240],rotation = 45 )
plt.xlabel("기간", color= "green" , loc = "right")
plt.ylabel("단위 : 원", color = "red", loc = "top")

 


2. 범례 : legend

 

위 그래프는 총 5개의 선 그래프가 그려졌습니다. 그런데, 각각의 선 그래프가 무엇을 나타내는지 명확하지 않습니다. 그래서 구분을 위한 범례를 넣으려고 합니다.

범례를 위한 함수는 legend( ) 입니다.

범례안에 이름을 붙이려면 legend ( ) 함수 안이 아니라 각 그래프 함수 plot( ) 안에 "label = "을 이용해서 직접 그래프안에 이름을 설정해줍니다.

5일 이동평균은 "5일", 20일 이동평균은 "20일" 등으로 label을 설정해 주겠습니다.

plt.figure(figsize=(15,10))
plt.plot(df["Date"],df["종가"], color="navy" , linewidth = 3)
plt.plot(df["Date"],df["5일_이동평균"],label = "5일")
plt.plot(df["Date"],df["20일_이동평균"],label = "20일")
plt.plot(df["Date"],df["60일_이동평균"],label = "60일")
plt.plot(df["Date"],df["120일_이동평균"],label = "120일")
plt.title("삼성전자 주가", color = "blue", fontsize = 25, fontweight = "bold")
plt.xticks([1,30,60,90,120,150,180,210,240],rotation = 45 )
plt.xlabel("기간", color= "green" , loc = "right")
plt.ylabel("단위 : 원", color = "red", loc = "top")
plt.legend(loc = "upper right")

loc = " " : 범례 위치를 정해주는 것으로 위치를 나타내는 값은,

 'best'(0), 'upper right'(1), 'upper left' (2), 'lower left' (3), 'lower right' (4) 'right'(5), center left (6), center right(7), lower center(8), upper center(9) center(10)

괄호안은 코드로 문자대신 숫자를 사용해도 됩니다. "upper right" 대신에 loc = 1 로 사용할 수 있습니다.


3. 그리드 : grid

 

그래프를 보기 편하게 y축 ticks에 맞춰 줄을 그려보고자 합니다.

이 때 필요한 함수가 grid( ) 입니다.

"axis =" 를 매개로 both,x,y 값을 이용합니다.

plt.figure(figsize=(15,10))
plt.plot(df["Date"],df["종가"], color="navy" , linewidth = 3)
plt.plot(df["Date"],df["5일_이동평균"],label = "5일")
plt.plot(df["Date"],df["20일_이동평균"],label = "20일")
plt.plot(df["Date"],df["60일_이동평균"],label = "60일")
plt.plot(df["Date"],df["120일_이동평균"],label = "120일")
plt.title("삼성전자 주가", color = "blue", fontsize = 25, fontweight = "bold")
plt.xticks([1,30,60,90,120,150,180,210,240],rotation = 45 )
plt.xlabel("기간", color= "green" , loc = "right")
plt.ylabel("단위 : 원", color = "red", loc = "top")
plt.legend(loc = "upper right")
plt.grid(axis='y')


4. 파일저장 : savefig

 

파일 저장하는 함수는 savefig( ) 입니다.

저장방식 default 값은 png 입니다.

"dpi = " : dots per inch 로 해상도를 조절해 줍니다.

plt.figure(figsize=(15,10))
plt.plot(df["Date"],df["종가"], color="navy" , linewidth = 3)
plt.plot(df["Date"],df["5일_이동평균"],label = "5일")
plt.plot(df["Date"],df["20일_이동평균"],label = "20일")
plt.plot(df["Date"],df["60일_이동평균"],label = "60일")
plt.plot(df["Date"],df["120일_이동평균"],label = "120일")
plt.title("삼성전자 주가", color = "blue", fontsize = 25, fontweight = "bold")
plt.xticks([1,30,60,90,120,150,180,210,240],rotation = 45 )
plt.xlabel("기간", color= "green" , loc = "right")
plt.ylabel("단위 : 원", color = "red", loc = "top")
plt.legend(loc = "upper right")
plt.grid(axis='y')
plt.savefig("삼성전자.png")

삼성전자.png
0.10MB


5. 막대그래프 : bar

 

막대그래프를 그리는 함수는 bar( ) 입니다.

bar( ) 함수도 괄호안에 x축,y축 데이터를 차례로 입력해주면 됩니다.

x축은 df["Date"]를 그대로 사용하고, y축은 df["거래량"] 으로 해서 거래량에 대한 막대그래프를 그려보겠습니다.선그래프 그리는 plot( ) 함수를 제외하고 나머지 함수들은 조정해서 사용하겠습니다.

import pandas as pd

import matplotlib
matplotlib.rcParams['font.family'] ='Malgun Gothic' # 폰트설정
matplotlib.rcParams['font.size'] = 15 # 글자크기
matplotlib.rcParams['axes.unicode_minus'] = False 

import matplotlib.pyplot as plt

df = pd.read_csv("삼성전자_V2.csv")

plt.figure(figsize=(15,5))
plt.bar(df["Date"],df["거래량"])
plt.title("삼성전자 거래량", color = "blue", fontsize = 25, fontweight = "bold")
plt.xticks([1,30,60,90,120,150,180,210,240],rotation = 45 )
plt.xlabel("기간", color= "green" , loc = "right")
plt.ylabel("단위 : 1,000,000 주", color = "red", loc = "top")
plt.grid(axis='y')
plt.savefig("삼성전자거래량.png")

삼성전자거래량.png
0.01MB


6. 최신 버전

 

지금까지 주가 데이터를 다운로드 받고 이동평균을 추가한 후에 그래프까지 그려 봤습니다.

지금까지 업데이트 된 코드 입니다.최근 날짜인 2022년 7월 15일까지의 자료로 해서 업데이트 해보겠습니다.

import FinanceDataReader as fdr
df = fdr.DataReader('005930','2021-01-01','2022-07-15')
df.rename(columns={"Close":"종가","Volume":"거래량"},inplace = True)
df.insert(5,'등락',df['종가'].diff())
df['5일_이동평균']=df['종가'].rolling(5).mean()
df['20일_이동평균']=df['종가'].rolling(20).mean()
df['60일_이동평균']=df['종가'].rolling(60).mean()
df['120일_이동평균']=df['종가'].rolling(120).mean()
df = df[['종가','등락','거래량','5일_이동평균','20일_이동평균','60일_이동평균','120일_이동평균']]
df = df["2021-6-25":"2022-07-15"]
df.to_csv("삼성전자0715.csv")
df

삼성전자0715.csv
0.02MB

import pandas as pd

import matplotlib
matplotlib.rcParams['font.family'] ='Malgun Gothic' # 폰트설정
matplotlib.rcParams['font.size'] = 15 # 글자크기
matplotlib.rcParams['axes.unicode_minus'] = False 

import matplotlib.pyplot as plt

df = pd.read_csv("삼성전자0715.csv")

plt.figure(figsize=(15,10))
plt.plot(df["Date"],df["종가"], color="navy" , linewidth = 3)
plt.plot(df["Date"],df["5일_이동평균"],label = "5일")
plt.plot(df["Date"],df["20일_이동평균"],label = "20일")
plt.plot(df["Date"],df["60일_이동평균"],label = "60일")
plt.plot(df["Date"],df["120일_이동평균"],label = "120일")
plt.title("삼성전자 주가", color = "blue", fontsize = 25, fontweight = "bold")
plt.xticks([1,30,60,90,120,150,180,210,240],rotation = 45 )
plt.xlabel("기간", color= "green" , loc = "right")
plt.ylabel("단위 : 원", color = "red", loc = "top")
plt.legend(loc = "upper right")
plt.grid(axis='y')
plt.savefig("삼성전자0715.png")

plt.figure(figsize=(15,5))
plt.bar(df["Date"],df["거래량"])
plt.title("삼성전자 거래량", color = "blue", fontsize = 25, fontweight = "bold")
plt.xticks([1,30,60,90,120,150,180,210,240],rotation = 45 )
plt.xlabel("기간", color= "green" , loc = "right")
plt.ylabel("단위 : 10,000,000 주", color = "red", loc = "top")
plt.grid(axis='y')
plt.savefig("삼성전자거래량0715.png")

삼성전자0715.png
0.11MB
삼성전자거래량.png
0.01MB

댓글