본문 바로가기
Python/퀀트

크롤링 실습: 국내 모든 종목 주가 크롤링

by 훈영 2024. 11. 6.

1. 수정주가가 필요한 이유

- 삼성전자는 2018년 5월 기존의 1주를 50주로 나누는 액면분할을 실시

- '265만원'이던 주가가 다음날 50분의 1인 '53,000원'에 거래됨

- 이러한 이벤트를 고려하지 않고 주가만 살펴본다면 마치 -98%의 수익률을 기록한 것 처럼 보임

- 이를 고려하는 방법은 액면 분할 전 모든 주가를 50으로 나누어 연속성을 갖게 만듦, 이를 '수정주가'라고 함

 

 

2. 주가 크롤링

# 패키지 불러오기
import pymysql
from sqlalchemy import create_engine
import pandas as pd
from datetime import date
from dateutil.relativedelta import relativedelta
import requests as rq
import time
from tqdm import tqdm
from io import BytesIO


# DB 연결
engine = create_engine('mysql+pymysql://root:0000@127.0.0.1:3306/stock_db')
con = pymysql.connect(user='root',
                      passwd='0000',
                      host='127.0.0.1',
                      db='stock_db',
                      charset='utf8')
mycursor = con.cursor()

# 티커 리스트 불러오기
ticker_list = pd.read_sql("""
                          select * from kor_ticker
                          where 기준일 = (select max(기준일) from kor_ticker)
                          and 종목구분 = '보통주';
                          """, con=engine)

# DB 저장 쿼리
query = """
    insert into kor_price (날짜, 시가, 고가, 저가, 종가, 거래량, 종목코드)
    values (%s, %s, %s, %s, %s, %s, %s) as new
    on duplicate key update
    시가 = new.시가, 고가 = new.고가, 저가 = new.저가, 종가 = new.종가, 거래량 = new.거래량;
    """
    
# 오류 발생시 저장할 리스트 생성
error_list = []

# 모든 종목 주가 다운로드 및 저장
for i in tqdm(range(0, len(ticker_list))):
    # 티커 선택
    ticker = ticker_list['종목코드'][i]
    
    # 시작일과 종료일
    fr = (date.today() + relativedelta(years=-5)).strftime("%Y%m%d")
    to = (date.today()).strftime("%Y%m%d")
    
    # url 생성
    url = f'''https://m.stock.naver.com/front-api/external/chart/domestic/info?symbol={ticker}&requestType=1
    &startTime={fr}&endTime={to}&timeframe=day'''
    
    # 데이터 다운로드
    data = rq.get(url).content
    data_price = pd.read_csv(BytesIO(data))
    
    # 데이터 클렌징
    price = data_price.iloc[:, 0:6]
    price.columns = ['날짜', '시가', '고가', '저가', '종가', '거래량']
    price = price.dropna()
    price['날짜'] = price['날짜'].str.extract('(\d+)')
    price['날짜'] = pd.to_datetime(price['날짜'])
    price['종목코드'] = ticker
    
    # 주가 데이터를 DB에 저장
    args = price.values.tolist()
    mycursor.executemany(query, args)
    con.commit()
    
    # 타임슬립 적용
    time.sleep(2)
    
# DB 연결 종료
engine.dispose()
con.close()

댓글