PYTHON 파이썬/주가 분석

05.08 CLASS HW (OHLC 차트 ②)

dngus_tak 2021. 5. 8. 21:53

캔들차트 그리기 (네이버, KS.035420)

 

1) 일반 시세 그래프: matplotlip 사용

import pandas as pd #금융 데이터들을 다루기 위한 라이브러리
import requests #서버와 클라이언트가 통신(get, post)할 수 있도록 도와주는 라이브러리
from bs4 import BeautifulSoup # text 파일 형식 -> html의 태그로 바꿔줌

#그래프를 그리기 위한 라이브러리
from matplotlib import pyplot as plt
from matplotlib import dates as mdates 
from mplfinance.original_flavor import candlestick_ohlc
from datetime import datetime 

#일별 주가 데이터를 사용하기 위해 일별 주가 데이터가 있는 주소 찾기
url = 'https://finance.naver.com/item/sise_day.nhn?code=068270'

#리스트 안에 데이터들을 저장하기 위한 용도
columns = [] # 열 이름(날짜, 종가, 전일비, 시가 등)을 저장
rows = [] # 각 열에 해당되는 값들을 저장 
index = [] # 데이터들을 구분하기 위한 고유한 값

with requests.get(url, headers = {'User-agent' : 'Mozilla/5.0'} ) as html:
  bs = BeautifulSoup(html.text, 'lxml') #get을 통해 얻은 text 파일을 Beautifulsoup를 통해서 html 태그로 모두 파싱(parsing)
  #th = table header 
  th_tags = bs.find_all('th')
  print(th_tags)
  #th_tags 리스트 안에 있는 각 각의 요소들의 텍스트 값들을 들고옴
  for th in th_tags:
    #columns 리스트에 태그를 제거한 텍스트 값들을 추가
    columns.append(th.get_text())

  print(columns)

###### 데이터 전처리 #######
#그래프를 그릴 수 있도록 크롤링한 데이터를 변형(가공)
for page in range(1,6):
  page_url = 'https://finance.naver.com/item/sise_day.nhn?code=068270&page={}'.format(page)
  print(page_url)
  response = requests.get(page_url, headers= {'User-agent': 'Mozilla/5.0'})
  bs = BeautifulSoup(response.text, 'lxml')
  dates = bs.find_all('span', class_='p10') #날짜 모두 가져오기
  values = bs.find_all('span', class_='p11') #종가, 전일비, 시가, 고가...

  values = [int(val.get_text().strip().replace(',','')) for val in values]
  dates = [str(date.get_text()) for date in dates]

  #추출한 값들을 리스트화함
  #temp 리스트에는 [날짜, 종가, 전일비, 시가, 고가, 저가, 거래량] 순으로 넣음
  j = 0
  for i in range(0, len(values), 6):
    temp = []
    temp.append(dates[j]) #날짜
    temp.extend(values[i:i+6]) #종가, 전일비, 시가, 고가, 저가, 거래량 
    rows.append(temp)
    j += 1

#### 리스트 -> 데이터 프레임 (시계열 데이터를 표현하기에 적합한 자료형)
df = pd.DataFrame(rows, columns = columns)
#빠진 데이터 혹은 NaN 값들을 삭제
df.dropna()
#데이터를 날짜순으로 정렬
df = df.sort_values(by='날짜')
print(df)

 

2) OHLC: mpl_finance 이용

for idx in range(0, len(df)):
  dt = datetime.strptime(df['날짜'].values[idx], '%Y.%m.%d').date() 
  df['날짜'].values[idx] = mdates.date2num(dt) 

ohlc = df[['날짜', '시가', '고가', '저가','종가']] 

plt.figure(figsize=(9,6))
ax = plt.subplot(1,1,1)
plt.title('NAVER CANDLE STICK')
candlestick_ohlc(ax, ohlc.values, width=0.7, colorup='green', colordown='orange') #캔들 스틱 그리는 함수
ax.xaxis.set_major_formatter(mdates.DateFormatter('%Y-%m-%d')) 
plt.xticks(rotation=45)
plt.grid(color='gray', linestyle='--')
plt.show()

'PYTHON 파이썬 > 주가 분석' 카테고리의 다른 글

05.01 CLASS HW (OHLC 차트 ①)  (0) 2021.05.07
05.01 CLASS SUMMARY  (1) 2021.05.07
04.17 CLASS HW (웹 스크레이핑)  (1) 2021.04.17
04.10 CLASS HW (BeautifulSoup)  (1) 2021.04.17
04.03 CLASS HW (HTML)  (1) 2021.04.10