선물, 옵션 분봉차트 기준 거래정보와 미결제약정 정보를 추가로 수집하는 모듈을 추가 절차 요약
추가대상 TRCODE : OPT50029, OPT50062, OPT50064, OPT50067
trcode = "OPT50029" : 선물분차트 (종목코드, 시간단위) --과거이력포함 trcode = "OPT50062" : 선물미결제약정분차트요청 (종목코드, 시간단위) --과거이력포함 trcode = "OPT50067" : 옵션분차트요청 ( 종목코드, 시간단위) --과거이력포함 trcode = "OPT50064" : 옵션미결제약정분차트요청 (종목코드, 시간단위) --과거이력포함 |
프로그램 수정 및 신규작성 (파이썬 기준)
1. 메인 호출용 프로그램 작성 - KW_000_min30_main.py
- 키움의 시간당 트랜젝션 제약을 해결하기 위하여 실제 프로그램을 반복호출하는 용도
2. 메인수행 프로그램 작성 - KW_000_min30_option.py
- 데이터 수집을 위한 메인로직으로 필요한 모듈을 호출하는 프로그램
#####전체로직 포함하는 메인 함수
# print (" KW_WeekProc 시작 ===>")
rqname, scrno, input_list = Comm_Func.Get_Input_List(trcode, code_option, gb_min) ##키움 TR코드에 따른 입력변수 정의
kiwoom.set_input_value(input_list) ## ## 키움 TR코드에 따른 입력변수에 값 정의
kiwoom.comm_rq_data(rqname, trcode, 0, scrno) ### TR의 데이터 요청 : 실행후 _receive_tr_data()이 자동 호출됨(event)
G_sqldata = kiwoom.G_sqldata ## TR결과를 작업변수로 할당
if len(G_sqldata) > 0 :
DB_Insert(cur, opt_trcode, code_option, 0,YYMM_ACT , G_sqldata) ## 데이터를 DB에 저장
next_YN = Sqlite.Check_next(trcode, G_sqldata, G_date_to) ## 반복수행여부 체크,
else :
print(code_option, "G_sqldata 업습니다")
next_YN = False
Loop_Count_Check (trcode,code_option) ## 키움제약사항에 걸리는지 체크 (일정시간내 크랜젝션 수 )
########## 데이터 연속조회 : comm_rq_data에서 remained_data 값이 결정되어 이후 while문 실행여부 결정 #######
while kiwoom.remained_data == True and next_YN == True:
kiwoom.set_input_value(input_list)
kiwoom.comm_rq_data(rqname, trcode, 2, scrno)
G_sqldata = kiwoom.G_sqldata
if len(G_sqldata) > 0:
DB_Insert(cur, opt_trcode, code_option, 0,YYMM_ACT ,G_sqldata)
next_YN = Sqlite.Check_next(trcode, G_sqldata, G_date_to)
Loop_Count_Check(trcode, code_option)
3. 기존 공통 프로그램 수정 및 모듈 신규 추가 작성
kiwoom = kw_class_kiwoom.Kiwoom() ### 키움 오픈API 사용객체 생성
Comm_Func = kw_Comm_Func.Comm_Func() ### 공통함수 객체 생성
Sqlite = kw_class_db_Insert.Sqlite_insert() ### Sqlite3 DB 데이처 저장 객체 생성
3-1) 기존 모듈 수정
3-1-1) Comm_Func.Get_Input_List 수정 : TR별 입력변수 추가
3-1-2) kiwoom.set_input_value(input_list) : 이 부분은 공통모듈화 해서 수정할 것이 없음
3-1-3) kiwoom.comm_rq_data(rqname, trcode, 0, scrno) : 이부분은 공통모듈화 해서 수정할 것이 없음
3-1-4) Sqlite.Check_next(trcode, G_sqldata, G_date_to) : 키움에서 제공받은 멀티데이터의 마지막 데이터 일자 체크
- 일자값이 원하는 기간을 벗어날때 까지 연속 수행할 수 있도록 일자항목 순서를 확인하여 체크되도록 수정
3-1-5) DB_Insert(cur, opt_trcode, code_option, 0,YYMM_ACT , G_sqldata) : 주요 수정 모듈 Set
3-1-5-1) Comm_Func.Get_Output_List(trcode) : 추가되는 TR코드 요청결과 반환되는 컬럼순서 세팅
3-1-5-2) Comm_Func.Get_Table_Name(trcode, YYMM_ACT ,0 ) : TR코드에 따라 데이터 저장할 테이블명 정의
3-1-5-3) Comm_Func.Get_DB_Colume_List(trcode) 수정 : 데이터 저장할 테이블의 컬럼명을 정의
3-1-5-4) Sqlite.Insert : TR코드에 따라 신규 호출할 모듈명과 인수들을 정의하고
3-2) 신규모듈 추가 작성 ( Sqlite.Insert 함수내에서 호출되는 )
def insert_50064(self, cur, trcode, code_option, G_sqldata, table_name, ret_column_list, table_columns, table_values):
if trcode == "OPT50064" or trcode == "OPT50062" : # OPT50064 : 선물/옵션미결제 약정 분차트요청
df = pd.DataFrame(G_sqldata, columns=ret_column_list)
df['종목코드'] = code_option
df['Y4mmdd_Update'] = self.updatedate
df['현재가'] = abs(pd.to_numeric(df['현재가']) ) # 현재값 절대값으로 ##20231226일 절대값변환 추가함
df = df[['종목코드', '체결시간' ,'현재가', '미결제약정', '미결제증감', 'Y4mmdd_Update']]
df_len = len(df) ## 데이터 존재 유무 체크하기 위하여 행수 확인
if df_len > 0:
df_to_list = df.values.tolist() ### 데이터프레임을 리스트로 변환
sql_insert = f"INSERT OR replace INTO {table_name} {table_columns} VALUES {table_values}"
sql_result = cur.executemany(sql_insert, (df_to_list)) ### 멀티데이터 Sqlite3에 한번에 저장
'금융데이터 수집' 카테고리의 다른 글
2024년 FOMC 회의 일정 (1) | 2024.01.23 |
---|---|
선물 옵션 과거 만기월물 자료 조회 방법 찾았다. (1) | 2024.01.13 |
주식시장에서 살아남는 심리투자법칙을 읽고 (0) | 2023.12.22 |
OPT10059, 종목별 투자자 기관 수급, 키움 OPEN API 활용 (0) | 2023.06.18 |
댓글