금융데이터 수집

키움 API 선물,옵션 가격, 미결제약정 분봉데이터 수집하기

데이터랑 2024. 1. 4. 19:42

 

선물, 옵션 분봉차트 기준 거래정보와 미결제약정 정보를 추가로 수집하는 모듈을 추가 절차 요약

추가대상 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에 한번에 저장

 

 

 

728x90