본문 바로가기
python/금융데이터분석

python 증권데이터 분석 - OHLC와 캔들차트 그리기

by orangecode 2022. 12. 24.
728x90
OHLC(Open - High - Low - Close)

OHLC는 Open - High - Low - Close를 나타내는 차트로 시가-고가-저가-종가를 의미한다.

 

우리나라를 포함한 전 세계에서 사용하는 캔들차트는

OHLC에 해당하는 4가지 가격을 이용하여 일정기간 가격변동을 표시한다.

 

캔들차트는 250여년 전 일본 오사카의 상인이었던 혼마 무네히사가쌀가격의 변동을 파악하기 위한 용도로 고안한 것으로 알려져 있다. 차트에 표시된 바 모양이 양초를 닮았다고 하여 서양권에서는 일본식 캔들차트라고 불린다.

 

OHLC 차트는 미국에서 BAR 차트라고 불리며  주로 사용되는 차트이다.

 

반면에 우리나라에서는 캔들차트를 BAR 차트라고 부르며 주로 사용하고 있다.

 

 

 

 

 

 

 

삼성카드 주식 종가차트

import pandas as pd
import requests
from bs4 import BeautifulSoup
from matplotlib import pyplot as plt


url = 'https://finance.naver.com/item/sise_day.nhn?code=029780&page=1'
html = requests.get(url, headers={'User-agent': 'Mozilla/5.0'}).text

# BeautifulSoup 생성자 첫번째 인수로 HTML/XML 페이지를 넘겨주고, 두번째 인수로 페이지를 파싱할 방식을 넘겨준다.
bs = BeautifulSoup(html, 'lxml')

# find 함수를 통해 'pgRR'인 'td'태그를 찾으면, 결과값은 'bs4.element.Tag'타입으로 pgrr 변수에 반환한다.
# pgRR = Page Right Right 맨 마지막 페이지를 의미한다.
pgrr = bs.find('td', class_='pgRR')


# 삼성카드 전체 페이지 수를 구하려면 pdRR 클래스 속성값으로 <td>하위의 <a> href 속성값을 구한다.
# pfgg.a['href']를 출력하면 href의 속성값인 item/sise.naver?code=029780&page=1 문자열을 얻을 수 있다.
s = str(pgrr.a['href']).split('=')

last_page = s[-1]  

# 빈 데이터프레임 생성
df = pd.DataFrame()
sise_url = 'https://finance.naver.com/item/sise_day.nhn?code=029780'  

for page in range(1, int(last_page)+1):
    url = '{}&page={}'.format(sise_url, page)  
    html = requests.get(url, headers={'User-agent': 'Mozilla/5.0'}).text
    df = df.append(pd.read_html(html, header=0)[0])

df = df.dropna()

# 차트 출력을 위해 데이터프레임 가공하기
df = df.dropna()
df = df.iloc[0:30]  
df = df.sort_values(by='날짜')  

# 날짜, 종가 컬럼으로 차트 그리기
plt.title('Samsung Card (close)')
plt.xticks(rotation=45)  
plt.plot(df['날짜'], df['종가'], 'co-') 
plt.grid(color='gray', linestyle='--')
plt.show()

 

 

삼성카드 캔들 차트 그리기

원래 캔들차트 기능은 matplotlib.finance 모듈에 포함되어 있는 기능이었으나,

matplotlib에서 제거되면서 mpl_finance 패키지로 이동되었다.

 

2019년 11월부터 mpl_finance 패키지는 폐기되고, 새롭게 mplfinance 패키지로 새롭게 변경되었다.

 

# 삼성카드 데이터 프레임 nan 값 제거
df = df.dropna()
# 삼성카드 최근 30영업일 종가 가져오기
df = df.iloc[0:30]

# 컬럼명 변경
df = df.rename(columns={'날짜':'Date', '시가':'Open', '고가':'High', '저가':'Low', '종가':'Close', '거래량':'Volume'})
# 날짜기준으로 sorting
df = df.sort_values(by='Date')
# date 칼럼을 DatatimeIndex 형으로 변경
df.index = pd.to_datetime(df.Date)

# df dataframe에서 OHLC, Volume(거래량) 가져오기
df = df[['Open', 'High', 'Low', 'Close', 'Volume']]

# 캔들차트 그리기
mpf.plot(df, title='Samsung Card candle chart', type='candle')

# OHLC 차트그리기
mpf.plot(df, title='Samsung Card ohlc chart', type='ohlc')

# 삼성카드 캔들차트 & 거래량 그래프 그리기
kwargs = dict(title='Samsung Card 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)

삼성카드 CANDLE 차트

 

삼성카드 OHLC 차트

삼성카드 CANDLE 차트 & 거래량 차트

 

 

참고도서

http://www.yes24.com/Product/Goods/90578506

 

파이썬 증권 데이터 분석 - YES24

투자 기법과 프로그래밍 기술로 자신만의 퀀트 투자 시스템을 완성하라『파이썬 증권 데이터 분석』은 웹 스크레이핑으로 증권 데이터를 주기적으로 자동 수집, 분석, 자동 매매, 예측하는 전

www.yes24.com

https://github.com/INVESTAR/StockAnalysisInPython

 

GitHub - INVESTAR/StockAnalysisInPython

Contribute to INVESTAR/StockAnalysisInPython development by creating an account on GitHub.

github.com

 

 

 

 

반응형

댓글