본문 바로가기
  • 데이터야 놀자
금융데이터 수집

OPT10059, 종목별 투자자 기관 수급, 키움 OPEN API 활용

by 데이터랑 2023. 6. 18.
728x90

 

데이터 분석을 하기 위해서는 초기 데이터 수집이 필요하기 때문에

키움 OPEN API 사용하여 금융 데이터를 수집하고 있습니다.

 

해당 TR마다 한 번에 제공하는 데이터 건수 20개, 100개, 600개 등 각각 다르네요

 

키움증권에서는 과도한 접속을 막기 위해 조회 횟수를 제한하기 때문에

프로그램 실행하고 한번에 받을 수 있는 데이터 개수가 매우 한정적입니다.

 

키움 OPEN API 횟수 제한 테스트 해본결과 

  • 1초에 5회 이내
  • 1분에 100회 이내
  • 1시간에 1000회 이내인 것 같습니다.

 

그동안 조회 횟수 제한에 걸리면 오류 메시지가 팝업 되고 프로그램이 홀딩되기 때문에

시간 날 때마다 프로그램을 재실행해야 하는 불편함이 있었습니다.

물론 프로그램 내에서 time()을 이용하여 시간당 횟수를 조절하는 방법도 있지만

대량의 초기데이터를 빠른 시간 내에 수집하기 위해 다른 방법을 찾아보았습니다.

 

 

키움 OPEN API 조회 횟수 제한 해결법

 

그래서 오늘,

일정조건 발생하면 종료하고 재실행하도록 하는 상위 파이썬 프로그램을 작성하고 테스트한 결과...

 

 

데이터 수집을 좀 더 빠르게 효율적으로 할 수 있게 되었습니다.

 

왜 진작 이 생각을 못했는지....

 

subprocess.call() 함수 활용

 

핵심은 :

subprocess.call()

subprocess.run() 함수도 있지만 수행환경이 32 Bit 가상운영체계라 그런지 이런저런 오류가 발생하기에

저는 그냥 subprocess.call()을 사용했습니다.

 

수행순서는 대략 다음과 같습니다.

  1. 상위 프로그램에서 subprocess.call()로 하위 프로그램을 실행시키고
  2. 하위프로그램에서 (실제로 데이터 수집하는 프로그램) 제약조건 발생 전에 프로그램 종료
  3. 하위프로그램 최종 실행한 종목코드를 반환받아 그 종목부터 하위프로그램 재실행 (정상종료 될 때까지)

 

OPT10059 : 코스피 종목별 투자자 기관별 일별 데이터 수집결과

 

일단 코스피 전체종목을 대상으로

키움 OPT10059 (종목별 투자자기관별 요청)  활용하여

현재(2023년 6월) ~ 2015년까지의 일별 개인, 외국인, 기관의 수급현황 데이터 수집을 테스트한 결과

약 278만 건 데이터가 수집되었습니다.

sqlite3 저장된 데이터 조회
sqlite3 저장된 데이터 조회

 

프로그램 Refactoring 하기 전 테스트 성공한 상위프로그램 소스는 다음과 같습니다.

 

#######################################################################################
##### 키움 오픈 API 데이터 조회 한도를 고려하여 제약 횟수 이전 프로그램 종료하고 재시작
##### 제약조건 : 1초 : 5번,  1분 : 100번,  1시간 : 1000번 
#######################################################################################

import subprocess
from datetime import datetime
import sys

if __name__ == "__main__":
  try:

    Argv0_Prgname = "test2.py"          ##### 실행 할 하위 프로그램 명
    Argv1_Stock_code = "00088K"         ##### 실행인수 : 시작하기위한 종목 코드 값

    begin_time = datetime.now()         ##### 프로그램 수행시간 측정하기위해 시작시간 측정

    for G_Loop in range(100):			##### 일단 100번이내 루핑

        result = subprocess.call(["python", Argv0_Prgname, Argv1_Stock_code])   ### 하위프로그램 실행

        if result > 10 and result < 999999 :	### 종목코드값 범위 이면
          Argv1_Stock_code = str(result).zfill(6)
          end_time = datetime.now() - begin_time
          print("result ===> ", result, "CODE Value ===> ", Argv1_Stock_code, "G_Loop ===>", G_Loop, "누적수행시간 ===>", end_time)
        else:   								###  호출한 프로그램이 정상 종료되면 For문을 빠져나감
          print(Argv0_Prgname,  "프로그램 종료합니다 =. ", result,)
          break;


  except Exception as e:
    print("오류가 발생했습니다. 프로그램을 다시 시작합니다.", e)
  finally:
    end_time = datetime.now()
    print("kw_000_batch_calling.py 총소요시간은 : ", end_time - begin_time)
    print("반복횟수는 : ", G_Loop)

이제 OPT90013 (종목일별프로그램매매추이요청)을 이용하여

종목별 프로그램일별매매추이 데이터를 수집하는 테스트 해보려고 합니다.

 

특히 OPT90013은 한 번에 20개의 데이터만 주기 때문에 반복 횟수가 많을 텐데

오늘 작성한 프로그램이 데이터 수집테스트 시간을 아주 많이 줄여 줄 것 같습니다.

 

OPT90013 (종목일별프로그램매매추이요청)의 경우 :

만약 1시간 제약을 고려하여 time.sleep() 만을 사용하면  최소 105시간 이상 필요 예상

 

  • ① 1년간 일별 데이터 건수 = 종목 약 1500개 *  280 일 = 약 420,000 건
  • ② 5년간 일별 데이터 건수 = ①  * 5 = 약 2,100,000 건
  • ③ 트랜젝션건수 =  ② / 20 ( 20 : 키움에서 TR당 제공하는 데이터 건수라고 가정 시) = 약 105,000 건
  • ④ 소요시간 =  ③ / 1000  ( 1000: 키움에서 시간당 제한하는 접속제한 건수) = 약 105시간

subprocess.call() 방식으로 수행할 경우  몇 시간 걸릴지 기회 되면 나중에 결과 올리도록 하겠습니다 ^^

 


https://datawith.tistory.com/43

 

키움 KOA Studio TR 목록

TR목록에 대해 관심이 있다는 것은 프로그램과 연계해서 본인만의 분석 시스템이나 매매시스템을 준비하는 분들일꺼라 생각됩니다. 2021년에 KOA Studio에서 제공하는 TR목록을 정리해 두었던 파일

datawith.tistory.com


 

728x90
728x90

댓글