저번 글에서는 파이썬을 이용해 KRX에서 주식 마스터 정보를 가져와 데이터를 구성하는 방법을 설명했습니다.
- https://sweetquant.tistory.com/295?category=1163308
오늘은 파이썬을 이용해 주가 이력 데이터를 가져와서 쌓는 방법을 살펴보겠습니다.
종목마스터와 주가 이력 데이터만으로 우리는 많은 SQL 연습과 데이터 분석을 해볼 수 있습니다.
여기서는 파이썬과 야후 파이낸스를 이용해 주가 데이터를 가져옵니다. 해당 기능을 사용하기 pip를 사용해 yfinance와 pandas-datareader 모듈이 설치되어 있어야 합니다. 설치 방법은 anaconda prompt나 파이썬 prompt 창에서 pip install을 사용하면 됩니다. (아나콘다를 사용하시는 경우 이무 설치되어 있을수도 있습니다.)
야후 파이낸스에서 삼성전자의 주가를 가져오는 파이썬 코드는 아래와 같이 매우 간단합니다. 실제 야후파이낵스에서 주가를 가져와 데이터를 담는 과정은 pdr.get_data_yahoo 단 하나의 모듈만 호출하면 됩니다.
from pandas_datareader import data as pdr
import yfinance as yf
yf.pdr_override()
stk_hist = pdr.get_data_yahoo('005930.KS',start='2000-01-01')
print(stk_hist)
stk_hist.to_excel('005930.xlsx',sheet_name = '005930')
삼성전자의 종목코드는 005930입니다. 야후에서 삼성전자의 주가를 가져오기 위해서는 위와 같이 005930 뒤에 .KS를 추가해서 넘겨야 합니다. 위 코드의 마지막 줄은 가져온 삼성전자 주가를 엑셀 파일로 저장하는 것입니다. 이처럼 파이썬의 pandas를 사용하면 데이터를 엑셀로 저장하는 것도 단 한줄이면 해결됩니다. 참 쉽죠?
저희는 가져온 데이터를 DB에 담아야 하니까요. 먼저 주가 데이터를 담을 테이블 구조를 설계해봅니다. 아래와 같이 설계를 하도록 하겠습니다. (평생 필요한 데이터 분석에서 동일한 기능을 하는 테이블의 이름은 HISTORY_DT입니다. 혼선이 없도록 여기서는 PRICE_DT라는 테이블 명을 사용했습니다.)
위 ERD는 아래 ERD CLOUD에서 확인할 수 있습니다.
- https://www.erdcloud.com/d/uLkbGXNcGu7HkvJXa
시가, 고가, 저가, 종가의 의미가 궁금하신분은 아래 글을 참고해주세요.
- https://blog.naver.com/ryu1hwan/222399839219
별도의 SQL 툴로 MySQL에 접속해 아래 SQL을 이용해 위 테이블을 생성합니다.
CREATE TABLE DB_DTECH.PRICE_DT
(
STK_CD VARCHAR(40) NOT NULL COMMENT '종목코드'
,DT DATE NOT NULL COMMENT '일자'
,OPEN_PRC DECIMAL(18,3) NULL COMMENT '시가'
,HIGH_PRC DECIMAL(18,3) NULL COMMENT '고가'
,LOW_PRC DECIMAL(18,3) NULL COMMENT '저가'
,CLSE_PRC DECIMAL(18,3) NULL COMMENT '종가'
,ADJ_CLSE_PRC DECIMAL(18,3) NULL COMMENT '수정종가'
,VOL DECIMAL(18,3) NULL COMMENT '거래량'
,FRST_INP_DTM DATETIME NULL COMMENT '최초입력일시'
,LAST_CHG_DTM DATETIME NULL COMMENT '최종변경일시'
,PRIMARY KEY(STK_CD, DT)
) COMMENT = '일별주가';
테이블을 생성했다면, 다시 파이썬으로 돌아와서 아래와 같은 최종 코드를 입력합니다. 아래는 2000년부터 지금까지의 삼성전자 주가를 가져와 PRICE_DT 테이블에 입력하는 코드입니다.
INSERT 처리 부분이 복잡해보이지만, 코딩 량이 약간 길뿐 전혀 복잡하지 않습니다.
# pip install yfinance
# pip install pandas-datareader
from pandas_datareader import data as pdr
import yfinance as yf
import pymysql
# MySQL 연결 처리
myMyConn = pymysql.connect(user='root', password='1qaz2wsx', host='localhost', port=3306,charset='utf8', database='DB_SQLSTK')
myMyCursor = myMyConn.cursor()
def InsertStockPriceHsitory(_df,_stk_cd):
for row in _df.itertuples():
print(row)
STK_CD = _stk_cd
DT = str(row[0])
OPEN_PRC = str(row[1])
HIGH_PRC = str(row[2])
LOW_PRC = str(row[3])
CLSE_PRC = str(row[4])
ADJ_CLSE_PRC = str(row[5])
VOL = str(row[6])
sql = "INSERT INTO DB_DTECH.PRICE_DT(STK_CD ,DT ,OPEN_PRC ,HIGH_PRC ,LOW_PRC ,CLSE_PRC ,ADJ_CLSE_PRC ,VOL ,FRST_INP_DTM)" + "\n"
sql = sql + "VALUES("
sql = sql + "'" + STK_CD + "'"
sql = sql + ",'" + DT + "'"
sql = sql + "," + OPEN_PRC
sql = sql + "," + HIGH_PRC
sql = sql + "," + LOW_PRC
sql = sql + "," + CLSE_PRC
sql = sql + "," + ADJ_CLSE_PRC
sql = sql + "," + VOL
sql = sql + ",NOW())" + "\n"
sql = sql + "ON DUPLICATE KEY UPDATE" + "\n"
sql = sql + "DT = '" + DT + "'\n"
sql = sql + ",OPEN_PRC = " + OPEN_PRC + "\n"
sql = sql + ",HIGH_PRC = " + HIGH_PRC + "\n"
sql = sql + ",LOW_PRC = " + LOW_PRC + "\n"
sql = sql + ",CLSE_PRC = " + CLSE_PRC + "\n"
sql = sql + ",ADJ_CLSE_PRC = " + ADJ_CLSE_PRC + "\n"
sql = sql + ",VOL = " + VOL + "\n"
sql = sql + ",LAST_CHG_DTM = NOW()"
print(sql)
myMyCursor.execute(sql)
myMyCursor.execute('commit')
yf.pdr_override()
stk_hist = pdr.get_data_yahoo('005930.KS',start='2000-01-01')
print(stk_hist.columns)
InsertStockPriceHsitory(stk_hist,'005930')
위 파이썬 모듈을 실행한 후에, MySQL에 접속해 아래와 같은 SQL을 실행해보면, PRICE_DT 테이블에 삼성전자의 주가가 입력된 것을 확인할 수 있습니다.
SELECT T1.*
FROM DB_DTECH.PRICE_DT T1
ORDER BY T1.DT DESC;
오늘은 여기까지입니다.~!
'데이터분석 > D-Tech 데이터로 하는 재테크' 카테고리의 다른 글
2021년 전반기 영업이익 Top과 주가 흐름 (0) | 2021.08.27 |
---|---|
2021년 전반기 영업이익 Top - 종목 추출 (0) | 2021.08.26 |
등락률 업데이트하기 (0) | 2021.08.19 |
LEAD와 LAG - 삼성전자 등락률 구하기 (0) | 2021.08.18 |
파이썬 - KRX 주식 종목 마스터 만들기 (0) | 2021.08.11 |
파이썬 - MySQL 연결 및 간단히 차트 그리기 (0) | 2021.08.10 |
10년에 한 번 온다는 기회! - 바닥은 어디? (0) | 2021.07.24 |
지수ETF는 이평선을 타고? feat. 주식시장에서 살아남는 심리 투자 법칙 (0) | 2021.07.22 |