먼저 사례 ➋인 장이 종료된 경우부터 살펴보겠습니다. 이때는 상장일부터 금일까지 데이터를 조회하여 데이터베이스에 저장하는 작업을 수행합니다. 단순한 작업이기는 하지만 추가로 데이터를 중복해서 저장하지 않도록 날짜를 비교하는 코드도 필요합니다. 왜 그런지 이유를 생각해 보겠습니다. 장이 종료되고 사례 ➋대로 오늘 생성된 일봉 데이터를 저장한 후 프로그램을 재실행하면 또 다시 같은 종목의 일봉 데이터를 저장하게 됩니다. 사례 ➋에 진입하는 조건이 테이블이 있고 장이 마감된 경우라면 API를 이용하여 조회한 데이터를 저장하기 때문입니다. 따라서 저장된 데이터의 가장 최근 일자와 오늘 날짜를 비교해서 동일하다면 이미 작업이 끝났다는 의미이기에 생략하고, 그렇지 않다면 데이터를 요청 및 저장합니다.
Note ≡
최근 저장 일자를 확인하여 데이터를 중복해서 저장하지 않아야 하는 이유가 있습니다. 3장에서 키움 API를 이용하면 데이터를 요청할 수 있는 횟수에 제한이 있다고 설명했습니다(1초에 최대 5회). 따라서 우리는 TR을 호출할 때 time.sleep 함수를 사용하여 프로그램 동작을 지연시켜서 API 제한 정책에 위배되지 않고자 했습니다. 하지만 그렇다고 해서 무제한으로 API 호출이 가능한 것은 아닙니다. 종목 200개의 일봉 데이터를 조회하다 보면 API 호출 제한이 걸려 프로그램을 재실행해야 할 때가 있습니다.
▲ 그림 5-37 API 호출 제한 안내
이런 문제가 생기면 프로그램을 재실행할 때 이미 일봉 데이터를 저장한 종목은 생략하고 넘어가도록 코드를 만들어야 합니다. 그렇지 않으면 모든 종목의 데이터를 저장하지 못하고 계속해서 중간에 멈추는 문제가 생길 수 있습니다. 예를 들어 종목 200개 중 110번째의 일봉 데이터를 얻어 오다 에러가 발생하여 재실행하면 다시 첫 번째 종목부터 시작해서 110번째 근처에서 또 API 호출 제한이 발생할 수 있습니다. 따라서 오늘 날짜에 해당하는 데이터 저장을 마친 종목인지 확인하고 111번째 종목부터 시작할 수 있도록 해야 모든 종목의 데이터를 얻어 올 수 있습니다.