# -*- coding: utf-8 -*- """ Created on Wed Feb 15 16:57:19 2023 @author: Administrator """ import kis_auth as kis import time, copy import requests import json import pandas as pd from collections import namedtuple from datetime import datetime from pandas import DataFrame #====| [해외선물옵션] 주문/계좌 |============================================================================================================================ ############################################################################################## # [해외선물옵션] 주문/계좌 > 해외선물옵션 주문 [v1_해외선물-001] # 해외선물옵션 주문 API 입니다. # # ※ POST API의 경우 BODY값의 key값들을 대문자로 작성하셔야 합니다. # (EX. "CANO" : "12345678", "ACNT_PRDT_CD": "01",...) # # ※ 종목코드 마스터파일 파이썬 정제코드는 한국투자증권 Github 참고 부탁드립니다. # https://github.com/koreainvestment/open-trading-api/tree/main/stocks_info ############################################################################################## # Input: None (Option) 상세 Input값 변경이 필요한 경우 API문서 참조 # Output: DataFrame (Option) output API 문서 참조 등 def get_overseasfuopt_order(itm_no="", ord_dv="", dvsn="", qty=0, limt_pric=0, stop_pric=0, ccld_cd="6", tr_cont="", FK100="", NK100="", dataframe=None): url = '/uapi/overseas-futureoption/v1/trading/order' tr_id = "OTFM3001U" # 선물옵션주문신규 if itm_no == "": print("해외선물FX상품번호 확인요망!!!") return None if qty == 0: print("주문수량 확인요망!!!") return None if dvsn == "1" and limt_pric == 0: print("지정가주문인 경우 LIMIT주문가격 확인요망!!!") return None if dvsn == "3" and stop_pric == 0: print("STOP주문인 경우 STOP주문가격 확인요망!!!") return None if ord_dv not in ("01","02"): print("매수01/매도02 구분 확인요망!!!") return None params = { "CANO": kis.getTREnv().my_acct, # 종합계좌번호 8자리 "ACNT_PRDT_CD": kis.getTREnv().my_prod, # 계좌상품코드 2자리 "OVRS_FUTR_FX_PDNO": itm_no, # 해외선물FX상품번호 "SLL_BUY_DVSN_CD": ord_dv, # 매도매수구분코드 01 : 매도, 02 : 매수 "FM_LQD_USTL_CCLD_DT": "", # FM청산미결제체결일자 "FM_LQD_USTL_CCNO": "", # FM청산미결제체결번호 "PRIC_DVSN_CD": dvsn, # 가격구분코드 1.지정, 2.시장, 3.STOP, 4.S/L "FM_LIMIT_ORD_PRIC": limt_pric, # FMLIMIT주문가격 지정가인 경우 가격 입력 * 시장가, STOP주문인 경우, 빈칸("") 입력 "FM_STOP_ORD_PRIC": stop_pric, # FMSTOP주문가격 STOP 주문 가격 입력 * 시장가, 지정가인 경우, 빈칸("") 입력 "FM_ORD_QTY": qty, # FM주문수량 "FM_LQD_LMT_ORD_PRIC": "", # FM청산LIMIT주문가격 "FM_LQD_STOP_ORD_PRIC": "", # FM청산STOP주문가격 "CCLD_CNDT_CD": ccld_cd, # 체결조건코드 일반적으로 6 (EOD, 지정가), GTD인 경우 5, 시장가인 경우만 2 "CPLX_ORD_DVSN_CD": "0", # 복합주문구분코드 "ECIS_RSVN_ORD_YN": "N", # 행사예약주문여부 "FM_HDGE_ORD_SCRN_YN": "N" # FM_HEDGE주문화면여부 } res = kis._url_fetch(url, tr_id, tr_cont, params, postFlag=True) if str(res.getBody().rt_cd) == "0": current_data = pd.DataFrame(res.getBody().output, index=[0]) dataframe = current_data else: print(res.getBody().msg_cd + "," + res.getBody().msg1) #print(res.getErrorCode() + "," + res.getErrorMessage()) dataframe = None return dataframe ############################################################################################## # [해외선물옵션] 주문/계좌 > 해외선물옵션 정정취소주문 [v1_해외선물-002, 003] ############################################################################################## # Input: None (Option) 상세 Input값 변경이 필요한 경우 API문서 참조 # Output: DataFrame (Option) output API 문서 참조 등 def get_overseasfuopt_order_rvsecncl(dvsn="", ord_dt="", orgn_odno="", limt_pric=0, stop_pric=0, lqd_limt_pric=0, lqd_stop_pric=0, tr_cont="", dataframe=None): url = '/uapi/overseas-futureoption/v1/trading/order-rvsecncl' if dvsn == "01": # 정정 tr_id = "OTFM3002U" # 해외선물옵션주문정정 elif dvsn == "02": # 취소 tr_id = "OTFM3003U" # 해외선물옵션주문취소 else: print("정정취소구분 dvsn 확인요망!!!") return None if ord_dt == "": print("원주문일자 확인요망!!!") return None if orgn_odno == "": print("원주문번호 확인요망!!!") return None params = { "CANO": kis.getTREnv().my_acct, # 종합계좌번호 8자리 "ACNT_PRDT_CD": kis.getTREnv().my_prod, # 계좌상품코드 2자리 "ORGN_ORD_DT": ord_dt, # 원주문일자 "ORGN_ODNO": orgn_odno, # 원주문번호 정정/취소시 주문번호(ODNO) 8자리를 문자열처럼 "0"을 포함해서 전송 (ex. ORGN_ODNO : 00360686) "FM_LIMIT_ORD_PRIC": limt_pric, # LIMIT주문가격 (주문정정)시만 사용 "FM_STOP_ORD_PRIC": stop_pric, # STOP주문가격 (주문정정)시만 사용 "FM_LQD_LMT_ORD_PRIC": lqd_limt_pric, # 청산LIMIT주문가격 (주문정정)시만 사용 "FM_LQD_STOP_ORD_PRIC": lqd_stop_pric, # 청산STOP주문가격 (주문정정)시만 사용 "FM_HDGE_ORD_SCRN_YN": "N", # HEDGE주문화면여부 "N" "FM_MKPR_CVSN_YN": "N" # 시장가전환여부 (주문취소)시만 사용 } res = kis._url_fetch(url, tr_id, tr_cont, params, postFlag=True) if str(res.getBody().rt_cd) == "0": current_data = pd.DataFrame(res.getBody().output, index=[0]) dataframe = current_data else: print(res.getBody().msg_cd + "," + res.getBody().msg1) #print(res.getErrorCode() + "," + res.getErrorMessage()) dataframe = None return dataframe ############################################################################################## # [해외선물옵션] 주문/계좌 > 해외선물옵션 당일주문내역조회 [v1_해외선물-004] ############################################################################################## # 해외선물옵션 당일주문내역조회 List를 DataFrame 으로 반환 # Input: None (Option) 상세 Input값 변경이 필요한 경우 API문서 참조 # Output: DataFrame (Option) output API 문서 참조 등 def get_overseasfuopt_inquire_ccld(ccld_dv="01", ord_dv="%%", fuop_dvsn="00", tr_cont="", FK100="", NK100="", dataframe=None): url = '/uapi/overseas-futureoption/v1/trading/inquire-ccld' tr_id = "OTFM3116R" t_cnt = 0 params = { "CANO": kis.getTREnv().my_acct, # 종합계좌번호 8자리 "ACNT_PRDT_CD": kis.getTREnv().my_prod, # 계좌상품코드 2자리 "CCLD_NCCS_DVSN": ccld_dv, # 체결미체결구분 01:전체,02:체결,03:미체결 "SLL_BUY_DVSN_CD": ord_dv, # 매도매수구분코드 %%:전체,01:매도,02:매수 "FUOP_DVSN": fuop_dvsn, # 선물옵션구분 00:전체 / 01:선물 / 02:옵션 "CTX_AREA_FK200": FK100, # 공란 : 최초 조회시 이전 조회 Output CTX_AREA_FK100 값 : 다음페이지 조회시(2번째부터) "CTX_AREA_NK200": NK100 # 공란 : 최초 조회시 이전 조회 Output CTX_AREA_NK100 값 : 다음페이지 조회시(2번째부터) } res = kis._url_fetch(url, tr_id, tr_cont, params) # Assuming 'output' is a dictionary that you want to convert to a DataFrame # current_data = res.getBody().output # getBody() kis_auth.py 존재 current_data = pd.DataFrame(res.getBody().output) # Append to the existing DataFrame if it exists if dataframe is not None: dataframe = pd.concat([dataframe, current_data], ignore_index=True) # else: dataframe = current_data tr_cont, FK100, NK100 = res.getHeader().tr_cont, res.getBody().ctx_area_fk200, res.getBody().ctx_area_nk200 # 페이징 처리 getHeader(), getBody() kis_auth.py 존재 #print(tr_cont, FK100, NK100) if tr_cont == "D" or tr_cont == "E": # 마지막 페이지 print("The End") current_data = pd.DataFrame(dataframe) cnt = current_data.count() # Initialize t_cnt if not already initialized try: t_cnt += cnt except NameError: t_cnt = cnt if t_cnt.empty: print("잔고내역 없음") else: print("잔고내역 있음") dataframe = current_data return dataframe elif tr_cont == "F" or tr_cont == "M": # 다음 페이지 존재하는 경우 자기 호출 처리 print('Call Next') time.sleep(0.1) # 시스템 안정적 운영을 위하여 반드시 지연 time 필요 return get_overseasfuopt_inquire_ccld(ccld_dv, ord_dv, fuop_dvsn, "N", FK100, NK100, dataframe) ############################################################################################## # [해외선물옵션] 주문/계좌 > 해외선물옵션 미결제내역조회(잔고) [v1_해외선물-005] ############################################################################################## # 해외선물옵션 미결제내역조회(잔고) List를 DataFrame 으로 반환 # Input: None (Option) 상세 Input값 변경이 필요한 경우 API문서 참조 # Output: DataFrame (Option) output API 문서 참조 등 def get_overseasfuopt_inquire_unpd(fuop_dvsn="00", tr_cont="", FK100="", NK100="", dataframe=None): url = '/uapi/overseas-futureoption/v1/trading/inquire-unpd' tr_id = "OTFM1412R" t_cnt = 0 params = { "CANO": kis.getTREnv().my_acct, # 종합계좌번호 8자리 "ACNT_PRDT_CD": kis.getTREnv().my_prod, # 계좌상품코드 2자리 "FUOP_DVSN": fuop_dvsn, # 선물옵션구분 00:전체 / 01:선물 / 02:옵션 "CTX_AREA_FK100": FK100, # 공란 : 최초 조회시 이전 조회 Output CTX_AREA_FK100 값 : 다음페이지 조회시(2번째부터) "CTX_AREA_NK100": NK100 # 공란 : 최초 조회시 이전 조회 Output CTX_AREA_NK100 값 : 다음페이지 조회시(2번째부터) } res = kis._url_fetch(url, tr_id, tr_cont, params) # Assuming 'output' is a dictionary that you want to convert to a DataFrame # current_data = res.getBody().output # getBody() kis_auth.py 존재 current_data = pd.DataFrame(res.getBody().output) # Append to the existing DataFrame if it exists if dataframe is not None: dataframe = pd.concat([dataframe, current_data], ignore_index=True) # else: dataframe = current_data tr_cont, FK100, NK100 = res.getHeader().tr_cont, res.getBody().ctx_area_fk100, res.getBody().ctx_area_nk100 # 페이징 처리 getHeader(), getBody() kis_auth.py 존재 #print(tr_cont, FK100, NK100) if tr_cont == "D" or tr_cont == "E": # 마지막 페이지 print("The End") current_data = pd.DataFrame(dataframe) cnt = current_data.count() # Initialize t_cnt if not already initialized try: t_cnt += cnt except NameError: t_cnt = cnt if t_cnt.empty: print("잔고내역 없음") else: print("잔고내역 있음") dataframe = current_data return dataframe elif tr_cont == "F" or tr_cont == "M": # 다음 페이지 존재하는 경우 자기 호출 처리 print('Call Next') time.sleep(0.1) # 시스템 안정적 운영을 위하여 반드시 지연 time 필요 return get_overseasfuopt_inquire_unpd(fuop_dvsn, "N", FK100, NK100, dataframe) ############################################################################################## # [해외선물옵션] 주문/계좌 > 해외선물옵션 주문가능조회 [v1_해외선물-006] ############################################################################################## # 해외선물옵션 주문가능조회 List를 DataFrame 으로 반환 # Input: None (Option) 상세 Input값 변경이 필요한 경우 API문서 참조 # Output: DataFrame (Option) output API 문서 참조 등 def get_overseasfuopt_inquire_psamount(itm_no="", dvsn="", pric=0, ordyn="", tr_cont="", FK100="", NK100="", dataframe=None): url = '/uapi/overseas-futureoption/v1/trading/inquire-psamount' tr_id = "OTFM3304R" t_cnt = 0 params = { "CANO": kis.getTREnv().my_acct, # 종합계좌번호 8자리 "ACNT_PRDT_CD": kis.getTREnv().my_prod, # 계좌상품코드 2자리 "OVRS_FUTR_FX_PDNO": itm_no, # 해외선물FX상품번호 "SLL_BUY_DVSN_CD": dvsn, # 매도매수구분코드 01 : 매도 / 02 : 매수 "FM_ORD_PRIC": pric, # 주문가격 "ECIS_RSVN_ORD_YN": ordyn # 행사예약주문여부 } res = kis._url_fetch(url, tr_id, tr_cont, params) if str(res.getBody().rt_cd) == "0": current_data = pd.DataFrame(res.getBody().output) dataframe = current_data else: print(res.getBody().msg_cd + "," + res.getBody().msg1) #print(res.getErrorCode() + "," + res.getErrorMessage()) dataframe = None return dataframe ############################################################################################## # [해외선물옵션] 주문/계좌 > 해외선물옵션 기간계좌손익 일별[해외선물-010] ############################################################################################## # 해외선물옵션 기간계좌손익 List를 DataFrame 으로 반환 # Input: None (Option) 상세 Input값 변경이 필요한 경우 API문서 참조 # Output: DataFrame (Option) output API 문서 참조 등 def get_overseasfuopt_inquire_period_ccld(inqr_dvsn="", fr_dt="", to_dt="", crcy="%%%", fuop_dvsn="00", tr_cont="", FK100="", NK100="", dataframe=None): url = '/uapi/overseas-futureoption/v1/trading/inquire-period-ccld' tr_id = "OTFM3118R" t_cnt = 0 if fr_dt =="": fr_dt = datetime.today().strftime("%Y%m%d") # 기간손익 시작일자 값이 없으면 현재일자 if to_dt =="": to_dt = datetime.today().strftime("%Y%m%d") # 기간손익 종료일자 값이 없으면 현재일자 params = { "CANO": kis.getTREnv().my_acct, # 종합계좌번호 8자리 "ACNT_PRDT_CD": kis.getTREnv().my_prod, # 계좌상품코드 2자리 "INQR_TERM_FROM_DT": fr_dt, # 조회기간FROM일자 "INQR_TERM_TO_DT": to_dt, # 조회기간TO일자 "CRCY_CD": crcy, # 통화코드 '%%% : 전체 TUS: TOT_USD / TKR: TOT_KRW KRW: 한국 / USD: 미국 EUR: EUR / HKD: 홍콩 CNY: 중국 / JPY: 일본' "WHOL_TRSL_YN": "N", # 전체환산여부 "FUOP_DVSN": fuop_dvsn, # 선물옵션구분 00:전체 / 01:선물 / 02:옵션 "CTX_AREA_FK200": FK100, # 공란 : 최초 조회시 이전 조회 Output CTX_AREA_FK200 값 : 다음페이지 조회시(2번째부터) "CTX_AREA_NK200": NK100 # 공란 : 최초 조회시 이전 조회 Output CTX_AREA_NK200 값 : 다음페이지 조회시(2번째부터) } res = kis._url_fetch(url, tr_id, tr_cont, params) # Assuming 'output' is a dictionary that you want to convert to a DataFrame # current_data = res.getBody().output # getBody() kis_auth.py 존재 if inqr_dvsn == "01": current_data = pd.DataFrame(res.getBody().output1) else: current_data = pd.DataFrame(res.getBody().output2) # Append to the existing DataFrame if it exists if dataframe is not None: dataframe = pd.concat([dataframe, current_data], ignore_index=True) # else: dataframe = current_data tr_cont, FK100, NK100 = res.getHeader().tr_cont, res.getBody().ctx_area_fk200, res.getBody().ctx_area_nk200 # 페이징 처리 getHeader(), getBody() kis_auth.py 존재 #print(tr_cont, FK100, NK100) if tr_cont == "D" or tr_cont == "E": # 마지막 페이지 print("The End") current_data = pd.DataFrame(dataframe) cnt = current_data.count() # Initialize t_cnt if not already initialized try: t_cnt += cnt except NameError: t_cnt = cnt if t_cnt.empty: print("잔고내역 없음") else: print("잔고내역 있음") dataframe = current_data return dataframe elif tr_cont == "F" or tr_cont == "M": # 다음 페이지 존재하는 경우 자기 호출 처리 print('Call Next') time.sleep(0.1) # 시스템 안정적 운영을 위하여 반드시 지연 time 필요 return get_overseasfuopt_inquire_period_ccld(fr_dt, to_dt, crcy, fuop_dvsn, "N", FK100, NK100, dataframe) ############################################################################################## # [해외선물옵션] 주문/계좌 > 해외선물옵션 일별 체결내역[해외선물-011] ############################################################################################## # 해외선물옵션 일별 체결내역 List를 DataFrame 으로 반환 # Input: None (Option) 상세 Input값 변경이 필요한 경우 API문서 참조 # Output: DataFrame (Option) output API 문서 참조 등 def get_overseasfuopt_inquire_daily_ccld(fr_dt="", to_dt="", fuop_dvsn="00", crcy="%%%", dvsn="%%", tr_cont="", FK100="", NK100="", dataframe=None): url = '/uapi/overseas-futureoption/v1/trading/inquire-daily-ccld' tr_id = "OTFM3122R" t_cnt = 0 if fr_dt =="": fr_dt = datetime.today().strftime("%Y%m%d") # 기간손익 시작일자 값이 없으면 현재일자 if to_dt =="": to_dt = datetime.today().strftime("%Y%m%d") # 기간손익 종료일자 값이 없으면 현재일자 params = { "CANO": kis.getTREnv().my_acct, # 종합계좌번호 8자리 "ACNT_PRDT_CD": kis.getTREnv().my_prod, # 계좌상품코드 2자리 "STRT_DT": fr_dt, # 시작일자 "END_DT": to_dt, # 종료일자 "FUOP_DVSN_CD": fuop_dvsn, # 선물옵션구분코드 00:전체 / 01:선물 / 02:옵션 "FM_PDGR_CD": "", # 상품군코드 공란(Default) "CRCY_CD": crcy, # 통화코드 '%%% : 전체 TUS: TOT_USD / TKR: TOT_KRW KRW: 한국 / USD: 미국 EUR: EUR / HKD: 홍콩 CNY: 중국 / JPY: 일본 / VND: 베트남 "FM_ITEM_FTNG_YN": "N", # 종목합산여부 "N"(Default) "SLL_BUY_DVSN_CD": dvsn, # 매도매수구분코드 %%: 전체 / 01 : 매도 / 02 : 매수 "CTX_AREA_FK200": FK100, # 공란 : 최초 조회시 이전 조회 Output CTX_AREA_FK200 값 : 다음페이지 조회시(2번째부터) "CTX_AREA_NK200": NK100 # 공란 : 최초 조회시 이전 조회 Output CTX_AREA_NK200 값 : 다음페이지 조회시(2번째부터) } res = kis._url_fetch(url, tr_id, tr_cont, params) # Assuming 'output' is a dictionary that you want to convert to a DataFrame # current_data = res.getBody().output # getBody() kis_auth.py 존재 current_data = pd.DataFrame(res.getBody().output1) # Append to the existing DataFrame if it exists if dataframe is not None: dataframe = pd.concat([dataframe, current_data], ignore_index=True) # else: dataframe = current_data tr_cont, FK100, NK100 = res.getHeader().tr_cont, res.getBody().ctx_area_fk200, res.getBody().ctx_area_nk200 # 페이징 처리 getHeader(), getBody() kis_auth.py 존재 #print(tr_cont, FK100, NK100) if tr_cont == "D" or tr_cont == "E": # 마지막 페이지 print("The End") current_data = pd.DataFrame(dataframe) cnt = current_data.count() # Initialize t_cnt if not already initialized try: t_cnt += cnt except NameError: t_cnt = cnt if t_cnt.empty: print("잔고내역 없음") else: print("잔고내역 있음") dataframe = current_data return dataframe elif tr_cont == "F" or tr_cont == "M": # 다음 페이지 존재하는 경우 자기 호출 처리 print('Call Next') time.sleep(0.1) # 시스템 안정적 운영을 위하여 반드시 지연 time 필요 return get_overseasfuopt_inquire_daily_ccld(fr_dt, to_dt, fuop_dvsn, crcy, dvsn, "N", FK100, NK100, dataframe) ############################################################################################## # [해외선물옵션] 주문/계좌 > 해외선물옵션 예수금현황[해외선물-012] ############################################################################################## # 해외선물옵션 예수금현황 List를 DataFrame 으로 반환 # Input: None (Option) 상세 Input값 변경이 필요한 경우 API문서 참조 # Output: DataFrame (Option) output API 문서 참조 등 def get_overseasfuopt_inquire_deposit(crcy="TUS", inqr_dt="", tr_cont="", FK100="", NK100="", dataframe=None): url = '/uapi/overseas-futureoption/v1/trading/inquire-deposit' tr_id = "OTFM1411R" t_cnt = 0 if inqr_dt =="": inqr_dt = datetime.today().strftime("%Y%m%d") # 조회일자 값이 없으면 현재일자 params = { "CANO": kis.getTREnv().my_acct, # 종합계좌번호 8자리 "ACNT_PRDT_CD": kis.getTREnv().my_prod, # 계좌상품코드 2자리 "CRCY_CD": crcy, # 통화코드 '%%% : 전체 TUS: TOT_USD / TKR: TOT_KRW KRW: 한국 / USD: 미국 EUR: EUR / HKD: 홍콩 CNY: 중국 / JPY: 일본 / VND: 베트남 "INQR_DT": inqr_dt # 조회일자 } res = kis._url_fetch(url, tr_id, tr_cont, params) if str(res.getBody().rt_cd) == "0": current_data = pd.DataFrame(res.getBody().output) dataframe = current_data else: print(res.getBody().msg_cd + "," + res.getBody().msg1) #print(res.getErrorCode() + "," + res.getErrorMessage()) dataframe = None return dataframe ############################################################################################## # [해외선물옵션] 주문/계좌 > 해외선물옵션 일별 주문내역[해외선물-013] ############################################################################################## # 해외선물옵션 일별 주문내역 List를 DataFrame 으로 반환 # Input: None (Option) 상세 Input값 변경이 필요한 경우 API문서 참조 # Output: DataFrame (Option) output API 문서 참조 등 def get_overseasfuopt_inquire_daily_order(fr_dt="", to_dt="", ccld_dvsn="01", dvsn="%%", fuop_dvsn="00", tr_cont="", FK100="", NK100="", dataframe=None): url = '/uapi/overseas-futureoption/v1/trading/inquire-daily-order' tr_id = "OTFM3120R" t_cnt = 0 if fr_dt =="": fr_dt = datetime.today().strftime("%Y%m%d") # 기간손익 시작일자 값이 없으면 현재일자 if to_dt =="": to_dt = datetime.today().strftime("%Y%m%d") # 기간손익 종료일자 값이 없으면 현재일자 params = { "CANO": kis.getTREnv().my_acct, # 종합계좌번호 8자리 "ACNT_PRDT_CD": kis.getTREnv().my_prod, # 계좌상품코드 2자리 "STRT_DT": fr_dt, # 시작일자 "END_DT": to_dt, # 종료일자 "FM_PDGR_CD": "", # 상품군코드 "CCLD_NCCS_DVSN": ccld_dvsn, # 체결미체결구분 01:전체 / 02:체결 / 03:미체결 "SLL_BUY_DVSN_CD": dvsn, # 매도매수구분코드 %%전체 / 01 : 매도 / 02 : 매수 "FUOP_DVSN": fuop_dvsn, # 선물옵션구분 00:전체 / 01:선물 / 02:옵션 "CTX_AREA_FK200": FK100, # 공란 : 최초 조회시 이전 조회 Output CTX_AREA_FK200 값 : 다음페이지 조회시(2번째부터) "CTX_AREA_NK200": NK100 # 공란 : 최초 조회시 이전 조회 Output CTX_AREA_NK200 값 : 다음페이지 조회시(2번째부터) } res = kis._url_fetch(url, tr_id, tr_cont, params) # Assuming 'output' is a dictionary that you want to convert to a DataFrame # current_data = res.getBody().output # getBody() kis_auth.py 존재 current_data = pd.DataFrame(res.getBody().output) # Append to the existing DataFrame if it exists if dataframe is not None: dataframe = pd.concat([dataframe, current_data], ignore_index=True) # else: dataframe = current_data tr_cont, FK100, NK100 = res.getHeader().tr_cont, res.getBody().ctx_area_fk200, res.getBody().ctx_area_nk200 # 페이징 처리 getHeader(), getBody() kis_auth.py 존재 #print(tr_cont, FK100, NK100) if tr_cont == "D" or tr_cont == "E": # 마지막 페이지 print("The End") current_data = pd.DataFrame(dataframe) cnt = current_data.count() # Initialize t_cnt if not already initialized try: t_cnt += cnt except NameError: t_cnt = cnt if t_cnt.empty: print("잔고내역 없음") else: print("잔고내역 있음") dataframe = current_data return dataframe elif tr_cont == "F" or tr_cont == "M": # 다음 페이지 존재하는 경우 자기 호출 처리 print('Call Next') time.sleep(0.1) # 시스템 안정적 운영을 위하여 반드시 지연 time 필요 return get_overseasfuopt_inquire_daily_order(fr_dt, to_dt, ccld_dvsn, dvsn, fuop_dvsn, "N", FK100, NK100, dataframe) ############################################################################################## # [해외선물옵션] 주문/계좌 > 해외선물옵션 기간계좌거래내역[해외선물-014] ############################################################################################## # 해외선물옵션 기간계좌거래내역 List를 DataFrame 으로 반환 # Input: None (Option) 상세 Input값 변경이 필요한 경우 API문서 참조 # Output: DataFrame (Option) output API 문서 참조 등 def get_overseasfuopt_inquire_period_trans(fr_dt="", to_dt="", trtype="1", crcy="%%%", tr_cont="", FK100="", NK100="", dataframe=None): url = '/uapi/overseas-futureoption/v1/trading/inquire-period-trans' tr_id = "OTFM3114R" t_cnt = 0 if fr_dt =="": fr_dt = datetime.today().strftime("%Y%m%d") # 기간손익 시작일자 값이 없으면 현재일자 if to_dt =="": to_dt = datetime.today().strftime("%Y%m%d") # 기간손익 종료일자 값이 없으면 현재일자 params = { "CANO": kis.getTREnv().my_acct, # 종합계좌번호 8자리 "ACNT_PRDT_CD": kis.getTREnv().my_prod, # 계좌상품코드 2자리 "INQR_TERM_FROM_DT": fr_dt, # 시작일자 "INQR_TERM_TO_DT": to_dt, # 종료일자 "ACNT_TR_TYPE_CD": trtype, # 계좌거래유형코드 1: 전체, 2:입출금 , 3: 결제 "CRCY_CD": crcy, # 통화코드 %%% : 전체 TUS: TOT_USD / TKR: TOT_KRW / KRW: 한국 / USD: 미국 / EUR: EUR / HKD: 홍콩 / CNY: 중국 / JPY: 일본 / VND: 베트남 "PWD_CHK_YN": "N", # 사용안함 "CTX_AREA_FK100": FK100, # 공란 : 최초 조회시 이전 조회 Output CTX_AREA_FK200 값 : 다음페이지 조회시(2번째부터) "CTX_AREA_NK100": NK100 # 공란 : 최초 조회시 이전 조회 Output CTX_AREA_NK200 값 : 다음페이지 조회시(2번째부터) } res = kis._url_fetch(url, tr_id, tr_cont, params) # Assuming 'output' is a dictionary that you want to convert to a DataFrame # current_data = res.getBody().output # getBody() kis_auth.py 존재 current_data = pd.DataFrame(res.getBody().output) # Append to the existing DataFrame if it exists if dataframe is not None: dataframe = pd.concat([dataframe, current_data], ignore_index=True) # else: dataframe = current_data tr_cont, FK100, NK100 = res.getHeader().tr_cont, res.getBody().ctx_area_fk100, res.getBody().ctx_area_nk100 # 페이징 처리 getHeader(), getBody() kis_auth.py 존재 #print(tr_cont, FK100, NK100) if tr_cont == "D" or tr_cont == "E": # 마지막 페이지 print("The End") current_data = pd.DataFrame(dataframe) cnt = current_data.count() # Initialize t_cnt if not already initialized try: t_cnt += cnt except NameError: t_cnt = cnt if t_cnt.empty: print("잔고내역 없음") else: print("잔고내역 있음") dataframe = current_data return dataframe elif tr_cont == "F" or tr_cont == "M": # 다음 페이지 존재하는 경우 자기 호출 처리 print('Call Next') time.sleep(0.1) # 시스템 안정적 운영을 위하여 반드시 지연 time 필요 return get_overseasfuopt_inquire_period_trans(fr_dt, to_dt, trtype, crcy, "N", FK100, NK100, dataframe) ############################################################################################## # [해외선물옵션] 주문/계좌 > 해외선물옵션 예수금현황[해외선물-012] ############################################################################################## # 해외선물옵션 예수금현황 List를 DataFrame 으로 반환 # Input: None (Option) 상세 Input값 변경이 필요한 경우 API문서 참조 # Output: DataFrame (Option) output API 문서 참조 등 def get_overseasfuopt_inquire_margin_detail(crcy="TUS", inqr_dt="", tr_cont="", FK100="", NK100="", dataframe=None): url = '/uapi/overseas-futureoption/v1/trading/margin-detail' tr_id = "OTFM3115R" t_cnt = 0 if inqr_dt =="": inqr_dt = datetime.today().strftime("%Y%m%d") # 조회일자 값이 없으면 현재일자 params = { "CANO": kis.getTREnv().my_acct, # 종합계좌번호 8자리 "ACNT_PRDT_CD": kis.getTREnv().my_prod, # 계좌상품코드 2자리 "CRCY_CD": crcy, # 통화코드 '%%% : 전체 TUS: TOT_USD / TKR: TOT_KRW KRW: 한국 / USD: 미국 EUR: EUR / HKD: 홍콩 CNY: 중국 / JPY: 일본 / VND: 베트남 "INQR_DT": inqr_dt # 조회일자 } res = kis._url_fetch(url, tr_id, tr_cont, params) if str(res.getBody().rt_cd) == "0": current_data = pd.DataFrame(res.getBody().output, index=[0]) dataframe = current_data else: print(res.getBody().msg_cd + "," + res.getBody().msg1) #print(res.getErrorCode() + "," + res.getErrorMessage()) dataframe = None return dataframe #====| [해외선물옵션] 기본시세 |============================================================================================================================ ############################################################################################## # [해외선물옵션] 기본시세 > 해외선물종목상세 [v1_해외선물-008] # (중요) 해외선물옵션시세 출력값을 해석하실 때 ffcode.mst(해외선물종목마스터 파일)에 있는 sCalcDesz(계산 소수점) 값을 활용하셔야 정확한 값을 받아오실 수 있습니다. # # - ffcode.mst(해외선물종목마스터 파일) 다운로드 방법 2가지 # 1) 한국투자증권 Github의 파이썬 샘플코드를 사용하여 mst 파일 다운로드 및 excel 파일로 정제 # https://github.com/koreainvestment/open-trading-api/blob/main/stocks_info/overseas_future_code.py # # 2) 혹은 포럼 - FAQ - 종목정보 다운로드 - 해외선물옵션 클릭하셔서 ffcode.mst(해외선물종목마스터 파일)을 다운로드 후 # Github의 헤더정보(https://github.com/koreainvestment/open-trading-api/blob/main/stocks_info/해외선물옵션정보.h)를 참고하여 해석 # # - 소수점 계산 시, ffcode.mst(해외선물종목마스터 파일)의 sCalcDesz(계산 소수점) 값 참고 # EX) ffcode.mst 파일의 sCalcDesz(계산 소수점) 값 # 품목코드 6A 계산소수점 -4 → 시세 6882.5 수신 시 0.68825 로 해석 # 품목코드 GC 계산소수점 -1 → 시세 19225 수신 시 1922.5 로 해석 # # [참고자료] # ※ 종목코드 마스터파일 파이썬 정제코드는 한국투자증권 Github 참고 부탁드립니다. # https://github.com/koreainvestment/open-trading-api/tree/main/stocks_info ############################################################################################## def get_overseas_fuopt_stock_detail(itm_no="", tr_cont="", dataframe=None): url = '/uapi/overseas-futureoption/v1/quotations/stock-detail' tr_id = "HHDFC55010100" # 해외선물종목상세 params = { "SRS_CD": itm_no # 종목코드 } res = kis._url_fetch(url, tr_id, tr_cont, params) # Assuming 'output' is a dictionary that you want to convert to a DataFrame current_data = pd.DataFrame(res.getBody().output1, index=[0]) dataframe = current_data return dataframe ############################################################################################## # [해외선물옵션] 기본시세 > 해외선물종목현재가 [v1_해외선물-009] # (중요) 해외선물옵션시세 출력값을 해석하실 때 ffcode.mst(해외선물종목마스터 파일)에 있는 sCalcDesz(계산 소수점) 값을 활용하셔야 정확한 값을 받아오실 수 있습니다. # # - ffcode.mst(해외선물종목마스터 파일) 다운로드 방법 2가지 # 1) 한국투자증권 Github의 파이썬 샘플코드를 사용하여 mst 파일 다운로드 및 excel 파일로 정제 # https://github.com/koreainvestment/open-trading-api/blob/main/stocks_info/overseas_future_code.py # # 2) 혹은 포럼 - FAQ - 종목정보 다운로드 - 해외선물옵션 클릭하셔서 ffcode.mst(해외선물종목마스터 파일)을 다운로드 후 # Github의 헤더정보(https://github.com/koreainvestment/open-trading-api/blob/main/stocks_info/해외선물옵션정보.h)를 참고하여 해석 # # - 소수점 계산 시, ffcode.mst(해외선물종목마스터 파일)의 sCalcDesz(계산 소수점) 값 참고 # EX) ffcode.mst 파일의 sCalcDesz(계산 소수점) 값 # 품목코드 6A 계산소수점 -4 → 시세 6882.5 수신 시 0.68825 로 해석 # 품목코드 GC 계산소수점 -1 → 시세 19225 수신 시 1922.5 로 해석 # # [참고자료] # ※ 종목코드 마스터파일 파이썬 정제코드는 한국투자증권 Github 참고 부탁드립니다. # https://github.com/koreainvestment/open-trading-api/tree/main/stocks_info ############################################################################################## def get_overseas_fuopt_inquire_price(itm_no="", tr_cont="", dataframe=None): url = '/uapi/overseas-futureoption/v1/quotations/inquire-price' tr_id = "HHDFC55010000" # 해외선물종목현재가 params = { "SRS_CD": itm_no # 종목코드 } res = kis._url_fetch(url, tr_id, tr_cont, params) # Assuming 'output' is a dictionary that you want to convert to a DataFrame current_data = pd.DataFrame(res.getBody().output1, index=[0]) dataframe = current_data return dataframe ############################################################################################## # [해외선물옵션] 기본시세 > 해외선물 분봉조회[해외선물-016] # 해외선물분봉조회 API입니다. 반드시 아래 호출방법을 확인하시고 호출 사용하시기 바랍니다. # # ※ 해외선물분봉조회 조회 방법 # params # . START_DATE_TIME: 공란 입력 ("") # . CLOSE_DATE_TIME: 조회일자 입력 ("20231214") # . QRY_CNT: 120 입력 시, 가장 최근 분봉 120건 조회, # 240 입력 시, 240 이전 분봉 ~ 120 이전 분봉 조회 # 360 입력 시, 360 이전 분봉 ~ 240 이전 분봉 조회 # . QRY_TP: 처음조회시, 공백 입력 # 다음조회시, P 입력 # . INDEX_KEY: 처음조회시, 공백 입력 # 다음조회시, 이전 조회 응답의 output2 > index_key 값 입력 # # * 따라서 분봉데이터를 기간별로 수집하고자 하실 경우 QRY_TP, INDEX_KEY 값을 이용하시면서 다음조회하시면 됩니다. ############################################################################################## def get_overseas_fuopt_inquire_time_futurechartprice(itm_no="", exch="", st_dt="", ed_dt="", dvsn="", cnt="", gap="", idx="", tr_cont="", dataframe=None): url = '/uapi/overseas-futureoption/v1/quotations/inquire-time-futurechartprice' tr_id = "HHDFC55020400" # 해외선물 분봉조회 params = { "SRS_CD": itm_no, # 종목코드 "EXCH_CD": exch, # 거래소코드 "START_DATE_TIME": st_dt, # 조회시작일시 "CLOSE_DATE_TIME": ed_dt, # 조회종료일시 "QRY_TP": dvsn, # 조회구분 "QRY_CNT": cnt, # 요청개수 "QRY_GAP": gap, # 묶음개수 "INDEX_KEY": idx # 이전조회KEY } res = kis._url_fetch(url, tr_id, tr_cont, params) # API 호출 # Assuming 'output' is a dictionary that you want to convert to a DataFrame current_data = pd.DataFrame(res.getBody().output1) # Append to the existing DataFrame if it exists if dataframe is not None: dataframe = pd.concat([dataframe, current_data], ignore_index=True) # else: dataframe = current_data tr_cont, idx = res.getHeader().tr_cont, res.getBody().output2['index_key'] # 페이징 처리 getHeader(), getBody() kis_auth.py 존재 if idx == "": idx = "99991231" # 다음페이지 값이 없으면 종료 처리를 위해 임의 날자 값 셋팅 date1 = datetime.strptime(idx[:8], '%Y%m%d') # 응답 index_key 다음날자 값 날자형 변환 date2 = datetime.strptime(st_dt, '%Y%m%d') # 조회시작일자 날자형 변환 date3 = datetime.strptime(ed_dt, '%Y%m%d') # 조회종료일자 날자형 변환 #print(date1, date2, date3) if date1 >= date2 and date1 <= date3: # 조회시작일자 ~ 조회종료일자 까지 다음페이지 조회 print('Call Next ( ' + idx[:8] + ' )') time.sleep(0.1) # 시스템 안정적 운영을 위하여 반드시 지연 time 필요 return get_overseas_fuopt_inquire_time_futurechartprice(itm_no, exch, st_dt, ed_dt, "P", cnt, gap, idx, tr_cont, dataframe) else: # 조회시작일자 ~ 조회종료일자 이외 날자인경우 종료 처리 #print("The End") print('The End ( ' + idx[:8] + ' )') return dataframe ############################################################################################## # [해외선물옵션] 기본시세 > 해외선물 체결추이(주간)[해외선물-017] # 해외선물옵션 체결추이(주간) API입니다. # 한국투자 HTS(eFriend Force) > [5502] 해외선물옵션 체결추이 화면에서 "주간" 선택 시 기능을 API로 개발한 사항으로, 해당 화면을 참고하시면 기능을 이해하기 쉽습니다. ############################################################################################## def get_overseas_fuopt_weekly_ccnl(itm_no="", exch="", st_dt="", ed_dt="", dvsn="Q", cnt="40", gap="", idx="", tr_cont="", dataframe=None): url = '/uapi/overseas-futureoption/v1/quotations/weekly-ccnl' tr_id = "HHDFC55020000" # 체결추이(주간) params = { "SRS_CD": itm_no, # 종목코드 "EXCH_CD": exch, # 거래소코드 "START_DATE_TIME": st_dt, # 조회시작일시 "CLOSE_DATE_TIME": ed_dt, # 조회종료일시 "QRY_TP": dvsn, # 조회구분 "QRY_CNT": cnt, # 요청개수 "QRY_GAP": gap, # 묶음개수 "INDEX_KEY": idx # 이전조회KEY } res = kis._url_fetch(url, tr_id, tr_cont, params) # API 호출 # Assuming 'output' is a dictionary that you want to convert to a DataFrame current_data = pd.DataFrame(res.getBody().output2) # Append to the existing DataFrame if it exists if dataframe is not None: dataframe = pd.concat([dataframe, current_data], ignore_index=True) # else: dataframe = current_data tr_cont, idx = res.getHeader().tr_cont, res.getBody().output1['index_key'] # 페이징 처리 getHeader(), getBody() kis_auth.py 존재 if idx == "": idx = "99991231" # 다음페이지 값이 없으면 종료 처리를 위해 임의 날자 값 셋팅 date1 = datetime.strptime(str(idx), '%Y%m%d') # 응답 index_key 다음날자 값 날자형 변환 date2 = datetime.strptime(str(st_dt),'%Y%m%d') # 조회시작일자 날자형 변환 date3 = datetime.strptime(str(ed_dt),'%Y%m%d') # 조회종료일자 날자형 변환 #print(date1, date2, date3) if date1 >= date2 and date1 <= date3: # 조회시작일자 ~ 조회종료일자 까지 다음페이지 조회 print('Call Next ( ' + idx[:8] + ' )') time.sleep(0.1) # 시스템 안정적 운영을 위하여 반드시 지연 time 필요 return get_overseas_fuopt_weekly_ccnl(itm_no, exch, st_dt, ed_dt, "P", cnt, gap, idx, tr_cont, dataframe) else: # 조회시작일자 ~ 조회종료일자 이외 날자인경우 종료 처리 #print("The End") print('The End ( ' + idx[:8] + ' )') return dataframe ############################################################################################## # [해외선물옵션] 기본시세 > 해외선물 체결추이(일간)[해외선물-018] # 해외선물옵션 체결추이(일간) API입니다. # 한국투자 HTS(eFriend Force) > [5502] 해외선물옵션 체결추이 화면에서 "일간" 선택 시 기능을 API로 개발한 사항으로, 해당 화면을 참고하시면 기능을 이해하기 쉽습니다. ############################################################################################## def get_overseas_fuopt_daily_ccnl(itm_no="", exch="", st_dt="", ed_dt="", dvsn="Q", cnt="40", gap="", idx="", tr_cont="", dataframe=None): url = '/uapi/overseas-futureoption/v1/quotations/daily-ccnl' tr_id = "HHDFC55020100" # 체결추이(일간) params = { "SRS_CD": itm_no, # 종목코드 "EXCH_CD": exch, # 거래소코드 "START_DATE_TIME": st_dt, # 조회시작일시 "CLOSE_DATE_TIME": ed_dt, # 조회종료일시 "QRY_TP": dvsn, # 조회구분 "QRY_CNT": cnt, # 요청개수 "QRY_GAP": gap, # 묶음개수 "INDEX_KEY": idx # 이전조회KEY } res = kis._url_fetch(url, tr_id, tr_cont, params) # API 호출 # Assuming 'output' is a dictionary that you want to convert to a DataFrame current_data = pd.DataFrame(res.getBody().output2) # Append to the existing DataFrame if it exists if dataframe is not None: dataframe = pd.concat([dataframe, current_data], ignore_index=True) # else: dataframe = current_data.loc[current_data.data_date.between(st_dt, ed_dt)] # 조회일자 범위만큼 추출하여 dataframe에 셋팅 tr_cont, idx = res.getHeader().tr_cont, res.getBody().output1['index_key'] # 페이징 처리 getHeader(), getBody() kis_auth.py 존재 if idx == "": idx = "99991231" # 다음페이지 값이 없으면 종료 처리를 위해 임의 날자 값 셋팅 date1 = datetime.strptime(str(idx), '%Y%m%d') # 응답 index_key 다음날자 값 날자형 변환 date2 = datetime.strptime(str(st_dt),'%Y%m%d') # 조회시작일자 날자형 변환 date3 = datetime.strptime(str(ed_dt),'%Y%m%d') # 조회종료일자 날자형 변환 #print(date1, date2, date3) if date1 >= date2 and date1 <= date3: # 조회시작일자 ~ 조회종료일자 까지 다음페이지 조회 print('Call Next ( ' + idx[:8] + ' )') time.sleep(0.05) return get_overseas_fuopt_daily_ccnl(itm_no, exch, st_dt, ed_dt, "P", cnt, gap, idx, tr_cont, dataframe) else: # 조회시작일자 ~ 조회종료일자 이외 날자인경우 종료 처리 #print("The End") print('The End ( ' + idx[:8] + ' )') return dataframe ############################################################################################## # [해외선물옵션] 기본시세 > 해외선물 체결추이(틱)[해외선물-019] # 해외선물옵션 체결추이(틱) API입니다. # 한국투자 HTS(eFriend Force) > [5502] 해외선물옵션 체결추이 화면에서 "Tick" 선택 시 기능을 API로 개발한 사항으로, 해당 화면을 참고하시면 기능을 이해하기 쉽습니다. ############################################################################################## def get_overseas_fuopt_tick_ccnl(itm_no="", exch="", st_dt="", ed_dt="", dvsn="Q", cnt="40", gap="", idx="", tr_cont="", dataframe=None): url = '/uapi/overseas-futureoption/v1/quotations/tick-ccnl' tr_id = "HHDFC55020200" # 체결추이(틱) if st_dt =="": st_dt = datetime.today().strftime("%Y%m%d") # 주문내역조회 시작일자 값이 없으면 현재일자 if ed_dt =="": ed_dt = datetime.today().strftime("%Y%m%d") # 주문내역조회 종료일자 값이 없으면 현재일자 params = { "SRS_CD": itm_no, # 종목코드 "EXCH_CD": exch, # 거래소코드 "START_DATE_TIME": st_dt, # 조회시작일시 "CLOSE_DATE_TIME": ed_dt, # 조회종료일시 "QRY_TP": dvsn, # 조회구분 "QRY_CNT": cnt, # 요청개수 "QRY_GAP": gap, # 묶음개수 "INDEX_KEY": idx # 이전조회KEY } res = kis._url_fetch(url, tr_id, tr_cont, params) # API 호출 # Assuming 'output' is a dictionary that you want to convert to a DataFrame current_data = pd.DataFrame(res.getBody().output2) # Append to the existing DataFrame if it exists if dataframe is not None: dataframe = pd.concat([dataframe, current_data], ignore_index=True) # else: dataframe = current_data.loc[current_data.data_date.between(ed_dt, ed_dt)] # 조회일자 범위만큼 추출하여 dataframe에 셋팅 #dataframe = current_data # 조회일자 범위만큼 추출하여 dataframe에 셋팅 tr_cont, idx = res.getHeader().tr_cont, res.getBody().output1['index_key'] # 페이징 처리 getHeader(), getBody() kis_auth.py 존재 if idx == "": idx = "99991231" # 다음페이지 값이 없으면 종료 처리를 위해 임의 날자 값 셋팅 date1 = datetime.strptime(str(idx[:8]), '%Y%m%d') # 응답 index_key 다음날자 값 날자형 변환 date2 = datetime.strptime(str(st_dt),'%Y%m%d') # 조회시작일자 날자형 변환 date3 = datetime.strptime(str(ed_dt),'%Y%m%d') # 조회종료일자 날자형 변환 #print(date1, date2, date3) if date1 == date3: # 조회시작일자 ~ 조회종료일자 까지 다음페이지 조회 print('Call Next ( ' + idx + ' )') time.sleep(0.05) return get_overseas_fuopt_tick_ccnl(itm_no, exch, st_dt, ed_dt, "P", cnt, gap, idx, tr_cont, dataframe) else: # 조회시작일자 ~ 조회종료일자 이외 날자인경우 종료 처리 #print("The End") print('The End ( ' + idx + ' )') return dataframe ############################################################################################## # [해외선물옵션] 기본시세 > 해외선물 체결추이(월간)[해외선물-020] # 해외선물옵션 체결추이(월간) API입니다. # 한국투자 HTS(eFriend Force) > [5502] 해외선물옵션 체결추이 화면에서 "월간" 선택 시 기능을 API로 개발한 사항으로, 해당 화면을 참고하시면 기능을 이해하기 쉽습니다. ############################################################################################## def get_overseas_fuopt_monthly_ccnl(itm_no="", exch="", st_dt="", ed_dt="", dvsn="Q", cnt="40", gap="", idx="", tr_cont="", dataframe=None): url = '/uapi/overseas-futureoption/v1/quotations/monthly-ccnl' tr_id = "HHDFC55020300" # 체결추이(월간) params = { "SRS_CD": itm_no, # 종목코드 "EXCH_CD": exch, # 거래소코드 "START_DATE_TIME": st_dt, # 조회시작일시 "CLOSE_DATE_TIME": ed_dt, # 조회종료일시 "QRY_TP": dvsn, # 조회구분 "QRY_CNT": cnt, # 요청개수 "QRY_GAP": gap, # 묶음개수 "INDEX_KEY": idx # 이전조회KEY } res = kis._url_fetch(url, tr_id, tr_cont, params) # API 호출 # Assuming 'output' is a dictionary that you want to convert to a DataFrame current_data = pd.DataFrame(res.getBody().output2) # Append to the existing DataFrame if it exists if dataframe is not None: dataframe = pd.concat([dataframe, current_data], ignore_index=True) # else: dataframe = current_data #.loc[current_data.data_date.between(st_dt, ed_dt)] # 조회일자 범위만큼 추출하여 dataframe에 셋팅 tr_cont, idx = res.getHeader().tr_cont, res.getBody().output1['index_key'] # 페이징 처리 getHeader(), getBody() kis_auth.py 존재 if idx == "": idx = "99991231" # 다음페이지 값이 없으면 종료 처리를 위해 임의 날자 값 셋팅 date1 = datetime.strptime(str(idx), '%Y%m%d') # 응답 index_key 다음날자 값 날자형 변환 date2 = datetime.strptime(str(st_dt),'%Y%m%d') # 조회시작일자 날자형 변환 date3 = datetime.strptime(str(ed_dt),'%Y%m%d') # 조회종료일자 날자형 변환 #print(date1, date2, date3) if date1 >= date2 and date1 <= date3: # 조회시작일자 ~ 조회종료일자 까지 다음페이지 조회 print('Call Next ( ' + idx[:8] + ' )') time.sleep(0.05) return get_overseas_fuopt_monthly_ccnl(itm_no, exch, st_dt, ed_dt, "P", cnt, gap, idx, tr_cont, dataframe) else: # 조회시작일자 ~ 조회종료일자 이외 날자인경우 종료 처리 #print("The End") print('The End ( ' + idx[:8] + ' )') return dataframe ############################################################################################## # [해외선물옵션] 기본시세 > 해외선물 호가 [해외선물-031] # (중요) 해외선물옵션시세 출력값을 해석하실 때 ffcode.mst(해외선물종목마스터 파일)에 있는 sCalcDesz(계산 소수점) 값을 활용하셔야 정확한 값을 받아오실 수 있습니다. # # - ffcode.mst(해외선물종목마스터 파일) 다운로드 방법 2가지 # 1) 한국투자증권 Github의 파이썬 샘플코드를 사용하여 mst 파일 다운로드 및 excel 파일로 정제 # https://github.com/koreainvestment/open-trading-api/blob/main/stocks_info/overseas_future_code.py # # 2) 혹은 포럼 - FAQ - 종목정보 다운로드 - 해외선물옵션 클릭하셔서 ffcode.mst(해외선물종목마스터 파일)을 다운로드 후 # Github의 헤더정보(https://github.com/koreainvestment/open-trading-api/blob/main/stocks_info/해외선물옵션정보.h)를 참고하여 해석 # # - 소수점 계산 시, ffcode.mst(해외선물종목마스터 파일)의 sCalcDesz(계산 소수점) 값 참고 # EX) ffcode.mst 파일의 sCalcDesz(계산 소수점) 값 # 품목코드 6A 계산소수점 -4 → 시세 6882.5 수신 시 0.68825 로 해석 # 품목코드 GC 계산소수점 -1 → 시세 19225 수신 시 1922.5 로 해석 # # [참고자료] # ※ 종목코드 마스터파일 파이썬 정제코드는 한국투자증권 Github 참고 부탁드립니다. # https://github.com/koreainvestment/open-trading-api/tree/main/stocks_info ############################################################################################## def get_overseas_fuopt_inquire_asking_price(itm_no="", tr_cont="", dataframe=None): url = '/uapi/overseas-futureoption/v1/quotations/inquire-asking-price' tr_id = "HHDFC86000000" # 해외선물호가 params = { "SRS_CD": itm_no # 종목코드 } res = kis._url_fetch(url, tr_id, tr_cont, params) # Assuming 'output' is a dictionary that you want to convert to a DataFrame current_data = pd.DataFrame(res.getBody().output1, index=[0]) dataframe = current_data return dataframe ############################################################################################## # [해외선물옵션] 기본시세 > 해외선물 상품기본정보 [해외선물-023] # 해외선물옵션 상품기본정보 API입니다. # QRY_CNT에 SRS_CD 요청 개수 입력, SRS_CD_01 ~SRS_CD_32 까지 최대 32건의 상품코드 추가 입력하여 해외선물옵션 상품기본정보 확인이 가능합니다. (아래 Example 참고) ############################################################################################## def get_overseas_fuopt_search_contract_detail(cnt="1", itm_no01="", tr_cont="", dataframe=None): url = '/uapi/overseas-futureoption/v1/quotations/search-contract-detail' tr_id = "HHDFC55200000" # 해외선물 상품기본정보 params = { "QRY_CNT": cnt, # 요청개수 "SRS_CD_01": itm_no01 # 종목코드 } res = kis._url_fetch(url, tr_id, tr_cont, params) # Assuming 'output' is a dictionary that you want to convert to a DataFrame current_data = pd.DataFrame(res.getBody().output2) dataframe = current_data return dataframe ############################################################################################## # [해외선물옵션] 기본시세 > 해외선물 장운영시간 [해외선물-030] # 해외선물 장운영시간 API입니다. # 한국투자 HTS(eFriend Force) > [6773] 해외선물 장운영시간 화면 의 기능을 API로 개발한 사항으로, 해당 화면을 참고하시면 기능을 이해하기 쉽습니다. ############################################################################################## def get_overseas_fuopt_market_time(clas="", excg="CME", opt="%", tr_cont="", FK100="", NK100="", dataframe=None): url = '/uapi/overseas-futureoption/v1/quotations/market-time' tr_id = "OTFM2229R" # 해외선물 장운영시간 t_cnt = 0 params = { "FM_PDGR_CD": "", # 상품군코드 "" "FM_CLAS_CD": clas, # 클래스코드 공백(전체), 001(통화), 002(금리), 003(지수), 004(농산물),005(축산물),006(금속),007(에너지) "FM_EXCG_CD": excg, # 거래소코드 CME(CME), EUREX(EUREX), HKEx(HKEx), ICE(ICE), SGX(SGX), OSE(OSE), ASX(ASX), # CBOE(CBOE), MDEX(MDEX), NYSE(NYSE),BMF(BMF),FTX(FTX), HNX(HNX), ETC(기타)' "OPT_YN": opt, # 옵션여부 %(전체), N(선물), Y(옵션) "CTX_AREA_FK200": FK100, # 공란 : 최초 조회시 이전 조회 Output CTX_AREA_FK100 값 : 다음페이지 조회시(2번째부터) "CTX_AREA_NK200": NK100 # 공란 : 최초 조회시 이전 조회 Output CTX_AREA_NK100 값 : 다음페이지 조회시(2번째부터) } res = kis._url_fetch(url, tr_id, tr_cont, params) # Assuming 'output' is a dictionary that you want to convert to a DataFrame # current_data = res.getBody().output # getBody() kis_auth.py 존재 current_data = pd.DataFrame(res.getBody().output) print(current_data) # Append to the existing DataFrame if it exists if dataframe is not None: dataframe = pd.concat([dataframe, current_data], ignore_index=True) # else: dataframe = current_data.loc[current_data.fm_pdgr_cd != ""] # 상품군코드(fm_pdgr_cd) 값이 없는 경우 제외 tr_cont, FK100, NK100 = res.getHeader().tr_cont, res.getBody().ctx_area_fk200, res.getBody().ctx_area_nk200 # 페이징 처리 getHeader(), getBody() kis_auth.py 존재 # print(tr_cont, FK100, NK100) if tr_cont == "D" or tr_cont == "E": # 마지막 페이지 print("The End") current_data = pd.DataFrame(dataframe) cnt = current_data.count() # Initialize t_cnt if not already initialized try: t_cnt += cnt except NameError: t_cnt = cnt if t_cnt.empty: print("잔고내역 없음") else: print("잔고내역 있음") dataframe = current_data return dataframe elif tr_cont == "F" or tr_cont == "M": # 다음 페이지 존재하는 경우 자기 호출 처리 print('Call Next') time.sleep(0.1) # 시스템 안정적 운영을 위하여 반드시 지연 time 필요 return get_overseas_fuopt_market_time(clas, excg, opt, "N", FK100, NK100, dataframe) ############################################################################################## # [해외선물옵션] 기본시세 > 해외선물 미결제추이 [해외선물-029] # 해외선물 미결제추이 API입니다. # 한국투자 HTS(eFriend Force) > [5503] 해외선물 미결제약정추이 화면 의 기능을 API로 개발한 사항으로, 해당 화면을 참고하시면 기능을 이해하기 쉽습니다. # # ※ 해외선물 투자자별 미결제약정 추이 자료설명 # 1. 해외선물 투자자별 미결제약정 자료는 미국상품선물위원회(CFTC)에서 매주 1회 발표하고 있습니다. # 2. 기준일은 매주 화요일이며, 발표는 매주 금요일 15:30 (미국동부표준시)에 하며, 당사는 매주 토요일 아침에 자료를 업데이트하고 있습니다. # 3. 활용방법 : CFTC에서 발표하는 미결제약점 동향자료는 각 선물시장의 투기자금 동향을 파약하는데 용이하며, 특히, 상품시장에서 유용하게 활용할 수 있습니다. # 4. 주요항목 설명 # . 투기거래자 : 실물보유 또는 보유중인 실물에 대한 헤지목적이 아닌 가격변동에 따른 이익을 목적으로 거래하는 고객으로 주로 투자은행, 자산운용사, 헤지펀드, 개인투자자등임 # . 헤지거래자 : 실물보유 또는 보유중인 실물에 대한 헤지목적으로 거래하는 고객으로 주로 일반기업, 생산업체, 원자재공급업체등임. # . 보고누락분 : 시장전체 미결제약정과 투기거래자와 헤지거래자 보고분 합계와의 차이로 투자주제가 확인안된 거래임. # . 투자자 : 최종거래고객 기준이 아닌 거래소 회원 단위 기준임. # 5. CFTC 홈페이지: http://www.cftc.gov/index.htm ############################################################################################## def get_overseas_fuopt_investor_unpd_trend(iscd="CL", dt="", kbn="", ctskey="", tr_cont="", dataframe=None): url = '/uapi/overseas-futureoption/v1/quotations/investor-unpd-trend' tr_id = "HHDDB95030000" # 해외선물 상품기본정보 params = { "PROD_ISCD": iscd, # 상품 (GE, ZB, ZF,ZN,ZT), 금속(GC, PA, PL,SI, HG), # 농산물(CC, CT,KC, OJ, SB, ZC,ZL, ZM, ZO, ZR, ZS, ZW), # 에너지(CL, HO, NG, WBS), 지수(ES, NQ, TF, YM, VX), # 축산물(GF, HE, LE), 통화(6A, 6B, 6C, 6E, 6J, 6N, 6S, DX) "BSOP_DATE": dt, # 일자 기준일(ex)20240513) "UPMU_GUBUN": kbn, # 구분 0(수량), 1(증감) "CTS_KEY": ctskey # "" 사용안함 } res = kis._url_fetch(url, tr_id, tr_cont, params) # Assuming 'output' is a dictionary that you want to convert to a DataFrame current_data = pd.DataFrame(res.getBody().output2) dataframe = current_data return dataframe ############################################################################################## # [해외선물옵션] 기본시세 > 해외옵션 호가 [해외선물-033] # 해외옵션 호가 API입니다. # 한국투자 HTS(eFriend Force) > [5501] 해외선물옵션 현재가 화면 의 "왼쪽 상단 현재가" 기능을 API로 개발한 사항으로, 해당 화면을 참고하시면 기능을 이해하기 쉽습니다. ############################################################################################## def get_overseas_fuopt_opt_asking_price(dv="01", itm_no="", tr_cont="", dataframe=None): url = '/uapi/overseas-futureoption/v1/quotations/opt-asking-price' tr_id = "HHDFO86000000" # 해외옵션 호가 params = { "SRS_CD": itm_no # 종목코드 예)OESM24 C5340 } res = kis._url_fetch(url, tr_id, tr_cont, params) # Assuming 'output' is a dictionary that you want to convert to a DataFrame if dv == "01": current_data = pd.DataFrame(res.getBody().output1, index=[0]) else : current_data = pd.DataFrame(res.getBody().output2) dataframe = current_data return dataframe