PYTHON/Open API 정리

키움증권 Open API 시간 간격 설정하기

  • -

한 종목에 대해 일봉, 3분봉, 15분봉 모든 데이터에 대해 데이터를 조회하고 pandas 라이브러리의 to_sql 메서드를 통해 데이터를 저장한다고 했을 때, 어떠한 값으로 설정해야 하는지 의문이 들어 직접 비교해봤다.

비교 대상은 차트 데이터 조회 중에 걸어둔 time.sleep() 내에 들어가는 시간과 해당 차트 데이터를 조회하는 데에 소요되는 시간으로, 차트 데이터를 조회하면서 '과다 조회 오류'가 발생하기 전까지 조회할 수 있었던 종목의 개수와 소요된 시간 및 종목당 소요된 시간을 비교하는 것이다.

[참고 게시글] 

 


[실험 조건]

1. 일봉, 3분봉, 15분봉을 기준으로 상장기준일 이후의 모든 차트 데이터를 조회한다.
2. 일봉 데이터는 일반적인 차트 데이터 조회가 아닌 GetCommDataEx() 메서드를 활용하였다.
※ 다만, 종목 별로 상장 기간이 긴가 짧은가에 따라서도 다르기 때문에 완전하게 정확한 비교는 불가능하다.


 

 

첫째, time.sleep(1.8) 설정 시

14개 종목 조회에 24분(1,440초) 소요, 종목당 평군 1.7분(102초) 소요
※ 14개 종목 조회 후 과다 조회 오류 발생하여 프로그램 종료

[DEBUG:22:18:48] (main.py:5882) [000020] 종목의 차트 데이터를 업데이트합니다.(0/2474)
[DEBUG:22:18:48] (main.py:5885)     ┌ 일봉: True(day_date:(0(<class 'str'>)) <= latest_date:(20231110(<class 'str'>)))
[DEBUG:22:18:48] (main.py:5889)     ├      [신규] 전체 차트 데이터를 조회합니다.
[DEBUG:22:42:49] (main.py:5882) [000240] 종목의 차트 데이터를 업데이트합니다.(13/2474)
[DEBUG:22:42:49] (main.py:5885)     ┌ 일봉: True(day_date:(0(<class 'str'>)) <= latest_date:(20231110(<class 'str'>)))
[DEBUG:22:42:49] (main.py:5889)     ├      [신규] 전체 차트 데이터를 조회합니다.
[DEBUG:22:44:34] (main.py:5950)     ├ 15봉: True(min15_date:(0(<class 'str'>)) <= latest_date:(20231110(<class 'str'>)))
[DEBUG:22:44:34] (main.py:5954)     ├      [신규] 전체 차트 데이터를 조회합니다.
[INFO:22:44:48] (main.py:3839) RECEIVE TR DATA.. scrno:0613, rqname:RQ_opt10080_15min, trcode:opt10080
 

 

둘째, time.sleep(1.9) 설정 시

12개 종목 조회에 24분 1초(1,441초) 소요, 종목당 평균 2분(120초) 소요
※ 12개 종목 조회 후 과다 조회 오류 발생하여 프로그램 종료

[DEBUG:09:51:43] (main.py:5888) [214420] 종목의 차트 데이터를 업데이트합니다.(731/2478)
[DEBUG:09:51:43] (main.py:5891)     ┌ 일봉: True(day_date:(0(<class 'str'>)) <= latest_date:(20231117(<class 'str'>)))
[DEBUG:09:51:43] (main.py:5895)     ├      [신규] 전체 차트 데이터를 조회합니다.
[DEBUG:10:23:11] (main.py:5888) [271940] 종목의 차트 데이터를 업데이트합니다.(752/2478)
[DEBUG:10:23:11] (main.py:5891)     ┌ 일봉: True(day_date:(0(<class 'str'>)) <= latest_date:(20231117(<class 'str'>)))
[DEBUG:10:23:11] (main.py:5895)     ├      [신규] 전체 차트 데이터를 조회합니다.
[DEBUG:10:24:30] (main.py:5952)     ├ 15봉: True(min15_date:(0(<class 'str'>)) <= latest_date:(20231117(<class 'str'>)))
[DEBUG:10:24:30] (main.py:5956)     ├      [신규] 전체 차트 데이터를 조회합니다.
[INFO:10:24:44] (main.py:3839) RECEIVE TR DATA.. scrno:0613, rqname:RQ_opt10080_15min, trcode:opt10080
 

 

 

셋째, time.sleep(2.0) 설정 시

11개 종목 조회에 24분 12초(1,452초) 소요, 종목당 평균 2분 12초(132초) 소요
※ 11개 종목 조회 후 과다 조회 오류 발생하여 프로그램 종료

[DEBUG:10:45:19] (main.py:5888) [272550] 종목의 차트 데이터를 업데이트합니다.(756/2478)
[DEBUG:10:45:19] (main.py:5891)     ┌ 일봉: True(day_date:(0(<class 'str'>)) <= latest_date:(20231117(<class 'str'>)))
[DEBUG:10:45:19] (main.py:5895)     ├      [신규] 전체 차트 데이터를 조회합니다.
[DEBUG:11:19:02] (main.py:5888) [308170] 종목의 차트 데이터를 업데이트합니다.(776/2478)
[DEBUG:11:19:02] (main.py:5891)     ┌ 일봉: True(day_date:(0(<class 'str'>)) <= latest_date:(20231117(<class 'str'>)))
[DEBUG:11:19:02] (main.py:5895)     ├      [신규] 전체 차트 데이터를 조회합니다.
[DEBUG:11:20:17] (main.py:5952)     ├ 15봉: True(min15_date:(0(<class 'str'>)) <= latest_date:(20231117(<class 'str'>)))
[DEBUG:11:20:17] (main.py:5956)     ├      [신규] 전체 차트 데이터를 조회합니다.
[INFO:11:20:31] (main.py:3839) RECEIVE TR DATA.. scrno:0613, rqname:RQ_opt10080_15min, trcode:opt10080
 

 

 

넷째, time.sleep(3.6) 설정 시

420개 종목 조회에 19시간 40분 34초 소요(70,834초), 종목당 평균 2분 48초(168초) 소요
※ 계속해서 조회해도 과다 조회는 발생하지 아니함

[DEBUG:09:00:31] (main.py:5898) [068240] 종목의 차트 데이터를 업데이트합니다.(1105/1872)
[DEBUG:09:00:31] (main.py:5903)     ┌ 일봉: True(day_date:(0(<class 'str'>)) <= latest_date:(20231124(<class 'str'>)))
[DEBUG:09:00:31] (main.py:5907)     ├      [신규] 전체 차트 데이터를 조회합니다.
[DEBUG:04:40:32] (main.py:5898) [213420] 종목의 차트 데이터를 업데이트합니다.(1524/1872)
[DEBUG:04:40:32] (main.py:5903)     ┌ 일봉: True(day_date:(0(<class 'str'>)) <= latest_date:(20231124(<class 'str'>)))
[DEBUG:04:40:32] (main.py:5907)     ├      [신규] 전체 차트 데이터를 조회합니다.
[DEBUG:04:43:09] (main.py:5964)     ├ 15봉: True(min15_date:(0(<class 'str'>)) <= latest_date:(20231124(<class 'str'>)))
[DEBUG:04:43:09] (main.py:5968)     ├      [신규] 전체 차트 데이터를 조회합니다.
[INFO:04:43:35] (main.py:3839) RECEIVE TR DATA.. scrno:0613, rqname:RQ_opt10080_15min, trcode:opt10080
 
 

 


[결론]

비교를 시작하기 전에도 예측했던 거지만, 당연히 차트 데이터 조회에 소요되는 시간은 time.sleep()이 짧을수록 더 짧다. 당연하고도 당연하지만 이 걸 생각하고 이 글을 보러 들어온 사람은 없을 것이니 바로 본론으로 들어가자면, 한 번의 차트 데이터 조회 시 소요되는 시간이 아무런 상관이 없다고 가정했을 때(=시간은 널널하지만 '과다 조회 오류'에 걸려 프로그램을 다시 시작할 수 있는 여유는 없을 때)에는 TR 요청 당 3.6초로 설정하면 무제한으로 차트 데이터 조회가 가능함.

현재 코스피와 코스닥에 상장되어 있는 종목의 수가 2,400개 종목이 넘는다는 점을 고려하면 모든 차트 데이터를 구축하는 데에 있어서 112시간(=6,720분, =403,200초)이 소요(5분봉 등의 추가적인 데이터를 구현하고자 한다면 소요 시간은 그에 비례하여 늘어날 것은 당연한 수순)된다. 따라서 최대한 빨리 차트 데이터 조회를 끝내고 싶다면 조회 대상이 되는 종목의 수를 최소화하는 것이 좋다.

조회 대상이 되는 종목의 수를 최소화한다는 것은 곧 사전에 내가 거래하고자 하는 알고리즘 등과 같은 다양한 기준에 들어맞는 종목을 1차적으로 선정한 후, 그 종목들만을 대상으로 하여 차트 데이터를 구축하는 것이 효율적이라는 것이다. 

728x90
반응형
Contents

포스팅 주소를 복사했습니다

이 글이 도움이 되었다면 공감 부탁드립니다.