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()
'Python > 퀀트' 카테고리의 다른 글
크롤링 실습: 국내 주식 섹터 데이터 크롤링 (1) | 2024.11.06 |
---|---|
크롤링 실습: 국내 주식 티커 데이터 크롤링 (4) | 2024.11.05 |
문자열 처리를 위한 정규 표현식 (1) | 2024.11.05 |
크롤링 실습: 셀레니움을 이용한 동적 크롤링 실습하기 (3) | 2024.11.05 |
정적 크롤링과 동적 크롤링의 차이 (0) | 2024.11.05 |
댓글