mplfinance 라이브러리를 이용하면 쉽게 OHLC 관련 차트를 그릴 수 있다. 

mplfinance에 맞게 data들을 가공해 주면 된다.

 

책에 있는 소스

import pandas as pd
from urllib.request import urlopen
from bs4 import BeautifulSoup
import mplfinance as mpf

url = 'https://finance.naver.com/item/sise_day.nhn?code=068270&page=1'
with urlopen(url) as doc:
    html = BeautifulSoup(doc, 'lxml') 
    pgrr = html.find('td', class_='pgRR')
    s = str(pgrr.a['href']).split('=')
    last_page = s[-1]  

df = pd.DataFrame()
sise_url = 'https://finance.naver.com/item/sise_day.nhn?code=068270'  
for page in range(1, int(last_page)+1): 
    page_url = '{}&page={}'.format(sise_url, page)  
    df = df.append(pd.read_html(page_url, header=0)[0])

df = df.dropna()
df = df.iloc[0:30]
df = df.rename(columns={'날짜':'Date', '시가':'Open', '고가':'High', '저가':'Low', '종가':'Close', '거래량':'Volume'})
df = df.sort_values(by='Date')
df.index = pd.to_datetime(df.Date)
df = df[['Open', 'High', 'Low', 'Close', 'Volume']]

mpf.plot(df, title='Celltrion candle chart', type='candle')

mpf.plot(df, title='Celltrion ohlc chart', type='ohlc')

kwargs = dict(title='Celltrion customized chart', type='candle',
    mav=(2, 4, 6), volume=True, ylabel='ohlc candles')
mc = mpf.make_marketcolors(up='r', down='b', inherit=True)
s  = mpf.make_mpf_style(marketcolors=mc)
mpf.plot(df, **kwargs, style=s)

'User Agent' 추가한 코드

'''
셀트리온 캔들 차트 신버전
'''

import pandas as pd
import urllib.request as urllib
from bs4 import BeautifulSoup
import mplfinance as mpf

opener = urllib.build_opener()
opener.addheaders = [("User-Agent" , "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.104 Safari/537.36")]

# 4.4.3 맨 뒤 페이지 숫자 구하기
sise_url = 'https://finance.naver.com/item/sise_day.nhn?code=068270'
with opener.open(sise_url) as doc:
    html = BeautifulSoup(doc, 'lxml')
    pgrr = html.find('td', class_ = 'pgRR')
    s = str(pgrr.a['href']).split('=')
    last_page = s[-1]

# 4.4.4 전체 페이지 읽어오기
df = pd.DataFrame()
for page in range(1, int(last_page) + 1):
    print('.', end = '')
    page_url = '{}&page={}'.format(sise_url, page)
    df = df.append(pd.read_html(opener.open(page_url), header = 0)[0])

# 차트 출력을 위해 데이터프레임 가공하기
df = df.dropna()
df = df.iloc[0:30]
df = df.rename(columns = {'날짜' : 'Date', '시가' : 'Open', '고가' : 'High', '저가' : 'Low', '종가' : 'Close', '거래량' : 'Volume'})
df = df.sort_values(by = 'Date')
df.index = pd.to_datetime(df.Date)
df = df[['Open', 'High', 'Low', 'Close', 'Volume']]

# 엠피엘_파이낸스로 캔들 차트 그리기
mpf.plot(df, title = 'Celltrion candle chart', type = 'candle')


 

'User Agent'가 추가된 url 객체를 돌려주는 함수를 하나
만들어서 앞으로 편안하게 써야 겠다.

 

실습 동영상

 

 

 

 

matplotlib/mplfinance

New mplfinance package (replacement for mpl-finance). - matplotlib/mplfinance

github.com

 

CHAPTER 4 웹 스크레이핑을 사용한 데이터 분석

4.5 OHLC와 캔들 차트
4.5.1 OHLC 차트와 캔들 차트의 비교
4.5.2 셀트리온 종가 차트
4.4.3 셀트리온 캔들 차트
4.6 핵심 요약 

 

이전글 - 2021/02/07 - [책들] - [파이썬 증권 데이터 분석] 4. 웹 스크레이핑을 사용한 데이터 분석 191p

다음글 -

728x90
반응형
블로그 이미지

두리뭉실 두리뭉실:해피파인더그룹

컴퓨터 코치 두리뭉실

댓글을 달아 주세요

  • 안녕하세요 2021.06.19 15:59  댓글주소  수정/삭제  댓글쓰기

    안녕하세요, 공부중인 학생입니다 !!
    궁금한게 있어서요..구현하다가 에러가 발생했는데.

    예외가 발생했습니다. AttributeError
    'NoneType' object has no attribute 'a'

    인데..무슨 이유일지 짐작 가시는게 있으신가요?

    • 두리뭉실 두리뭉실:해피파인더그룹 2021.06.20 19:34 신고  댓글주소  수정/삭제

      유저 에이전트 정보 없이 특정 웹페이지를 읽을 경우 원하는 데이터를 얻을 수 없어요.

      일단 html의 값과 prgg의 type을 출력해 보면 알 수 있구요. pgrr = html.find('td', class_ = 'pgRR') -> 이 부분에서 html.find(x)에서 해상 값을 얻지 못해 prgg의 값이 None이 되어 해당 에러메세지가 출력되요.