주식 데이터를 시각화하는 방법: Naver Finance와 Python을 이용한 캔들 차트 그리기
주식 시장의 움직임을 분석하는 데 있어 차트는 매우 중요한 역할을 합니다. 특히 캔들 차트는 시가(Open), 고가(High), 저가(Low), 종가(Close)와 같은 중요한 가격 정보를 시각적으로 쉽게 파악할 수 있는 방법입니다. 이번 블로그에서는 Naver Finance에서 주식 데이터를 수집하고, 이를 이용해 파이썬으로 캔들 차트를 그리는 과정을 설명하겠습니다.
1. 필요한 라이브러리 설치
먼저, 이 작업을 수행하기 위해 필요한 라이브러리인 pandas, requests, BeautifulSoup, 그리고 mplfinance를 설치해야 합니다. 아래 명령어를 사용해 설치할 수 있습니다.
pip install pandas requests beautifulsoup4 lxml mplfinance
2. Naver Finance에서 주식 데이터 가져오기
2.1. 웹 페이지 요청 및 파싱
Naver Finance에서 특정 주식의 데이터를 가져오기 위해 먼저 해당 주식의 일별 시세 페이지에 접근해야 합니다. 이 페이지는 여러 페이지로 나뉘어져 있으며, 페이지 번호를 통해 데이터에 접근할 수 있습니다. 여기서는 087010 코드를 가진 주식(Peptron)의 데이터를 가져옵니다.
import pandas as pd
import requests
from bs4 import BeautifulSoup
# Naver Finance URL 설정
url = 'https://finance.naver.com/item/sise_day.naver?code=087010&page=1'
html = requests.get(url, headers={'User-agent': 'Mozilla/5.0'}).text
bs = BeautifulSoup(html, 'lxml')
위 코드에서는 requests 라이브러리를 사용해 Naver Finance의 URL에 요청을 보내고, 응답받은 HTML을 BeautifulSoup으로 파싱합니다. 파싱한 HTML을 통해 원하는 데이터를 추출할 수 있습니다.
2.2. 마지막 페이지 번호 추출
데이터를 가져오기 위해서는 몇 페이지까지 데이터가 있는지를 알아야 합니다. 아래 코드는 마지막 페이지 번호를 추출하는 방법을 보여줍니다.
# 마지막 페이지 번호 추출
pgrr = bs.find('td', class_='pgRR')
s = str(pgrr.a['href']).split('=')
last_page = s[-1]
여기서 pgRR 클래스가 포함된 <td> 태그를 찾아, 그 안에 있는 href 속성에서 마지막 페이지 번호를 추출합니다.
2.3. 주식 데이터 수집
이제 각 페이지에서 데이터를 수집해 하나의 데이터프레임으로 합칠 차례입니다. 아래 코드는 모든 페이지의 데이터를 수집하여 하나의 데이터프레임으로 병합하는 과정입니다.
# 빈 데이터프레임 생성
df_list = []
sise_url = 'https://finance.naver.com/item/sise_day.naver?code=087010'
# 페이지별 데이터를 반복적으로 수집
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_list.append(pd.read_html(html, header=0)[0])
# 모든 페이지의 데이터를 병합
df = pd.concat(df_list, ignore_index=True)
pandas의 read_html 함수를 사용하여 HTML 테이블을 데이터프레임으로 변환하고, 이를 리스트에 저장한 뒤 concat 함수를 사용해 하나의 데이터프레임으로 병합합니다.
3. 데이터 클렌징 및 정렬
가져온 데이터는 NaN 값이 포함되어 있을 수 있고, 분석에 필요한 순서대로 정렬해야 합니다. 이를 위해 다음과 같은 클렌징 작업을 수행합니다.
# 데이터 클렌징 및 정렬
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']]
위 코드에서는 dropna()로 NaN 값을 제거하고, 필요한 컬럼명으로 변경한 후, 날짜 순서로 데이터를 정렬합니다. 마지막으로, 시각화에 필요한 컬럼들만 선택하여 최종 데이터프레임을 만듭니다.
4. 캔들 차트 그리기
데이터 준비가 완료되었으니 이제 mplfinance 라이브러리를 사용해 캔들 차트를 그릴 수 있습니다. 아래 코드는 캔들 차트를 생성하고 시각화하는 방법을 보여줍니다.
import mplfinance as mpf
# 캔들 차트 출력
kwargs = dict(title='Peptron 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)
mplfinance를 사용해 캔들 차트를 그릴 때, 다양한 설정을 적용할 수 있습니다:
- type='candle': 차트의 종류를 캔들 차트로 설정합니다.
- mav=(2,4,6): 2일, 4일, 6일 이동평균선을 추가합니다.
- volume=True: 차트에 거래량을 함께 표시합니다.
- marketcolors: 상승일을 빨간색(up='r'), 하락일을 파란색(down='b')으로 설정합니다.
위 설정을 통해 생성된 차트는 주식의 가격 변동을 한눈에 파악할 수 있도록 도와줍니다.
5. 전체코드 및 결과
import pandas as pd
import requests
from bs4 import BeautifulSoup
import mplfinance as mpf
# Naver Finance URL 설정
url = 'https://finance.naver.com/item/sise_day.naver?code=087010&page=1'
html = requests.get(url, headers={'User-agent': 'Mozilla/5.0'}).text
bs = BeautifulSoup(html, 'lxml')
# 마지막 페이지 번호 추출
pgrr = bs.find('td', class_='pgRR')
s = str(pgrr.a['href']).split('=')
last_page = s[-1]
# 빈 데이터프레임 생성
df_list = []
sise_url = 'https://finance.naver.com/item/sise_day.naver?code=087010'
# 페이지별 데이터를 반복적으로 수집
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_list.append(pd.read_html(html, header=0)[0])
# 모든 페이지의 데이터를 병합
df = pd.concat(df_list, ignore_index=True)
# 데이터 클렌징 및 정렬
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']]
# 캔들 차트 출력
kwargs = dict(title='Peptron 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)
이번 블로그에서는 Naver Finance에서 주식 데이터를 수집하고, 이를 이용해 파이썬으로 캔들 차트를 그리는 과정을 설명했습니다. 이 방법을 사용하면 특정 주식의 과거 시세를 시각화하여 분석할 수 있으며, 주식 시장의 흐름을 파악하는 데 큰 도움이 될 것입니다.
추가적으로, mplfinance 라이브러리는 다양한 스타일과 설정 옵션을 제공하므로, 이를 활용해 더욱 복잡한 분석을 수행할 수 있습니다. 앞으로도 이와 같은 도구들을 활용하여 데이터 분석의 폭을 넓혀보세요!