네이버 등 포털 사이트에서 제공하는 주식시세(주가정보) 데이터를 가져와서, 그래프로 간략하게 그려보는 예제를 만들어 봅니다. 처음에는 코드 한줄 한줄 전부 이해하는 것보다는 예제 코드를 최대한 타이핑해보면서 실행 결과를 확인해 보면서 흥미를 갖는 것이 중요합니다.
지난 포스팅에서 설명드린 pandas.read_html 함수를 사용해서 네이버 주식 시세 테이블을 dataframe으로 가져옵니다. 아래 그림처럼 주식시세가 웹페이지 여러 페이지에 걸쳐 있기 때문에, 페이지를 한장씩 넘어가면서 pandas.read_html 함수를 사용하여 표를 여러 번 나누어서 읽어야 합니다.
우선, 필요한 패키지(pandas, datetime)를 불러온다. 네임스페이스를 사용하여 pd, dt 등 약칭으로 부른다
import pandas as pd # 데이터프레임을 다루는 패키지 import datetime as dt # 시간을 다루는 패키지 import matplotlib.pyplot as plt # 그래프 시각화 패키지 from matplotlib import style
|
이제 본격적으로 웹 스크래핑을 처리하는 함수(function)을 정의합니다. url 주소에 들어 있는 종목코드(6자리)와 주식시세 페이지 번호(page)를 유의해서 살펴보시기 바랍니다.
def read_stock_price_page(stock_code, page_num): ''' 네이버 주식시세 페이지에 접속하여 table을 dataframe으로 가져와서 정리 ''' target_url = ('http://finance.naver.com/item/sise_day.nhn?code='+ stock_code + '&page=' + str(page_num)) data = pd.read_html(target_url) data = data[0] data.columns = ['날짜', '당일종가', '전일종가', '시가', '고가', '저가', '거래량'] price_data = data.dropna(axis=0, how='any') price_data = price_data.drop(price_data.index[0]) price_data = price_data.reset_index(drop=True) price_data['날짜'] = pd.to_datetime(price_data['날짜'], format='%Y/%m/%d') return price_data
|
오늘부터 과거로 소급해서 일정한 기간 동안의 주가 정보만을 가져오는 기능을 추가해 봅니다. days_limit이라는 변수를 함수 인자로 받아서, datetime 시간 클래스를 활용하여 기간을 계산합니다. 앞서 정의한 read_stock_price_page( ) 함수를 사용하여 매 페이지의 주가 정보를 가져 옵니다.
def stock_price_pages_to_df(code, days_limit=30): ''' 오늘부터 days_limit 일수 만큼 이전 날짜 주가를 가져온다. ''' df_list_price = [] page = 1 while True: try: data = read_stock_price_page(code, page) time_limit = dt.datetime.now() - data['날짜'][0] if time_limit.days > days_limit: break df_list_price.append(data) page = page + 1 except: break df_price = pd.concat(df_list_price) df_price = df_price.reset_index(drop=True)
return df_price
|
앞서 정의한 stock_price_pages_to_df( )함수에 종목코드와 기간(날짜)을 인자로 입력해서 dataframe 형태로 정리된 데이터를 return값으로 전달받습니다.
# 함수를 실행하여 KH바텍(060720)의 과거 30일 주가정보를 가져온다. stock_code = '060720' days_limit = 30 df = stock_price_pages_to_df(stock_code, days_limit)
|
df 변수에 할당된 데이터프레임을 아래와 같이 잘 정리가 되었습니다.
|
날짜 |
당일종가 |
전일종가 |
시가 |
고가 |
저가 |
거래량 |
0 |
2018-07-02 0:00:00 |
10100 |
600 |
10850 |
10900 |
10000 |
137977 |
1 |
2018-06-29 0:00:00 |
10700 |
300 |
10550 |
10900 |
9990 |
170253 |
2 |
2018-06-28 0:00:00 |
10400 |
500 |
10900 |
10950 |
10150 |
155769 |
3 |
2018-06-27 0:00:00 |
10900 |
100 |
10800 |
11050 |
10500 |
133548 |
4 |
2018-06-26 0:00:00 |
10800 |
350 |
10900 |
11000 |
10700 |
63039 |
5 |
2018-06-25 0:00:00 |
11150 |
150 |
11400 |
11450 |
11000 |
55519 |
6 |
2018-06-22 0:00:00 |
11300 |
100 |
11250 |
11450 |
10750 |
134805 |
7 |
2018-06-21 0:00:00 |
11200 |
350 |
11350 |
11750 |
11200 |
133002 |
8 |
2018-06-20 0:00:00 |
11550 |
250 |
11200 |
11600 |
10900 |
308596 |
9 |
2018-06-19 0:00:00 |
11300 |
700 |
11850 |
11950 |
11300 |
180656 |
10 |
2018-06-18 0:00:00 |
12000 |
1400 |
13400 |
13400 |
12000 |
309787 |
11 |
2018-06-15 0:00:00 |
13400 |
50 |
13600 |
13600 |
12900 |
201376 |
12 |
2018-06-14 0:00:00 |
13450 |
250 |
13200 |
13700 |
13150 |
347451 |
13 |
2018-06-12 0:00:00 |
13200 |
1250 |
12200 |
13300 |
12050 |
558148 |
14 |
2018-06-11 0:00:00 |
11950 |
0 |
12000 |
12250 |
11950 |
62293 |
15 |
2018-06-08 0:00:00 |
11950 |
0 |
11950 |
12200 |
11800 |
59258 |
16 |
2018-06-07 0:00:00 |
11950 |
200 |
12200 |
12300 |
11900 |
49088 |
17 |
2018-06-05 0:00:00 |
12150 |
250 |
11800 |
12250 |
11800 |
42485 |
18 |
2018-06-04 0:00:00 |
11900 |
0 |
11900 |
12200 |
11700 |
25171 |
19 |
2018-06-01 0:00:00 |
11900 |
100 |
11800 |
12100 |
11750 |
32062 |
matplotlib 패키지를 사용하면, 그래프를 쉽게 그릴 수 있습니다. ggplot 스타일을 지정하고, 날짜를 x축으로 하고 당일종가 그래프를 그리게 됩니다.
# 주식 시세(당일종가) 그래프를 그린다. style.use('ggplot') #그래프 스타일 지정 plt.plot(df.날짜, df.당일종가.astype(int)) plt.show()
|
필요한 패키지(pandas, datetime)를 불러온다. 네임스페이스 pd, dt, plt등 약칭으로 간단하게 부른다.
ggplot 스타일로 그래프가 그려집니다. KH바텍은 6월 한 달 동안 주가가 급등 후에 급락하는 패턴을 보이네요.