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

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

by 데이터랑 2024. 1. 4.
728x90

 

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

추가대상 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
728x90

댓글