본문 바로가기
Python/파이썬으로 퀀트 전략 구현하기

[python] 금융데이터 수집하기(1) - 주식 시세 데이터 수집하기 (feat. 삼성전자)

by hyelllllog 2022. 6. 15.

[ 금융데이터 수집하기 ]

(업데이트 시, 링크를 연결할 예정입니다)

 

(1) 주식 시세 데이터 수집하기 - 삼성전자

(2) 전 종목 시세데이터 수집하기 - 코스피, 코스닥 상장기업 리스트와 종목코드 크롤링

(3) 전 종목 시세데이터 수집하기 - 상장기업 전 종목 시세데이터 크롤링

(4) Opendart API로 재무제표 데이터 수집하기 - 업데이트 예정


안녕하세요! 혤로그 입니다🙂

주식 시세를 가져오는 방법에는 총 3가지가 있습니다.

 

1️⃣ requests 라이브러리 활용 방법

2️⃣ Selenium 프레임워크 활용 방법

3️⃣ 주식 시세 데이터를 제공해주는 라이브러리 활용 방법

 

오늘은 requests 라이브러리를 활용하여 삼성전자의 시세 데이터를 수집해보도록 하겠습니다.

세 가지 방법을 정리한 내용을 보시고,

본인에게 맞는 방식을 사용하시면 좋을 것 같습니다.

 

또한 아래 내용은 초보자들도 따라하실 수 있도록 최대한 천천히 자세하게 기술하였습니다.

답답하신 분들은 전체 코드만 참고하시면 됩니다.🙂✨

 

하지만 기초 지식이나 라이브러리에 대한 설명은 이 게시글에 포함되지 않았으므로

완전히 이해하시기엔 어려우실 수 있습니다.

추후에 필요한 내용도 블로그에 정리해보도록 하겠습니다.


1️⃣ requests 라이브러리 활용 방법

 

(1) 크롤링 할 url 주소 확인하기

 

데이터를 크롤링하기 위해서 데이터를 가져올 수 있는 웹 페이지를 선정해야합니다.

저는 네이버 금융의 삼성전자 일별 시세 url을 선택하였습니다.

https://finance.naver.com/item/sise_day.naver?code=005930

 

(2) url 패턴 관찰하기

 

위 url에 접속하면 기본으로 1 페이지를 디스플레이 해줍니다.

2 페이지로 넘어가면 url은 어떻게 바뀔까요?

https://finance.naver.com/item/sise_day.naver?code=005930&page=2 

기존 url 주소에 '&page=2'가 더해지게 됩니다. 

이번엔 10 페이지로 이동해보겠습니다. 

기존 url 주소에 '&page=10'이 더해지게 됩니다.

 

이렇게 url의 패턴을 보시면

https://finance.naver.com/item/sise_day.naver?code={종목코드}&page={현재 페이지}

구성되어있는 것을 알 수 있습니다.

 

(3) 데이터 크롤링 함수 작성하기

 

전체 코드는 아래와 같습니다.

구조의 이해를 돕기 위해 함수로 작성하였습니다.

 

import requests
import pandas as pd
def read_naver_sise(self, code, page_no):
    try:
           df = pd.DataFrame()
           url = f"http://finance.naver.com/item/sise_day.nhn?code={code}"

           for page in range(1, page_no + 1):
                 pg_url = '{}&page={}'.format(url, page)
                 df = df.append(pd.read_html(requests.get(pg_url, headers = {'User-agent' : 'Mozilla/5.0'}).text)[0])
                 tmnow = datetime.now().strftime('%Y-%m-%d %H:%M')
                 print('[{}] {} ({}) : {:04d}/{:04d} pages are downloading...'.format(tmnow, company, code, page, page_no), end="\r")

          df = df.rename(columns={'날짜':'date','종가':'close','전일비':'diff','시가':'open','고가':'high','저가':'low','거래량':'volume'})
          df['date'] = df['date'].replace('.','-')
          df = df.dropna()
          df = df[['date','open','high','low','close','diff','volume']]
   except Exception as e:
         print('Exception occured :', str(e))
         return None

  df.to_csv("./삼성전자_시세데이터.csv",index=False)

이제, 코드를 한 줄 씩 설명해드리겠습니다. 

먼저 함수의 parameter는 종목 코드(code)와 크롤링 할 마지막 페이지 번호 (page_no)입니다.

(예를 들어 첫 페이지부터 10 page까지 크롤링을 하고 싶으면 page_no에 10을 넣어주시면 됩니다.)

def read_naver_sise(self, code, page_no):

         '''
                read_naver_sise() : 네이버 시세 데이터 크롤링 함수
                      [input]
                              (1) code : 종목 코드
                              (2) page_no : 마지막 페이지 번호
                     [output] 해당 종목 시세 데이터 크롤링 => csv 파일 저장.
        '''

1. 크롤링한 데이터를 저장해주기 위해 DataFrame(df)을 생성했습니다.

2. 크롤링 할 url을 page를 붙이지 않고 기본 셋팅을 해줬습니다.

3. 반복문을 통해 page까지 붙여준 url을 pg_url에 format 해줍니다.

(크롤링 할 페이지가  반복해서 바뀌기 때문에 이렇게 작성하였습니다.)

4. requests.get을 통해 요청을 보내고, 받은 응답을 디코드(.text)하여 table 값을 읽습니다.(read_html)

5. 반복문을 통해 페이지 수를 변경하며 데이터를 읽어옵니다.

 

df = pd.DataFrame()
url = f"http://finance.naver.com/item/sise_day.nhn?code={code}"
for page in range(1, page_no + 1):
           pg_url = '{}&page={}'.format(url, page)
           df = df.append(pd.read_html(requests.get(pg_url, headers = {'User-agent' : 'Mozilla/5.0'}).text)[0])
           tmnow = datetime.now().strftime('%Y-%m-%d %H:%M')
           print('[{}] {} ({}) : {:04d}/{:04d} pages are downloading...'.format(tmnow, company, code, page, page_no), end="\r")

데이터를 보기 좋은 형태로 바꿔줍니다.

1. rename을 통해 칼럼명을 영문으로 바꿨습니다.

2. replace를 date에 포함되어있는 '.'을 '-'로 바꿉니다.

ex) 2022.06.14 => 2022-06-14

3. dropna()를 통해 빈 데이터는 삭제해줍니다. 

4. 데이터 칼럼의 순서를 보기 좋은 형태로 바꿔줍니다.

 

df = df.rename(columns={'날짜':'date','종가':'close','전일비':'diff','시가':'open','고가':'high','저가':'low','거래량':'volume'})
df['date'] = df['date'].replace('.','-')
df = df.dropna()
df = df[['date','open','high','low','close','diff','volume']]

데이터를 보기 편하도록 csv 파일로 저장해줍니다.

 

df.to_csv("./삼성전자_시세데이터.csv",index=False)

 

>> 관련 책

https://link.coupang.com/a/qra6F

 

파이썬 증권 데이터 분석:파이썬 입문 웹 스크레이핑 트레이딩 전략 자동 매매

COUPANG

www.coupang.com