➋ 일봉 데이터가 있고 금일 장이 끝난 경우: 이때는 이미 있는 데이터를 확인하여 저장이 필요한 만큼 데이터를 가져와야 합니다. 예를 들어 가장 최근 저장된 데이터가 월요일이고 프로그램 실행 시점이 같은 주 목요일이면 화요일, 수요일, 목요일 3일 치 데이터를 저장하는 것이 적절할 것입니다. 하지만 여기서는 부족한 만큼의 데이터만 받아 와 저장하는 것이 아니라 전체 일봉 데이터를 받아 와 기존에 저장된 데이터를 대체하도록 했습니다.
➌ 일봉 데이터가 있고 현재 장 중인 경우: 장 중일 때는 데이터를 저장하는 작업은 하지 않고 저장된 데이터를 조회만 합니다. (이때 현재 테이블에 저장된 데이터를 그대로 사용하는 것으로 저장된 데이터가 전 영업일까지 최신 데이터를 포함하고 있다고 가정합니다. 물론 이 부분까지 검증하는 코드를 추가하면 좋겠지만 지면 관계상 여기까지는 다루지 않겠습니다.)
➍ 일봉 데이터가 있고 장이 열리기 전인 경우: 프로그램 실행 시점이 당일 장이 열리기 전일 때는 ➌과 동일하게 저장된 데이터를 조회만 하겠습니다.
경우에 따라 일봉 정보를 조회하고 저장하는 함수를 check_and_get_price_data라 이름 짓고 유니버스를 구성했던 함수와 마찬가지로 전략 초기화 함수에 추가하겠습니다. 먼저 데이터가 아예 없는 ➊을 살펴보겠습니다.
RSIStrategy.py
(...)
def check_and_get_price_data(self): ------ 일봉 데이터가 있는지 확인하고 없다면 생성하는 함수
for idx, code in enumerate(self.universe.keys()):
print("({}/{}) {}".format(idx + 1, len(self.universe), code))
if check_transaction_closed() and not check_table_exist(self.strategy_name, code): ------ 사례 ➊: 일봉 데이터가 아예 없는지 확인(장 종료 이후)
price_df = self.kiwoom.get_price_data(code) ------ API를 이용하여 조회한 가격 데이터 price_df에 저장
insert_df_to_db(self.strategy_name, code, price_df) ------ 코드를 테이블 이름으로 해서 데이터베이스에 저장
else:
pass ------ 사례 ➋~➍: 일봉 데이터가 있는 경우