본문 바로가기
주식공부 feat. 파이썬

4. 주가 데이터 엑셀로 다운로드 받기 확장판 feat. 이동평균

by 에쓰지 2022. 3. 30.

지난 회차에 쥬피터 노트북을 사용하여 주가 데이터를 엑셀로 다운로드 받는 법과 그래프 그리는 법을 알아봤습니다.

2022.06.03 - [파이썬과 주식] - 2. 주가 데이터 다운로드 받기 ( 엑셀 / CSV )

 

2. 주가 데이터 다운로드 받기 ( 엑셀 / CSV )

※ 늦게라도 "코딩"이란 것을 배워봐야겠다는 사람이 있다면 혹시라도 도움이 될까 해서 나의 경험담을 적어보려 합니다. 지난회차에 파이썬 Python을 사용할 환경설정을 위해서 아나콘다 Anaconda

pmxsg.tistory.com

 

2022.03.29 - [주식공부 feat. 파이썬] - 3. 주가 데이터 시각화 feat. 파이썬으로 그래프 그리기

 

3. 주가 데이터 시각화 feat. 파이썬으로 그래프 그리기

지난 회차에 쥬피터 노트북을 사용하여 주가 데이터를 엑셀로 다운로드 받는 법을 알아봤습니다. 2022.03.29 - [주식공부 feat. 파이썬] - 2. 주가 데이터 엑셀로 다운받기 2. 주가 데이터 엑셀로 다운

pmxsg.tistory.com

 


이번 회차에는 엑셀 다운로드 받을 때 추가로 내용을 넣는 법을 알아보겠습니다.

엑셀 다운로드 받을 때 사용했던 파이썬에 "rolling" 이란 함수로 이동평균을 추가할 수 있는 코드를 알아보려고 합니다.

네이버 주식창에 차트부문에서 볼 수있는 이동평균 그래프 입니다. 이 그래프를 주가를 엑셀로 다운로드 받을 때 몇 줄의 코드를 더하면 위와 같은 그래프를 만들 수 있습니다.


 

>>> 주가 데이터 엑셀로 다운로드 받기 확장판  feat. 이동평균

 

1. 주가 데이터 다운로드 및 그래프 그리기 코드

 

이번 회차는 SK하이닉스 입니다. 종목코드는 "000660.KS" 입니다.

지난 회차에 했던 엑셀 다운로드 후 그래프 그리기 코드를 먼저 실행해 보겠습니다.

import yfinance as yf
SK_Hynix = yf.download('000660.KS','2019-03-01','2022-03-29')
SK_Hynix.to_excel('Stocks/SK하이닉스.xlsx')
import matplotlib.pyplot as plt
import pandas as pd
import yfinance as yf
import matplotlib
matplotlib.rcParams['font.family'] ='Malgun Gothic' 
matplotlib.rcParams['font.size'] = 15
matplotlib.rcParams['axes.unicode_minus'] = False 

df=pd.read_excel('./Stocks/SK하이닉스.xlsx')

plt.figure(figsize=(15,10))
plt.xticks(rotation=45)
plt.plot(df['Date'],df['Close'], label='종가', linewidth=3)
plt.legend()
plt.title('SK하이닉스')
plt.grid(axis='y')
plt.savefig('Stocks/SK하이닉스.png',dpi=100)

지난 회차때 만들었던 코드에 SK하이닉스로 바꾸고 종목코드를 "000660.KS"로 만 바꾸고 실행하면 불과 몇 분이 채 안되어 결과물이 나옵니다.

 

2. 이동평균 구하기

5일, 20일, 60일, 120일 평균을 구하는 코드 입니다.

import yfinance as yf
SK_Hynix = yf.download('000660.KS','2019-03-01','2022-03-29')
SK_Hynix['Close_MA5']=SK_Hynix['Close'].rolling(5).mean()
SK_Hynix['Close_MA20']=SK_Hynix['Close'].rolling(20).mean()
SK_Hynix['Close_MA60']=SK_Hynix['Close'].rolling(60).mean()
SK_Hynix['Close_MA120']=SK_Hynix['Close'].rolling(120).mean()
SK_Hynix.to_excel('Stocks/SK하이닉스1.xlsx')

기존 엑셀 파일과의 구분을 위해서 파일이름을 "SK하이닉스1"로 했습니다.

 

import matplotlib.pyplot as plt
import pandas as pd
import yfinance as yf
import matplotlib
matplotlib.rcParams['font.family'] ='Malgun Gothic' 
matplotlib.rcParams['font.size'] = 15
matplotlib.rcParams['axes.unicode_minus'] = False 

df=pd.read_excel('./Stocks/SK하이닉스1.xlsx')

plt.figure(figsize=(15,10))
plt.xticks(rotation=45)
plt.plot(df['Date'],df['Close'], label='종가', linewidth=3)
plt.plot(df['Date'],df['Close_MA5'], label='5일 이동평균')
plt.plot(df['Date'],df['Close_MA20'], label='20일 이동평균')
plt.plot(df['Date'],df['Close_MA60'], label='60일 이동평균')
plt.plot(df['Date'],df['Close_MA120'], label='120일 이동평균')
plt.legend()
plt.title('SK하이닉스')
plt.grid(axis='y')
plt.savefig('Stocks/SK하이닉스1.png',dpi=100)

Cntl+Enter를 치면,

 

3. 코드 설명

 

SK_Hynix['Close_MA5']=SK_Hynix['Close'].rolling(5).mean()
SK_Hynix['Close_MA20']=SK_Hynix['Close'].rolling(20).mean()
SK_Hynix['Close_MA60']=SK_Hynix['Close'].rolling(60).mean()
SK_Hynix['Close_MA120']=SK_Hynix['Close'].rolling(120).mean()

 

먼저 "rolling()" 함수는 이동기술 통계량을 계산하는 도구입니다. () 괄호안에 기간을 알려주는 매개변수를 넣어주면 됩니다. 5일,20일,60일,120일을 각각 넣어 이 기간동안의 통계량을 구하겠다는 의미입니다.

"mean()" 함수는 평균을 구하는 함수 입니다. 즉, "rolling().mean() " 두 함수가 합쳐야 이동 평균을 구하는 식이 됩니다.

평균을 구하는 mean() 함수 외에도,

median() : 중위수 , std() : 표준편차 , var() : 분산, max() : 최대값, min() : 최소값, sum() : 합계 등의 함수가 있습니다.

"SK_Hynix['Close']" 는 "종가"를 나타내므로, 종가기준 5일,20일,60일,120일 평균을 구하는 함수 입니다.

이 함수로 나온 값을 각각 'Close_MA5', 'Close_MA20', 'Close_MA60', 'Close_MA120' 의 이름으로 엑셀에 저장되었다는 의미입니다.

"SK하이닉스1" 이름으로 저장된 엑셀 파일을 열어보면,

'Close_MA5', 'Close_MA20', 'Close_MA60', 'Close_MA120' 컬럼이 추가되어 있습니다.

 

plt.plot(df['Date'],df['Close'], label='종가', linewidth=3)
plt.plot(df['Date'],df['Close_MA5'], label='5일 이동평균')
plt.plot(df['Date'],df['Close_MA20'], label='20일 이동평균')
plt.plot(df['Date'],df['Close_MA60'], label='60일 이동평균')
plt.plot(df['Date'],df['Close_MA120'], label='120일 이동평균')

 

지난 회차에서,

" plt.plot(df['Date'],df['Close'], label='종가', linewidth=3) " :
"plot" 는 선그래프를 그리라고 호출하는 코드 입니다.
plot(x,y) 가 기본 호출인데, 위 코드는 x축은 df['Date'] (엑셀 데이터 안에 Date(날짜) 항목을 가리킴)로, y축은 df['Close'](엑셀 데이터 안에 Close(종가) 항목을 가리킴) 로 사용하라는 의미 입니다.
label은 선을 나타내는 이름을 나타내고, "linewidth"는 그래프 선의 굵기를 나타냅니다.


"plt.plot(df['Date'],df['Close_MA5'], label='5일 이동평균')" 은 위와 같습니다. 5일 평균선을 그리라고 호출하는 코드입니다. label은 범례에 들어갈 이름을 지정해 줍니다.

SK 하이닉스 엑셀파일 + 그래프 :

SK하이닉스.xlsx
0.03MB
SK하이닉스.png
0.08MB

SK 하이닉스 엑셀파일 + 그래프 (이동평균 포함) :

SK하이닉스1.xlsx
0.05MB
SK하이닉스1.png
0.18MB

 



 

코드 리스트

 

주식 데이터를 엑셀로 다운받고 이동평균이 포함된 주가변동 그래프를 그릴 수 있는 코드입니다.

필요하신 분은 참조하시기 바랍니다.

만들어지는 종목이 많아지게 되면 별도로 종목별로 코드를 따로 포스팅 하도록 할 예정입니다.


< SK 하이닉스 >

import yfinance as yf
SK_Hynix = yf.download('000660.KS','2019-03-01','2022-03-29')
SK_Hynix['Close_MA5']=SK_Hynix['Close'].rolling(5).mean()
SK_Hynix['Close_MA20']=SK_Hynix['Close'].rolling(20).mean()
SK_Hynix['Close_MA60']=SK_Hynix['Close'].rolling(60).mean()
SK_Hynix['Close_MA120']=SK_Hynix['Close'].rolling(120).mean()
SK_Hynix.to_excel('Stocks/SK하이닉스1.xlsx')
import matplotlib.pyplot as plt
import pandas as pd
import yfinance as yf
import matplotlib
matplotlib.rcParams['font.family'] ='Malgun Gothic' 
matplotlib.rcParams['font.size'] = 15
matplotlib.rcParams['axes.unicode_minus'] = False 

df=pd.read_excel('./Stocks/SK하이닉스1.xlsx')

plt.figure(figsize=(15,10))
plt.xticks(rotation=45)
plt.plot(df['Date'],df['Close'], label='종가', linewidth=3)
plt.plot(df['Date'],df['Close_MA5'], label='5일 이동평균')
plt.plot(df['Date'],df['Close_MA20'], label='20일 이동평균')
plt.plot(df['Date'],df['Close_MA60'], label='60일 이동평균')
plt.plot(df['Date'],df['Close_MA120'], label='120일 이동평균')
plt.legend()
plt.title('SK하이닉스')
plt.grid(axis='y')
plt.savefig('Stocks/SK하이닉스1.png',dpi=100)

< 삼성전자 >

import yfinance as yf
Samsung_Electronic = yf.download('005930.KS','2019-03-01','2022-03-29')
Samsung_Electronic['Close_MA5']=Samsung_Electronic['Close'].rolling(5).mean()
Samsung_Electronic['Close_MA20']=Samsung_Electronic['Close'].rolling(20).mean()
Samsung_Electronic['Close_MA60']=Samsung_Electronic['Close'].rolling(60).mean()
Samsung_Electronic['Close_MA120']=Samsung_Electronic['Close'].rolling(120).mean()
Samsung_Electronic.to_excel('Stocks/삼성전자.xlsx')
import matplotlib.pyplot as plt
import pandas as pd
import yfinance as yf
import matplotlib
matplotlib.rcParams['font.family'] ='Malgun Gothic' 
matplotlib.rcParams['font.size'] = 15
matplotlib.rcParams['axes.unicode_minus'] = False 

df=pd.read_excel('./Stocks/삼성전자.xlsx')

plt.figure(figsize=(15,10))
plt.xticks(rotation=45)
plt.plot(df['Date'],df['Close'], label='종가', linewidth=3)
plt.plot(df['Date'],df['Close_MA5'], label='5일 이동평균')
plt.plot(df['Date'],df['Close_MA20'], label='20일 이동평균')
plt.plot(df['Date'],df['Close_MA60'], label='60일 이동평균')
plt.plot(df['Date'],df['Close_MA120'], label='120일 이동평균')
plt.legend()
plt.title('삼성전자')
plt.grid(axis='y')
plt.savefig('Stocks/삼성전자.png',dpi=100)

<카카오>

import yfinance as yf
Kakao = yf.download('035720.KS','2019-03-01','2022-03-28')
Kakao['Close_MA5']=Kakao['Close'].rolling(5).mean()
Kakao['Close_MA20']=Kakao['Close'].rolling(20).mean()
Kakao['Close_MA60']=Kakao['Close'].rolling(60).mean()
Kakao['Close_MA120']=Kakao['Close'].rolling(120).mean()

Kakao.to_excel('Stocks/Kakao.xlsx')
import matplotlib.pyplot as plt
import pandas as pd
import yfinance as yf
import matplotlib
matplotlib.rcParams['font.family'] ='Malgun Gothic' 
matplotlib.rcParams['font.size'] = 15
matplotlib.rcParams['axes.unicode_minus'] = False 

df=pd.read_excel('./Stocks/Kakao.xlsx')

plt.figure(figsize=(15,10))
plt.xticks(rotation=45)
plt.plot(df['Date'],df['Close'], label='종가', linewidth=3)
plt.plot(df['Date'],df['Close_MA5'], label='5일 이동평균')
plt.plot(df['Date'],df['Close_MA20'], label='20일 이동평균')
plt.plot(df['Date'],df['Close_MA60'], label='60일 이동평균')
plt.plot(df['Date'],df['Close_MA120'], label='120일 이동평균')
plt.legend()
plt.title('카카오')
plt.grid(axis='y')
plt.savefig('Stocks/카카오.png',dpi=100)

 

댓글