퀀트투자 - KRX에서 영업일 다운로드 받기
본문 바로가기
파이썬으로 만든 것들/퀀트투자

퀀트투자 - KRX에서 영업일 다운로드 받기

by Squat Lee 2022. 9. 23.

퀀트투자 백테스트와 분석을 진행하면서 힘든 부분이 데이터를 구하는 것이다.

 

지난 포스트(퀀트투자 - 통계적인 관점에서 백테스트 수익률 분석)

 

pykrx로 데이터를 가져왔지만 데이터 양이 많아지면 KRX 사이트에서 차단이 되어 버린다. 그래서 데이터를 다운 받아서 Local PC에 저장하기로 했다.

 

엑셀에 저장하려고 했지만, 데이터 양이 너무 많아서 불가능 하다는 사실을 알게되었다.(가능하다 해도 속도도 느려지고, 사용하기가 불편할 것이다.)

 

그래서 DB라는걸 이용하기로 했다.

 

예전에 읽은 책에서 Maria DB라는걸 알게 되어서 설치하고, 해 보려고 했지만 내가 머리가 나빠서 그런지 이해도 잘 안되고 어떻게 하는지 잘 모르겠다. 

 

그러던 중 sqlite3 라는걸 검색해서 찾아냈다. 이건 상대적으로 할 수 있겠다는 생각이 들어서 사용방법을 급하게 찾아서 공부하고, 데이터 다운로드를 시작했다.

 

종목코드, 종목명, 종가, 일자, 거래량, 상장주식수, PBR... 이런 모든 데이터를 한 번에 받으려고 했지만, 무슨 문제인지 모르겠지만 계속 에러가 발생하고 KRX에서 차단이 되었다.

 

결국 문제는 영업일을 가져오는 과정에서 발생한 것을 알게되었다. krx 데이터를 가져오기 위해서 영업일을 파라메터로 입력을 해야 하는데, 특정기간 동안의 데이터를 가져오려면 그 기간 동안의 영업일을 리스트로 만들어서 For 문을 사용해 데이터를 뽑아내야 한다.

 

그래서 일단 영업일만 가져 오기로 했다.

 

 

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
from pykrx import stock
from datetime import datetime, timedelta
import pandas as pd
import time
import sqlite3
import random
 
# 영업일을 List로 가져오기
def make_date_list(start, end):
    start = datetime.strptime(start, '%Y%m%d')
    end = datetime.strptime(end, '%Y%m%d')
    dates = [(start + timedelta(days=i)).strftime('%Y%m%d'for i in range((end-start).days+1)]
    b_dates = []
    for d in dates:
        b_day = stock.get_nearest_business_day_in_a_week(d)
        print(b_day)
        b_dates.append(b_day)
        s = random.randint(13)
        time.sleep(s)
 
    b_dates = list(dict.fromkeys(b_dates))
    df = pd.DataFrame(data=b_dates, columns=['일자'])
    con = sqlite3.connect('krx_data.db')
    df.to_sql('dates', con, if_exists='append')
 
 
try:
    make_date_list('20190105''20220831')
except:
    pass
 
 
 
cs

영업일만 가져 오는데도 계속 에러가 발생해서 KRX 차단과 다시 접속을 반복했다. 주말동안 내 시간은 데이터를 다운 받는데 다 사용되었다.

 

차단이 되면 다시 돌려서 차단 된 이전 시점까지 날짜 범위를 바꿔서 다시 돌린다음 그 데이터를 DB에 저장했다. 그리고 그 다음 날짜부터 또 다시 돌렸다. 기간을 쪼개서 돌리다 보니 2003년 부터 2022년 8월 31일까지 날짜 데이터를 받는데 이틀이 걸렸다.

 

최대한 차단을 피하려고 time.sleep 도 랜덤 숫자로 넣었다.(일정한 간격이면 왠지 차단 될 것 같아서 그랬다.)

 

결과적으로 데이터를 다 받았다. 인간 승리다. 평소 본업에서 느껴보지 못했던 보람이 가슴깊이 밀려왔다.

krx에서 가져온 영업일을 DB에 저장

이제는 데이터를 가져와야 한다. 

 

다들 주말에 할 일이 없어서 또는 쉬고 싶어서 이딴짓을 하지 않는다. 나는 왜이리 주말이 바쁜지 모르겠다. 회사에서도 바쁘지만 집에오면 할 일이 더 많다.(이것만 하는게 아니다. 나는 아빠이자 가장이기에 집안일도 해야 하고, 애들하고 소통도 해야한다. 그외 여러 잡단한 일들이 너무 많다.)

 

어서 경제적 자유를 이루어서 여유를 가지고 살고 싶다.

728x90
반응형

댓글