# -*- 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] ############################################################################################## # Input: None (Option) 상세 Input값 변경이 필요한 경우 API문서 참조 # Output: DataFrame (Option) output API 문서 참조 등 def get_order_cash(ord_dv="", itm_no="", qty=0, unpr=0, tr_cont="", FK100="", NK100="", dataframe=None): # 국내주식주문 > 주식주문(현금) url = '/uapi/domestic-stock/v1/trading/order-cash' if ord_dv == "buy": tr_id = "TTTC0802U" # 주식 현금 매수 주문 [모의투자] VTTC0802U : 주식 현금 매수 주문 elif ord_dv == "sell": tr_id = "TTTC0801U" # 주식 현금 매도 주문 [모의투자] VTTC0801U : 주식 현금 매도 주문 else: print("매수현금/매도현금 구분 확인요망!!!") return None if itm_no == "": print("주문종목번호 확인요망!!!") return None if qty == 0: print("주문수량 확인요망!!!") return None if unpr == 0: print("주문단가 확인요망!!!") return None params = { "CANO": kis.getTREnv().my_acct, # 종합계좌번호 8자리 "ACNT_PRDT_CD": kis.getTREnv().my_prod, # 계좌상품코드 2자리 "PDNO": itm_no, # 종목코드(6자리) ETN의 경우, Q로 시작 (EX. Q500001) "ORD_DVSN": "00", # 주문구분 00:지정가, 01:시장가, 02:조건부지정가 나머지주문구분 API 문서 참조 "ORD_QTY": str(int(qty)), # 주문주식수 "ORD_UNPR": str(int(unpr)) # 주문단가 } 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_국내주식-003] ############################################################################################## # Input: None (Option) 상세 Input값 변경이 필요한 경우 API문서 참조 # Output: DataFrame (Option) output API 문서 참조 등 def get_order_rvsecncl(ord_orgno="", orgn_odno="", ord_dvsn="", rvse_cncl_dvsn_cd="", ord_qty=0, ord_unpr=0, qty_all_ord_yn="", tr_cont="", dataframe=None): # 국내주식주문 > 주식주문(정정취소) url = '/uapi/domestic-stock/v1/trading/order-rvsecncl' tr_id = "TTTC0803U" # 주식 정정 취소 주문 [모의투자] VTTC0803U : 주식 정정 취소 주문 if ord_orgno == "": print("주문조직번호 확인요망!!!") return None if orgn_odno == "": print("원주문번호 확인요망!!!") return None if ord_dvsn == "": print("주문구분 확인요망!!!") return None if not rvse_cncl_dvsn_cd in ["01","02"]: print("정정취소구분코드 확인요망!!!") # 정정:01. 취소:02 return None if qty_all_ord_yn == "Y" and ord_qty > 0: print("잔량전부 취소/정정주문인 경우 주문수량 0 처리!!!") ord_qty = 0 if qty_all_ord_yn == "N" and ord_qty == 0: print("취소/정정 수량 확인요망!!!") return None if rvse_cncl_dvsn_cd == "01" and ord_unpr == 0: print("주문단가 확인요망!!!") return None params = { "CANO": kis.getTREnv().my_acct, # 종합계좌번호 8자리 "ACNT_PRDT_CD": kis.getTREnv().my_prod, # 계좌상품코드 2자리 "KRX_FWDG_ORD_ORGNO": ord_orgno, # 주문조직번호 API output의 odno(주문번호) 값 입력주문시 한국투자증권 시스템에서 채번된 주문조직번호 "ORGN_ODNO": orgn_odno, # 주식일별주문체결조회 API output의 odno(주문번호) 값 입력주문시 한국투자증권 시스템에서 채번된 주문번호 "ORD_DVSN": ord_dvsn, # 주문구분 00:지정가, 01:시장가, 02:조건부지정가 나머지주문구분 API 문서 참조 "RVSE_CNCL_DVSN_CD": rvse_cncl_dvsn_cd, # 정정 : 01, 취소 : 02 "ORD_QTY": str(int(ord_qty)), # 주문주식수 [잔량전부 취소/정정주문] "0" 설정 ( QTY_ALL_ORD_YN=Y 설정 ) [잔량일부 취소/정정주문] 취소/정정 수량 "ORD_UNPR": str(int(ord_unpr)), # 주문단가 [정정] 정정주문 1주당 가격 [취소] "0" 설정 "QTY_ALL_ORD_YN": qty_all_ord_yn # 잔량전부주문여부 [정정/취소] Y : 잔량전부, 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_inquire_psbl_rvsecncl_lst(tr_cont="", FK100="", NK100="", dataframe=None): # 국내주식주문 > 주식정정취소가능주문조회 url = '/uapi/domestic-stock/v1/trading/inquire-psbl-rvsecncl' tr_id = "TTTC8036R" params = { "CANO": kis.getTREnv().my_acct, # 종합계좌번호 8자리 "ACNT_PRDT_CD": kis.getTREnv().my_prod, # 계좌상품코드 2자리 "INQR_DVSN_1": "1", # 조회구분1(정렬순서) 0:조회순서, 1:주문순, 2:종목순 "INQR_DVSN_2": "0", # 조회구분2 0:전체, 1:매도, 2:매수 "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 'output2' 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) dataframe = current_data return dataframe elif tr_cont == "F" or tr_cont == "M": # 다음 페이지 존재하는 경우 자기 호출 처리 print('Call Next') time.sleep(0.1) # 시스템 안정적 운영을 위하여 반드시 지연 time 필요 return get_inquire_psbl_rvsecncl_lst("N", FK100, NK100, dataframe) ############################################################################################## # [국내주식] 주문/계좌 > 주식일별주문체결조회 ############################################################################################## # 국내주식주문 > 주식일별주문체결조회 Object를 DataFrame 으로 반환 # Input: None (Option) 상세 Input값 변경이 필요한 경우 API문서 참조 # dv 기간구분 - 01:3개월 이내(TTTC8001R), 02:3개월 이전(CTSC9115R) # Output: DataFrame (Option) output2 API 문서 참조 등 def get_inquire_daily_ccld_obj(dv="01", inqr_strt_dt=None, inqr_end_dt=None, tr_cont="", FK100="", NK100="", dataframe=None): # 국내주식주문 > 주식일별주문체결조회 url = '/uapi/domestic-stock/v1/trading/inquire-daily-ccld' if dv == "01": tr_id = "TTTC8001R" # 01:3개월 이내 국내주식체결내역 (월단위 ex: 2024.04.25 이면 2024.01월~04월조회) else: tr_id = "CTSC9115R" # 02:3개월 이전 국내주식체결내역 (월단위 ex: 2024.04.25 이면 2024.01월이전) if inqr_strt_dt is None: inqr_strt_dt = datetime.today().strftime("%Y%m%d") # 시작일자 값이 없으면 현재일자 if inqr_end_dt is None: inqr_end_dt = datetime.today().strftime("%Y%m%d") # 종료일자 값이 없으면 현재일자 params = { "CANO": kis.getTREnv().my_acct, # 종합계좌번호 8자리 "ACNT_PRDT_CD": kis.getTREnv().my_prod, # 계좌상품코드 2자리 "INQR_STRT_DT": inqr_strt_dt, # 조회시작일자 "INQR_END_DT": inqr_end_dt, # 조회종료일자 "SLL_BUY_DVSN_CD": "00", # 매도매수구분코드 00:전체 01:매도, 02:매수 "INQR_DVSN": "01", # 조회구분(정렬순서) 00:역순, 01:정순 "PDNO": "", # 종목번호(6자리) "CCLD_DVSN": "00", # 체결구분 00:전체, 01:체결, 02:미체결 "ORD_GNO_BRNO": "", # 사용안함 "ODNO": "", # 주문번호 "INQR_DVSN_3": "00", # 조회구분3 00:전체, 01:현금, 02:융자, 03:대출, 04:대주 "INQR_DVSN_1": "0", # 조회구분1 공란 : 전체, 1 : ELW, 2 : 프리보드 "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 'output2' is a dictionary that you want to convert to a DataFrame current_data = pd.DataFrame(res.getBody().output2, index=[0]) dataframe = current_data return dataframe # 주식일별주문체결조회 종목별 List를 DataFrame 으로 반환 # Input: None (Option) 상세 Input값 변경이 필요한 경우 API문서 참조 # dv 기간구분 - 01:3개월 이내(TTTC8001R), 02:3개월 이전(CTSC9115R) # Output: DataFrame (Option) output1 API 문서 참조 등 def get_inquire_daily_ccld_lst(dv="01", inqr_strt_dt="", inqr_end_dt="", tr_cont="", FK100="", NK100="", dataframe=None): # 국내주식주문 > 주식일별주문체결조회 url = '/uapi/domestic-stock/v1/trading/inquire-daily-ccld' if dv == "01": tr_id = "TTTC8001R" # 01:3개월 이내 국내주식체결내역 (월단위 ex: 2024.04.25 이면 2024.01월~04월조회) else: tr_id = "CTSC9115R" # 02:3개월 이전 국내주식체결내역 (월단위 ex: 2024.04.25 이면 2024.01월이전) if inqr_strt_dt == "": inqr_strt_dt = datetime.today().strftime("%Y%m%d") # 시작일자 값이 없으면 현재일자 if inqr_end_dt == "": inqr_end_dt = datetime.today().strftime("%Y%m%d") # 종료일자 값이 없으면 현재일자 params = { "CANO": kis.getTREnv().my_acct, # 종합계좌번호 8자리 "ACNT_PRDT_CD": kis.getTREnv().my_prod, # 계좌상품코드 2자리 "INQR_STRT_DT": inqr_strt_dt, # 조회시작일자 "INQR_END_DT": inqr_end_dt, # 조회종료일자 "SLL_BUY_DVSN_CD": "00", # 매도매수구분코드 00:전체 01:매도, 02:매수 "INQR_DVSN": "01", # 조회구분(정렬순서) 00:역순, 01:정순 "PDNO": "", # 종목번호(6자리) "CCLD_DVSN": "00", #체결구분 00:전체, 01:체결, 02:미체결 "ORD_GNO_BRNO": "", # 사용안함 "ODNO": "", #주문번호 "INQR_DVSN_3": "00", # 조회구분3 00:전체, 01:현금, 02:융자, 03:대출, 04:대주 "INQR_DVSN_1": "", # 조회구분1 공란 : 전체, 1 : ELW, 2 : 프리보드 "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) # API 호출, kis_auth.py에 존재 # Assuming 'output1' 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, FK100, NK100 = res.getHeader().tr_cont, res.getBody().ctx_area_fk100, res.getBody().ctx_area_nk100 # 페이징 처리 getHeader(), getBody() kis_auth.py 존재 # print(dv, tr_cont, FK100, NK100) if tr_cont == "D" or tr_cont == "E": # 마지막 페이지 print("The End") return dataframe elif tr_cont == "F" or tr_cont == "M": # 다음 페이지 존재하는 경우 자기 호출 처리 print('Call Next') time.sleep(0.1) # 시스템 안정적 운영을 위하여 반드시 지연 time 필요 return get_inquire_daily_ccld_lst(dv, inqr_strt_dt, inqr_end_dt, "N", FK100, NK100, dataframe) ############################################################################################## # [국내주식] 주문/계좌 > 주식잔고조회(현재잔고) ############################################################################################## # 주식계좌잔고 Object를 DataFrame 으로 반환 # Input: None (Option) 상세 Input값 변경이 필요한 경우 API문서 참조 # Output: DataFrame (Option) output2 - 예수금총금액, 익일정산금액, 가수도정산금액, 전일매수금액, 금일매수금액, 총평가금액... 등 def get_inquire_balance_obj(tr_cont="", FK100="", NK100="", dataframe=None): # 국내주식주문 > 주식잔고조회(현재잔고) url = '/uapi/domestic-stock/v1/trading/inquire-balance' tr_id = "TTTC8434R" params = { "CANO": kis.getTREnv().my_acct, # 종합계좌번호 8자리 "ACNT_PRDT_CD": kis.getTREnv().my_prod, # 계좌상품코드 2자리 "AFHR_FLPR_YN": "N", # 시간외단일가여부 Y:시간외단일가 "OFL_YN": "", #오프라인여부 사용안함 "INQR_DVSN": "00", # 00 : 전체 "UNPR_DVSN": "01", # 단가구분 01:기본값 "FUND_STTL_ICLD_YN": "N", # 펀드결제분포함여부 N:포함하지않음 "FNCG_AMT_AUTO_RDPT_YN": "N", "PRCS_DVSN": "00", # 00 : 전일매매포함, 01 : 전일매매미포함 #"COST_ICLD_YN": "N", "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 'output2' is a dictionary that you want to convert to a DataFrame current_data = pd.DataFrame(res.getBody().output2) # getBody() kis_auth.py 존재 dataframe = current_data return dataframe # 주식계좌잔고 종목별 List를 DataFrame 으로 반환 # Input: None (Option) 상세 Input값 변경이 필요한 경우 API문서 참조 # Output: DataFrame (Option) output2 - 종목번호, 상품명(종목명), 매매구분명(매수매도구분), 전일매수수량 ... 등 def get_inquire_balance_lst(tr_cont="", FK100="", NK100="", dataframe=None): # 국내주식주문 > 주식잔고조회(현재종목별 잔고) url = '/uapi/domestic-stock/v1/trading/inquire-balance' tr_id = "TTTC8434R" params = { "CANO": kis.getTREnv().my_acct, # 종합계좌번호 8자리 "ACNT_PRDT_CD": kis.getTREnv().my_prod, # 계좌상품코드 2자리 "AFHR_FLPR_YN": "N", # 시간외단일가여부 Y:시간외단일가 "OFL_YN": "", #오프라인여부 사용안함 "INQR_DVSN": "00", # 00 : 전체 "UNPR_DVSN": "01", # 단가구분 01:기본값 "FUND_STTL_ICLD_YN": "N", # 펀드결제분포함여부 N:포함하지않음 "FNCG_AMT_AUTO_RDPT_YN": "N", "PRCS_DVSN": "00", # 00 : 전일매매포함, 01 : 전일매매미포함 #"COST_ICLD_YN": "N", "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) # API 호출, kis_auth.py에 존재 # Assuming 'output1' 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, 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") return dataframe elif tr_cont == "F" or tr_cont == "M": # 다음 페이지 존재하는 경우 자기 호출 처리 print('Call Next') time.sleep(0.1) # 시스템 안정적 운영을 위하여 반드시 지연 time 필요 return get_inquire_balance_lst("N", FK100, NK100, dataframe) ############################################################################################## # [국내주식] 주문/계좌 > 매수가능조회 ############################################################################################## # 국내주식주문 > 매수가능조회[v1_국내주식-007] List를 DataFrame 으로 반환 # Input: None (Option) 상세 Input값 변경이 필요한 경우 API문서 참조 # Output: DataFrame (Option) output2 - def get_inquire_psbl_order(pdno="", ord_unpr=0, tr_cont="", FK100="", NK100="", dataframe=None): # 국내주식주문 > 매수가능조회 url = '/uapi/domestic-stock/v1/trading/inquire-psbl-order' tr_id = "TTTC8908R" params = { "CANO": kis.getTREnv().my_acct, # 종합계좌번호 8자리 "ACNT_PRDT_CD": kis.getTREnv().my_prod, # 계좌상품코드 2자리 "PDNO": pdno, # 상품번호 "ORD_UNPR": ord_unpr, # 주문단가 1주당 가격 ※ 시장가(ORD_DVSN:01)로 조회 시, 공란으로 입력 "ORD_DVSN": "00", # 주문구분 공란 시, 매수수량 없이 매수금액만 조회됨 00 : 지정가,01 : 시장가,02 : 조건부지정가,03 : 최유리지정가 "CMA_EVLU_AMT_ICLD_YN": "N", # CMA평가금액포함여부 Y : 포함, N : 포함하지 않음 "OVRS_ICLD_YN": "Y" # 해외포함여부 Y : 포함, N : 포함하지 않음 } res = kis._url_fetch(url, tr_id, tr_cont, params) # API 호출, kis_auth.py에 존재 # print(res.getBody()) if res.isOK(): # API 응답의 output 속성이 스칼라 값인지 확인 output_data = res.getBody().output if not isinstance(output_data, list): # 스칼라 값이면 리스트로 감싸서 반환 output_data = [output_data] # DataFrame 생성 시 index 매개변수를 추가하여 스칼라 값일 경우 처리 # tdf = pd.DataFrame(output_data, index=[0]) #cf1 = ['ord_psbl_cash', 'ruse_psbl_amt', 'fund_rpch_chgs', 'psbl_qty_calc_unpr', 'nrcvb_buy_amt', 'nrcvb_buy_qty', 'max_buy_amt', 'max_buy_qty', 'cma_evlu_amt', 'ovrs_re_use_amt_wcrc', 'ord_psbl_frcr_amt_wcrc'] #cf2 = ['주문가능현금', '주문가능대용', '재사용가능금액', '펀드환매대금', '가능수량계산단가', '미수없는매수금액', '미수없는매수수량', '최대매수금액', '최대매수수량', 'CMA평가금액', '해외재사용금액원화', '주문가능외화금액원화'] #tdf = tdf[cf1] #ren_dict = dict(zip(cf1, cf2)) # return tdf.rename(columns=ren_dict) # DataFrame 생성 시 index 매개변수를 추가하여 스칼라 값일 경우 처리 current_data = pd.DataFrame(output_data, index=[0]) return current_data else: res.printError() return pd.DataFrame() ############################################################################################## # [국내주식] 주문/계좌 > 주식예약주문[v1_국내주식-017] ############################################################################################## # Input: None (Option) 상세 Input값 변경이 필요한 경우 API문서 참조 # Output: DataFrame (Option) output API 문서 참조 등 def get_order_resv(ord_dv="", itm_no="", qty=0, unpr=0, ord_dvsn_cd="", tr_cont="", FK100="", NK100="", dataframe=None): # 국내주식주문 > 주식주문(현금) url = '/uapi/domestic-stock/v1/trading/order-resv' tr_id = "CTSC0008U" # 국내예약매수입력, 주문예약매도입력 if ord_dv == "buy": sll_buy_dvsn_cd = "02" # 주식 예약 매수 주문 elif ord_dv == "sell": sll_buy_dvsn_cd = "01" # 주식 예약 매도 주문 else: print("매도매수구분코드 확인요망!!!") return None if itm_no == "": print("주문종목번호 확인요망!!!") return None if qty == 0: print("주문수량 확인요망!!!") return None if unpr == 0: print("주문단가 확인요망!!!") return None if ord_dvsn_cd == "": print("주문구분코드 확인요망!!!") return None if unpr == 0: print("주문단가 확인요망!!!") return None ord_objt_cbcl_dvsn_cd = "10" # [매도매수구분코드 01:매도/02:매수시 사용] 10 : 현금 이 아닌경우는 API문서 참조 params = { "CANO": kis.getTREnv().my_acct, # 종합계좌번호 8자리 "ACNT_PRDT_CD": kis.getTREnv().my_prod, # 계좌상품코드 2자리 "PDNO": itm_no, # 종목코드(6자리) ETN의 경우, Q로 시작 (EX. Q500001) "ORD_QTY": str(int(qty)), # 주문주식수 "ORD_UNPR": str(int(unpr)), # 주문단가 "SLL_BUY_DVSN_CD": sll_buy_dvsn_cd, # 매도매수구분코드 01 : 매도, 02 : 매수 "ORD_DVSN_CD": "00", # 주문구분 00:지정가, 01:시장가, 02:조건부지정가, 05 : 장전 시간외 "ORD_OBJT_CBLC_DVSN_CD": ord_objt_cbcl_dvsn_cd, # [매도매수구분코드 01:매도/02:매수시 사용] 10 : 현금 # [매도매수구분코드 01:매도시 사용] 12:주식담보대출, 14:대여상환, 21:자기융자신규, 22:유통대주신규, 23:유통융자신규, # 24:자기대주신규, 25:자기융자상환, 26:유통대주상환, 27:유통융자상환, 28:자기대주상환 "RSVN_ORD_END_DT": "" # 예약주문종료일자 * (YYYYMMDD) 현재 일자보다 이후로 설정해야 함 # * RSVN_ORD_END_DT(예약주문종료일자)를 안 넣으면 다음날 주문처리되고 예약주문은 종료됨 # * RSVN_ORD_END_DT(예약주문종료일자)는 익영업일부터 달력일 기준으로 공휴일 포함하여 최대 30일이 되는 일자까지 입력 가능 } res = kis._url_fetch(url, tr_id, tr_cont, params, postFlag=True) if str(res.getBody().rt_cd) == "0": current_data = res.getBody().output # getBody() kis_auth.py 존재 dataframe = current_data else: print(res.getBody().msg_cd + "," + res.getBody().msg1) #print(res.getErrorCode() + "," + res.getErrorMessage()) dataframe = None return dataframe ############################################################################################## # [국내주식] 주문/계좌 > 주식예약주문취소[v1_국내주식-018,019] ############################################################################################## # Input: None (Option) 상세 Input값 변경이 필요한 경우 API문서 참조 # Output: DataFrame (Option) output API 문서 참조 등 def get_order_resv_cncl(rsvn_ord_seq="", tr_cont="", FK100="", NK100="", dataframe=None): # [국내주식] 주문/계좌 > 주식예약주문취소 url = '/uapi/domestic-stock/v1/trading/order-resv-rvsecncl' tr_id = "CTSC0009U" # 국내주식예약 취소주문 params = { "CANO": kis.getTREnv().my_acct, # 종합계좌번호 8자리 "ACNT_PRDT_CD": kis.getTREnv().my_prod, # 계좌상품코드 2자리 "RSVN_ORD_SEQ": str(int(rsvn_ord_seq)) # 예약주문순번 [정정/취소] } res = kis._url_fetch(url, tr_id, tr_cont, params, postFlag=True) if str(res.getBody().rt_cd) == "0": current_data = res.getBody().output # getBody() kis_auth.py 존재 dataframe = current_data else: print(res.getBody().msg_cd + "," + res.getBody().msg1) #print(res.getErrorCode() + "," + res.getErrorMessage()) dataframe = None return dataframe ############################################################################################## # [국내주식] 주문/계좌 > 주식예약주문정정[v1_국내주식-018,019] # get_order_resv_rvse(rsvn_ord_seq="", pdno="", ord_qty=0, ord_unpr=0, ord_dvsn="", sll_buy_dvsn_cd=""): # 국내주식주문 > 주식예약주문정정취소 ############################################################################################## # Input: None (Option) 상세 Input값 변경이 필요한 경우 API문서 참조 # Output: DataFrame (Option) output API 문서 참조 등 def get_order_resv_rvse(pdno="", ord_qty=0, ord_unpr=0, sll_buy_dvsn_cd="", ord_dvsn="", ord_objt_cblc_dvsn_cd="", rsvn_ord_seq="", rsvn_ord_orgno="", rsvn_ord_ord_dt="", tr_cont="", FK100="", NK100="", dataframe=None ): # 국내주식주문 > 주식예약주문정정취소 url = '/uapi/domestic-stock/v1/trading/order-resv-rvsecncl' tr_id = "CTSC0013U" # 국내주식예약정정주문 * 모의투자 사용 불가 if ord_qty == 0: print("주문주식수 확인요망!!!") # return None if ord_unpr == 0: print("주문단가 확인요망!!!") # 정정] 1주당 가격 * 장전 시간외, 시장가의 경우 1주당 가격을 공란으로 비우지 않음 "0"으로 입력 권고 return None if sll_buy_dvsn_cd == "": print("매수매도구분코드 확인요망!!!") # [정정] 01 : 매도 02 : 매수 return None if ord_dvsn == "": print("주문구분코드 확인요망!!!") # [정정] 00 : 지정가, 01 : 시장가, 02 : 조건부지정가, 05 : 장전 시간외 return None ord_objt_cblc_dvsn_cd = "10" # 주문대상잔고구분코드 기본값 10 : 현금으로 셋팅 #if ord_objt_cblc_dvsn_cd == "": # print("주문대상잔고구분코드!!!") # 10 : 현금, 12 : 주식담보대출, 14 : 대여상환, 21 : 자기융자신규 # return None if rsvn_ord_seq == "": print("예약주문번호 확인요망(rsvn_ord_seq)!!!") return None print(rsvn_ord_seq) params = { "CANO": kis.getTREnv().my_acct, # 종합계좌번호 8자리 "ACNT_PRDT_CD": kis.getTREnv().my_prod, # 계좌상품코드 2자리 "PDNO": pdno, # 종목코드(6자리) "ORD_QTY": str(int(ord_qty)), # 주문주식수 [잔량전부 취소/정정주문] "0" 설정 ( QTY_ALL_ORD_YN=Y 설정 ) [잔량일부 취소/정정주문] 취소/정정 수량 "ORD_UNPR": str(int(ord_unpr)), # 주문단가 [정정] 1주당 가격 * 장전 시간외, 시장가의 경우 1주당 가격을 공란으로 비우지 않음 "0"으로 입력 권고 "SLL_BUY_DVSN_CD": sll_buy_dvsn_cd, # 매도매수구분코드 [정정] 01 : 매도, 02 : 매수 "ORD_DVSN_CD": ord_dvsn, # 주문구분 [정정]00 : 지정가, 01 : 시장가, 02 : 조건부지정가, 05 : 장전 시간외 "ORD_OBJT_CBLC_DVSN_CD": ord_objt_cblc_dvsn_cd, # 주문대상잔고구분코드 [정정]10 : 현금, 12 : 주식담보대출, 14 : 대여상환, 21 : 자기융자신규 나머지는 API문서 참조 "LOAN_DT": "", # 대출일자 [정정] 입력필수아님 "RSVN_ORD_END_DT": "", # 예약주문종료일자 [정정] 입력필수아님 "CTAL_TLNO": "", # 연락전화번호 [정정] 입력필수아님 "RSVN_ORD_SEQ": str(int(rsvn_ord_seq)), # 예약주문순번 [정정/취소] 입력필수 "RSVN_ORD_ORGNO": "", # 예약주문조직번호 [정정/취소] 입력불필요 "RSVN_ORD_ORD_DT": "" # 예약주문주문일자 [정정/취소] 입력불필요 } res = kis._url_fetch(url, tr_id, tr_cont, params, postFlag=True) if str(res.getBody().rt_cd) == "0": current_data = res.getBody().output # getBody() kis_auth.py 존재 print(res.getBody().msg_cd + "," + res.getBody().msg1) dataframe = current_data else: print(res.getBody().msg_cd + "," + res.getBody().msg1) #print(res.getErrorCode() + "," + res.getErrorMessage()) dataframe = None return dataframe ############################################################################################## # [국내주식] 주문/계좌 > 주식예약주문조회[v1_국내주식-020] ############################################################################################## # [국내주식] 주문/계좌 > 주식예약주문조회[v1_국내주식-020] List를 DataFrame 으로 반환 # Input: None (Option) 상세 Input값 변경이 필요한 경우 API문서 참조 # Output: DataFrame (Option) output2 - def get_order_resv_ccnl(inqr_strt_dt=None, inqr_end_dt=None, ord_seq=0, tr_cont="", FK100="", NK100="", dataframe=None): # 국내주식주문 > 매수가능조회 url = '/uapi/domestic-stock/v1/trading/order-resv-ccnl' tr_id = "CTSC0004R" if inqr_strt_dt is None: inqr_strt_dt = datetime.today().strftime("%Y%m%d") # 시작일자 값이 없으면 현재일자 if inqr_end_dt is None: inqr_end_dt = datetime.today().strftime("%Y%m%d") # 종료일자 값이 없으면 현재일자 params = { "RSVN_ORD_ORD_DT": inqr_strt_dt, # 예약주문시작일자 "RSVN_ORD_END_DT": inqr_end_dt, # 예약주문종료일자 "RSVN_ORD_SEQ": ord_seq, # 예약주문순번 "TMNL_MDIA_KIND_CD": "00", # 단말매체종류코드 "CANO": kis.getTREnv().my_acct, # 종합계좌번호 8자리 "ACNT_PRDT_CD": kis.getTREnv().my_prod, # 계좌상품코드 2자리 "PRCS_DVSN_CD": "0", # 처리구분코드 "CNCL_YN": "", # 오프라인여부 사용안함 "PDNO": "", # 종목코드(6자리) (공백 입력 시 전체 조회) "SLL_BUY_DVSN_CD": "", # 매도매수구분코드 "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) # API 호출, kis_auth.py에 존재 # Assuming 'output1' is a dictionary that you want to convert to a DataFrame 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") return dataframe elif tr_cont == "F" or tr_cont == "M": # 다음 페이지 존재하는 경우 자기 호출 처리 print('Call Next') time.sleep(0.1) # 시스템 안정적 운영을 위하여 반드시 지연 time 필요 return get_order_resv_ccnl(inqr_strt_dt, inqr_end_dt, ord_seq, "N", FK100, NK100, dataframe) ############################################################################################## # [국내주식] 주문/계좌 > 주식잔고조회_실현손익 ############################################################################################## # 주식잔고조회_실현손익 object DataFrame 으로 반환 # Input: None (Option) 상세 Input값 변경이 필요한 경우 API문서 참조 # Output: DataFrame (Option) output2 - 종목번호(상품번호), 종목명(상품명), 매매구분명, 전일매수수량, 전일매도수량, 금일매수수량... 등 def get_inquire_balance_rlz_pl_obj(tr_cont="", FK100="", NK100="", dataframe=None): # [국내주식] 주문/계좌 > 주식잔고조회_실현손익 (잔고조회 Output2) url = '/uapi/domestic-stock/v1/trading/inquire-balance-rlz-pl' tr_id = "TTTC8494R" params = { "CANO": kis.getTREnv().my_acct, # 종합계좌번호 8자리 "ACNT_PRDT_CD": kis.getTREnv().my_prod, # 계좌상품코드 2자리 "AFHR_FLPR_YN": "N", # 시간외단일가여부 Y:시간외단일가 "OFL_YN": "", # 오프라인여부 사용안함 "INQR_DVSN": "00", # 00 : 전체 "UNPR_DVSN": "01", # 단가구분 01:기본값 "FUND_STTL_ICLD_YN": "N", # 펀드결제분포함여부 N:포함하지않음 "FNCG_AMT_AUTO_RDPT_YN": "N", "PRCS_DVSN": "00", # 00 : 전일매매포함, 01 : 전일매매미포함 "COST_ICLD_YN": "N", "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) print(res.getBody()) # 오류 원인 확인 필요시 사용 # Assuming 'Output2' is a dictionary that you want to convert to a DataFrame current_data = pd.DataFrame(res.getBody().output2) # getBody() kis_auth.py 존재 dataframe = current_data return dataframe # 주식잔고조회_실현손익 list DataFrame 으로 반환 # Input: None (Option) 상세 Input값 변경이 필요한 경우 API문서 참조 # Output: DataFrame (Option) output2 - 예수금총금액, 익일정산금액, 가수도정산금액, CMA평가금액, 전일매수금액, 금일매수금액 ... 등 def get_inquire_balance_rlz_pl_lst(tr_cont="", FK100="", NK100="", dataframe=None): # [국내주식] 주문/계좌 > 주식잔고조회_실현손익 (보유주식내역 Output2) url = '/uapi/domestic-stock/v1/trading/inquire-balance-rlz-pl' tr_id = "TTTC8494R" params = { "CANO": kis.getTREnv().my_acct, # 종합계좌번호 8자리 "ACNT_PRDT_CD": kis.getTREnv().my_prod, # 계좌상품코드 2자리 "AFHR_FLPR_YN": "N", # 시간외단일가여부 Y:시간외단일가 "OFL_YN": "", # 오프라인여부 사용안함 "INQR_DVSN": "00", # 00 : 전체 "UNPR_DVSN": "01", # 단가구분 01:기본값 "FUND_STTL_ICLD_YN": "N", # 펀드결제분포함여부 N:포함하지않음 "FNCG_AMT_AUTO_RDPT_YN": "N", "PRCS_DVSN": "00", # 00 : 전일매매포함, 01 : 전일매매미포함 "COST_ICLD_YN": "N", "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) # API 호출, kis_auth.py에 존재 # print(res.getBody()) # 오류 원인 확인 필요시 사용 # Assuming 'output1' 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, 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") return dataframe elif tr_cont == "F" or tr_cont == "M": # 다음 페이지 존재하는 경우 자기 호출 처리 print('Call Next') time.sleep(0.1) # 시스템 안정적 운영을 위하여 반드시 지연 time 필요 return get_inquire_balance_rlz_pl_lst("N", FK100, NK100, dataframe) ############################################################################################## # [국내주식] 주문/계좌 > 신용매수가능조회 ############################################################################################## # 신용매수가능조회 object DataFrame 으로 반환 # Input: None (Option) 상세 Input값 변경이 필요한 경우 API문서 참조 # Output: DataFrame (Option) output1 - 주문가능현금, 주문가능대용, 재사용가능금액, 펀드환매대금, 가능수량계산단가, 미수없는매수금액... 등 def get_inquire_credit_psamount(pdno="", ord_unpr ="", tr_cont="", FK100="", NK100="", dataframe=None): # [국내주식] 주문/계좌 > 신용매수가능조회 url = '/uapi/domestic-stock/v1/trading/inquire-credit-psamount' tr_id = "TTTC8909R" params = { "CANO": kis.getTREnv().my_acct, # 종합계좌번호 8자리 "ACNT_PRDT_CD": kis.getTREnv().my_prod, # 계좌상품코드 2자리 "PDNO": pdno, # 종목번호(상품번호) "ORD_UNPR": "", # 주문단가 1주당 가격 * 장전 시간외, 장후 시간외, 시장가의 경우 1주당 가격을 공란으로 비우지 않음 "0"으로 입력 권고 "ORD_DVSN": "00", # 주문구분 00: 지정가 "CRDT_TYPE": "21", # 신용유형 "":기본값 "CMA_EVLU_AMT_ICLD_YN": "N", # CMA평가금액포함여부 "OVRS_ICLD_YN": "N" # 펀드결제분포함여부 N:포함하지않음 } res = kis._url_fetch(url, tr_id, tr_cont, params) print(res.getBody()) # 오류 원인 확인 필요시 사용 # Assuming 'Output2' is a dictionary that you want to convert to a DataFrame current_data = pd.DataFrame(res.getBody().output1) # getBody() kis_auth.py 존재 dataframe = current_data return dataframe ############################################################################################## # [국내주식] 주문/계좌 > 기간별매매손익현황조회 ############################################################################################## # 기간별매매손익현황조회 object DataFrame 으로 반환 # Input: None (Option) 상세 Input값 변경이 필요한 경우 API문서 참조 # Output: DataFrame (Option) output2 - 매도수량합계, 매도거래금액합계, 매도수수료합계, 매도제세금합계, 매도정산금액합계, 매수수량합계... 등 def get_inquire_period_trade_profit_obj(inqr_strt_dt=None, inqr_end_dt=None, tr_cont="", FK100="", NK100="", dataframe=None): # [국내주식] 주문/계좌 > 기간별매매손익현황내역 (output2) url = '/uapi/domestic-stock/v1/trading/inquire-period-trade-profit' tr_id = "TTTC8715R" if inqr_strt_dt is None: inqr_strt_dt = datetime.today().strftime("%Y%m%d") # 시작일자 값이 없으면 현재일자 if inqr_end_dt is None: inqr_end_dt = datetime.today().strftime("%Y%m%d") # 종료일자 값이 없으면 현재일자 params = { "CANO": kis.getTREnv().my_acct, # 종합계좌번호 8자리 "ACNT_PRDT_CD": kis.getTREnv().my_prod, # 계좌상품코드 2자리 "SORT_DVSN": "00", # 정렬구분 "PDNO": "", # 상품번호 "INQR_STRT_DT": inqr_strt_dt, # 조회시작일자 "INQR_END_DT": inqr_end_dt, # 조회종료일자 "CBLC_DVSN": "00", # 잔고구분 "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) # print(res.getBody().output2) # 오류 원인 확인 필요시 사용 # Assuming 'Output2' is a dictionary that you want to convert to a DataFrame current_data = pd.DataFrame(res.getBody().output2, index=[0]) # getBody() kis_auth.py 존재 dataframe = current_data return dataframe # 기간별매매손익현황조회 object DataFrame 으로 반환 # Input: None (Option) 상세 Input값 변경이 필요한 경우 API문서 참조 # Output: DataFrame (Option) output1 - 매매일자, 상품번호, 상품명, 매매구분명, 대출일자, 보유수량... 등 def get_inquire_period_trade_profit_lst(inqr_strt_dt=None, inqr_end_dt=None, tr_cont="", FK100="", NK100="", dataframe=None): # [국내주식] 주문/계좌 > 기간별매매손익현황조회 (output1) url = '/uapi/domestic-stock/v1/trading/inquire-period-trade-profit' tr_id = "TTTC8715R" if inqr_strt_dt is None: inqr_strt_dt = datetime.today().strftime("%Y%m%d") # 시작일자 값이 없으면 현재일자 if inqr_end_dt is None: inqr_end_dt = datetime.today().strftime("%Y%m%d") # 종료일자 값이 없으면 현재일자 params = { "CANO": kis.getTREnv().my_acct, # 종합계좌번호 8자리 "ACNT_PRDT_CD": kis.getTREnv().my_prod, # 계좌상품코드 2자리 "SORT_DVSN": "00", # 정렬구분 "PDNO": "", # 상품번호 "INQR_STRT_DT": inqr_strt_dt, # 조회시작일자 "INQR_END_DT": inqr_end_dt, # 조회종료일자 "CBLC_DVSN": "00", # 잔고구분 "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) # API 호출, kis_auth.py에 존재 # Assuming 'output1' 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, 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") return dataframe elif tr_cont == "F" or tr_cont == "M": # 다음 페이지 존재하는 경우 자기 호출 처리 print('Call Next') time.sleep(0.1) # 시스템 안정적 운영을 위하여 반드시 지연 time 필요 return get_inquire_period_trade_profit_lst(inqr_strt_dt, inqr_end_dt, "N", FK100, NK100, dataframe) ############################################################################################## # [국내주식] 주문/계좌 > 기간별손익일별합산조회 ############################################################################################## # 기간별매매손익현황조회 object DataFrame 으로 반환 # Input: None (Option) 상세 Input값 변경이 필요한 경우 API문서 참조 # Output: DataFrame (Option) output2 - 매도수량합계, 매도거래금액합계, 매도수수료합계, 매도제세금합계, 매도정산금액합계, 매수수량합계... 등 def get_inquire_period_profit_obj(inqr_strt_dt=None, inqr_end_dt=None, tr_cont="", FK100="", NK100="", dataframe=None): # [국내주식] 주문/계좌 > 기간별손익일별합산조회 (output2) url = '/uapi/domestic-stock/v1/trading/inquire-period-profit' tr_id = "TTTC8708R" if inqr_strt_dt is None: inqr_strt_dt = datetime.today().strftime("%Y%m%d") # 시작일자 값이 없으면 현재일자 if inqr_end_dt is None: inqr_end_dt = datetime.today().strftime("%Y%m%d") # 종료일자 값이 없으면 현재일자 params = { "CANO": kis.getTREnv().my_acct, # 종합계좌번호 8자리 "ACNT_PRDT_CD": kis.getTREnv().my_prod, # 계좌상품코드 2자리 "INQR_DVSN": "00", # 조회구분 "SORT_DVSN": "00", # 정렬구분 "PDNO": "", # 상품번호 "INQR_STRT_DT": inqr_strt_dt, # 조회시작일자 "INQR_END_DT": inqr_end_dt, # 조회종료일자 "CBLC_DVSN": "00", # 잔고구분 "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) # print(res.getBody().output2) # 오류 원인 확인 필요시 사용 # Assuming 'Output2' is a dictionary that you want to convert to a DataFrame current_data = pd.DataFrame(res.getBody().output2, index=[0]) # getBody() kis_auth.py 존재 dataframe = current_data return dataframe # 기간별손익일별합산조회 object DataFrame 으로 반환 # Input: None (Option) 상세 Input값 변경이 필요한 경우 API문서 참조 # Output: DataFrame (Option) output1 - 매매일자, 상품번호, 상품명, 매매구분명, 대출일자, 보유수량... 등 def get_inquire_period_profit_lst(inqr_strt_dt=None, inqr_end_dt=None, tr_cont="", FK100="", NK100="", dataframe=None): # [국내주식] 주문/계좌 > 기간별손익일별합산조회 (output1) url = '/uapi/domestic-stock/v1/trading/inquire-period-profit' tr_id = "TTTC8708R" if inqr_strt_dt is None: inqr_strt_dt = datetime.today().strftime("%Y%m%d") # 시작일자 값이 없으면 현재일자 if inqr_end_dt is None: inqr_end_dt = datetime.today().strftime("%Y%m%d") # 종료일자 값이 없으면 현재일자 params = { "CANO": kis.getTREnv().my_acct, # 종합계좌번호 8자리 "ACNT_PRDT_CD": kis.getTREnv().my_prod, # 계좌상품코드 2자리 "INQR_DVSN": "00", # 조회구분 "SORT_DVSN": "00", # 정렬구분 "PDNO": "", # 상품번호 "INQR_STRT_DT": inqr_strt_dt, # 조회시작일자 "INQR_END_DT": inqr_end_dt, # 조회종료일자 "CBLC_DVSN": "00", # 잔고구분 "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) # API 호출, kis_auth.py에 존재 # Assuming 'output1' 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, 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") return dataframe elif tr_cont == "F" or tr_cont == "M": # 다음 페이지 존재하는 경우 자기 호출 처리 print('Call Next') time.sleep(0.1) # 시스템 안정적 운영을 위하여 반드시 지연 time 필요 return get_inquire_period_profit_lst(inqr_strt_dt, inqr_end_dt, "N", FK100, NK100, dataframe) #====| [국내주식] 기본시세 |============================================================================================================================ ############################################################################################## # [국내주식] 기본시세 > 주식현재가 시세 ############################################################################################## # 주식현재가 시세 Object를 DataFrame 으로 반환 # Input: None (Option) 상세 Input값 변경이 필요한 경우 API문서 참조 # Output: DataFrame (Option) output def get_inquire_price(div_code="J", itm_no="", tr_cont="", FK100="", NK100="", dataframe=None): # [국내주식] 기본시세 > 주식현재가 시세 url = '/uapi/domestic-stock/v1/quotations/inquire-price' tr_id = "FHKST01010100" # 주식현재가 시세 params = { "FID_COND_MRKT_DIV_CODE": div_code, # 시장 분류 코드 J : 주식/ETF/ETN, W: ELW "FID_INPUT_ISCD": itm_no # 종목번호 (6자리) ETN의 경우, Q로 시작 (EX. Q500001) } 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().output, index=[0]) # getBody() kis_auth.py 존재 dataframe = current_data return dataframe ############################################################################################## # [국내주식] 기본시세 > 주식현재가 체결 (최근체결 건 30건만 조회) ############################################################################################## # 주식현재가 체결 Object를 DataFrame 으로 반환 # Input: None (Option) 상세 Input값 변경이 필요한 경우 API문서 참조 # Output: DataFrame (Option) output def get_inquire_ccnl(div_code="J", itm_no="", tr_cont="", FK100="", NK100="", dataframe=None): # [국내주식] 기본시세 > 주식현재가 체결 url = '/uapi/domestic-stock/v1/quotations/inquire-ccnl' tr_id = "FHKST01010300" # 주식현재가 체결 params = { "FID_COND_MRKT_DIV_CODE": div_code, # 시장 분류 코드 J : 주식/ETF/ETN, W: ELW "FID_INPUT_ISCD": itm_no # 종목번호 (6자리) ETN의 경우, Q로 시작 (EX. Q500001) } res = kis._url_fetch(url, tr_id, tr_cont, params) # print(res.getBody()) # 오류 원인 확인 필요시 사용 # Assuming 'output' is a dictionary that you want to convert to a DataFrame current_data = pd.DataFrame(res.getBody().output) # getBody() kis_auth.py 존재 dataframe = current_data return dataframe ############################################################################################## # [국내주식] 기본시세 > 주식현재가 일자별 (최근 30일만 조회) # 주식현재가 일자별 API입니다. 일/주/월별 주가를 확인할 수 있으며 최근 30일(주,별)로 제한되어 있습니다. ############################################################################################## # 주식현재가 일자별 Object를 DataFrame 으로 반환 # Input: None (Option) 상세 Input값 변경이 필요한 경우 API문서 참조 # Output: DataFrame (Option) output def get_inquire_daily_price(div_code="J", itm_no="", period_code="D", adj_prc_code="1", tr_cont="", FK100="", NK100="", dataframe=None): # [국내주식] 기본시세 > 주식현재가 일자별 url = '/uapi/domestic-stock/v1/quotations/inquire-daily-price' tr_id = "FHKST01010400" # 주식현재가 일자별 params = { "FID_COND_MRKT_DIV_CODE": div_code, # 시장 분류 코드 J : 주식/ETF/ETN, W: ELW "FID_INPUT_ISCD": itm_no, # 종목번호 (6자리) ETN의 경우, Q로 시작 (EX. Q500001) "FID_PERIOD_DIV_CODE": period_code, # 기간분류코드 D : (일)최근 30거래일, W : (주)최근 30주, M : (월)최근 30개월 "FID_ORG_ADJ_PRC": adj_prc_code # 0 : 수정주가반영, 1 : 수정주가미반영 * 수정주가는 액면분할/액면병합 등 권리 발생 시 과거 시세를 현재 주가에 맞게 보정한 가격 } res = kis._url_fetch(url, tr_id, tr_cont, params) # print(res.getBody()) # 오류 원인 확인 필요시 사용 # Assuming 'output' is a dictionary that you want to convert to a DataFrame current_data = pd.DataFrame(res.getBody().output) # getBody() kis_auth.py 존재 dataframe = current_data return dataframe ############################################################################################## # [국내주식] 기본시세 > 주식현재가 호가/예상체결 # 주식현재가 호가 예상체결 API입니다. 매수 매도 호가를 확인하실 수 있습니다. 실시간 데이터를 원하신다면 웹소켓 API를 활용하세요. ############################################################################################## # 주식현재가 일자별 Object를 DataFrame 으로 반환 # Input: None (Option) 상세 Input값 변경이 필요한 경우 API문서 참조 # Output: DataFrame (Option) output def get_inquire_asking_price_exp_ccn(output_dv='1', div_code="J", itm_no="", tr_cont="", FK100="", NK100="", dataframe=None): # [국내주식] 기본시세 > 주식현재가 호가/예상체결 url = '/uapi/domestic-stock/v1/quotations/inquire-asking-price-exp-ccn' tr_id = "FHKST01010200" # 주식현재가 호가 예상체결 params = { "FID_COND_MRKT_DIV_CODE": div_code, # 시장 분류 코드 J : 주식/ETF/ETN, W: ELW "FID_INPUT_ISCD": itm_no # 종목번호 (6자리) ETN의 경우, Q로 시작 (EX. Q500001) } res = kis._url_fetch(url, tr_id, tr_cont, params) # print(res.getBody()) # 오류 원인 확인 필요시 사용 # Assuming 'output1' is a dictionary that you want to convert to a DataFrame if output_dv == "1": current_data = pd.DataFrame(res.getBody().output1, index=[0]) # 호가조회 * getBody() kis_auth.py 존재 else: current_data = pd.DataFrame(res.getBody().output2, index=[0]) # 예상체결가조회 dataframe = current_data return dataframe ############################################################################################## # [국내주식] 기본시세 > 주식현재가 투자자 (최근 30일 조회) # 주식현재가 투자자 API입니다. 개인, 외국인, 기관 등 투자 정보를 확인할 수 있습니다. # # [유의사항] # - 외국인은 외국인(외국인투자등록 고유번호가 있는 경우)+기타 외국인을 지칭합니다. # - 당일 데이터는 장 종료 후 제공됩니다. ############################################################################################## # 주식현재가 투자자 Object를 DataFrame 으로 반환 # Input: None (Option) 상세 Input값 변경이 필요한 경우 API문서 참조 # Output: DataFrame (Option) output def get_inquire_investor(div_code="J", itm_no="", tr_cont="", FK100="", NK100="", dataframe=None): # [국내주식] 기본시세 > 주식현재가 투자자 url = '/uapi/domestic-stock/v1/quotations/inquire-investor' tr_id = "FHKST01010900" # 주식현재가 투자자 params = { "FID_COND_MRKT_DIV_CODE": div_code, # 시장 분류 코드 J : 주식/ETF/ETN, W: ELW "FID_INPUT_ISCD": itm_no # 종목번호 (6자리) ETN의 경우, Q로 시작 (EX. Q500001) } res = kis._url_fetch(url, tr_id, tr_cont, params) # print(res.getBody()) # 오류 원인 확인 필요시 사용 # Assuming 'output' is a dictionary that you want to convert to a DataFrame current_data = pd.DataFrame(res.getBody().output) # 호가조회 * getBody() kis_auth.py 존재 # @참고 전일대비 부호(prdy_vrss_sign) 1 : 상한, 2 : 상승, 3 : 보합, 4 : 하한, 5 : 하락 dataframe = current_data return dataframe ############################################################################################## # [국내주식] 기본시세 > 주식현재가 회원사 # 주식 현재가 회원사 API입니다. 회원사의 투자 정보를 확인할 수 있습니다.. ############################################################################################## # 주식현재가 회원사 Object를 DataFrame 으로 반환 # Input: None (Option) 상세 Input값 변경이 필요한 경우 API문서 참조 # Output: DataFrame (Option) output def get_inquire_member(div_code="J", itm_no="", tr_cont="", FK100="", NK100="", dataframe=None): # [국내주식] 기본시세 > 주식현재가 회원사 url = '/uapi/domestic-stock/v1/quotations/inquire-member' tr_id = "FHKST01010600" # 주식현재가 회원사 params = { "FID_COND_MRKT_DIV_CODE": div_code, # 시장 분류 코드 J : 주식/ETF/ETN, W: ELW "FID_INPUT_ISCD": itm_no # 종목번호 (6자리) ETN의 경우, Q로 시작 (EX. Q500001) } res = kis._url_fetch(url, tr_id, tr_cont, params) # print(res.getBody()) # 오류 원인 확인 필요시 사용 # Assuming 'output' is a dictionary that you want to convert to a DataFrame current_data = pd.DataFrame(res.getBody().output, index=[0]) # 호가조회 * getBody() kis_auth.py 존재 dataframe = current_data return dataframe ############################################################################################## # [국내주식] 기본시세 > 국내주식기간별시세(일/주/월/년) # 국내주식기간별시세(일/주/월/년) API입니다. # 실전계좌/모의계좌의 경우, 한 번의 호출에 최대 100건까지 확인 가능합니다. ############################################################################################## # 국내주식기간별시세(일/주/월/년) Object를 DataFrame 으로 반환 # Input: None (Option) 상세 Input값 변경이 필요한 경우 API문서 참조 # Output: DataFrame (Option) output def get_inquire_daily_itemchartprice(div_code="J", itm_no="", tr_cont="", inqr_strt_dt=None, inqr_end_dt=None, period_code="D", adj_prc="1", FK100="", NK100="", dataframe=None): # [국내주식] 기본시세 > 국내주식기간별시세(일/주/월/년) url = '/uapi/domestic-stock/v1/quotations/inquire-daily-itemchartprice' tr_id = "FHKST03010100" # 주식현재가 회원사 if inqr_strt_dt is None: inqr_strt_dt = (datetime.now()-timedelta(days=14)).strftime("%Y%m%d") # 시작일자 값이 없으면 현재일자 if inqr_end_dt is None: inqr_end_dt = datetime.today().strftime("%Y%m%d") # 종료일자 값이 없으면 현재일자 print(inqr_strt_dt) print(inqr_end_dt) params = { "FID_COND_MRKT_DIV_CODE": div_code, # 시장 분류 코드 J : 주식/ETF/ETN, W: ELW "FID_INPUT_ISCD": itm_no, # 종목번호 (6자리) ETN의 경우, Q로 시작 (EX. Q500001) "FID_INPUT_DATE_1": inqr_strt_dt, # 입력 날짜 (시작) 조회 시작일자 (ex. 20220501) "FID_INPUT_DATE_2": inqr_end_dt, # 입력 날짜 (종료) 조회 종료일자 (ex. 20220530) "FID_PERIOD_DIV_CODE": period_code, # 기간분류코드 D:일봉, W:주봉, M:월봉, Y:년봉 "FID_ORG_ADJ_PRC": adj_prc # 수정주가 0:수정주가 1:원주가 } res = kis._url_fetch(url, tr_id, tr_cont, params) # print(res.getBody()) # 오류 원인 확인 필요시 사용 # Assuming 'output' is a dictionary that you want to convert to a DataFrame current_data = pd.DataFrame(res.getBody().output1, index=[0]) # 호가조회 * getBody() kis_auth.py 존재 dataframe = current_data return dataframe ############################################################################################## # [국내주식] 기본시세 > 국내주식기간별시세(일/주/월/년) # 국내주식기간별시세(일/주/월/년) API입니다. # 실전계좌/모의계좌의 경우, 한 번의 호출에 최대 100건까지 확인 가능합니다. ############################################################################################## # 국내주식기간별시세(일/주/월/년) Object를 DataFrame 으로 반환 # Input: None (Option) 상세 Input값 변경이 필요한 경우 API문서 참조 # Output: DataFrame (Option) output def get_inquire_daily_itemchartprice(output_dv="1", div_code="J", itm_no="", inqr_strt_dt=None, inqr_end_dt=None, period_code="D", adj_prc="1", tr_cont="", FK100="", NK100="", dataframe=None): # [국내주식] 기본시세 > 국내주식기간별시세(일/주/월/년) url = '/uapi/domestic-stock/v1/quotations/inquire-daily-itemchartprice' tr_id = "FHKST03010100" # 국내주식기간별시세 if inqr_strt_dt is None: inqr_strt_dt = (datetime.now()-timedelta(days=100)).strftime("%Y%m%d") # 시작일자 값이 없으면 현재일자 if inqr_end_dt is None: inqr_end_dt = datetime.today().strftime("%Y%m%d") # 종료일자 값이 없으면 현재일자 params = { "FID_COND_MRKT_DIV_CODE": div_code, # 시장 분류 코드 J : 주식/ETF/ETN, W: ELW "FID_INPUT_ISCD": itm_no, # 종목번호 (6자리) ETN의 경우, Q로 시작 (EX. Q500001) "FID_INPUT_DATE_1": inqr_strt_dt, # 입력 날짜 (시작) 조회 시작일자 (ex. 20220501) "FID_INPUT_DATE_2": inqr_end_dt, # 입력 날짜 (종료) 조회 종료일자 (ex. 20220530) "FID_PERIOD_DIV_CODE": period_code, # 기간분류코드 D:일봉, W:주봉, M:월봉, Y:년봉 "FID_ORG_ADJ_PRC": adj_prc # 수정주가 0:수정주가 1:원주가 } res = kis._url_fetch(url, tr_id, tr_cont, params) # print(res.getBody()) # 오류 원인 확인 필요시 사용 # Assuming 'output' is a dictionary that you want to convert to a DataFrame if output_dv == "1": current_data = pd.DataFrame(res.getBody().output1, index=[0]) # 호가조회 * getBody() kis_auth.py 존재 else: current_data = pd.DataFrame(res.getBody().output2) # 호가조회 * getBody() kis_auth.py 존재 dataframe = current_data return dataframe ############################################################################################## # [국내주식] 기본시세 > 주식현재가 당일시간대별체결 # 기준시각(HHMMSS) 이전 체결 내역 30건 조회됨 (시간 미지정시 현재시각 기준) ############################################################################################## # 주식현재가 당일시간대별체결 Object를 DataFrame 으로 반환 # Input: None (Option) 상세 Input값 변경이 필요한 경우 API문서 참조 # Output: DataFrame (Option) output def get_inquire_time_itemconclusion(output_dv="1", div_code="J", itm_no="", inqr_hour=None, tr_cont="", FK100="", NK100="", dataframe=None): # [국내주식] 기본시세 > 주식현재가 당일시간대별체결 url = '/uapi/domestic-stock/v1/quotations/inquire-time-itemconclusion' tr_id = "FHPST01060000" # 주식현재가 당일시간대별체결 if inqr_hour is None: now = datetime.now() # 시, 분, 초 추출 hour = now.hour minute = now.minute second = now.second # HHMMSS 형식으로 조합 inqr_hour = f"{hour:02d}{minute:02d}{second:02d}" # 현재 시간 가져오기 params = { "FID_COND_MRKT_DIV_CODE": div_code, # 시장 분류 코드 J : 주식/ETF/ETN, W: ELW "FID_INPUT_ISCD": itm_no, # 종목번호 (6자리) ETN의 경우, Q로 시작 (EX. Q500001) "FID_INPUT_HOUR_1": inqr_hour # 기준시간 (6자리; HH:MM:SS) ex) 155000 입력시 15시 50분 00초 기준 이전 체결 내역이 조회됨 } res = kis._url_fetch(url, tr_id, tr_cont, params) # print(res.getBody()) # 오류 원인 확인 필요시 사용 # Assuming 'output' is a dictionary that you want to convert to a DataFrame if output_dv == "1": current_data = pd.DataFrame(res.getBody().output1, index=[0]) # 호가조회 * getBody() kis_auth.py 존재 else: current_data = pd.DataFrame(res.getBody().output2) # 호가조회 * getBody() kis_auth.py 존재 dataframe = current_data return dataframe ############################################################################################## # [국내주식] 기본시세 > 주식현재가 시간외일자별주가 # 기준시각(HHMMSS) 이전 체결 내역 30건 조회됨 (시간 미지정시 현재시각 기준) ############################################################################################## # 주식현재가 시간외일자별주가 Object를 DataFrame 으로 반환 # Input: None (Option) 상세 Input값 변경이 필요한 경우 API문서 참조 # Output: DataFrame (Option) output def get_inquire_daily_overtimeprice(output_dv="1", div_code="J", itm_no="", tr_cont="", FK100="", NK100="", dataframe=None): # [국내주식] 기본시세 > 주식현재가 시간외일자별주가 url = '/uapi/domestic-stock/v1/quotations/inquire-daily-overtimeprice' tr_id = "FHPST02320000" # 주식현재가 시간외일자별주가 params = { "FID_COND_MRKT_DIV_CODE": div_code, # 시장 분류 코드 J : 주식/ETF/ETN, W: ELW "FID_INPUT_ISCD": itm_no # 종목번호 (6자리) ETN의 경우, Q로 시작 (EX. Q500001) } res = kis._url_fetch(url, tr_id, tr_cont, params) # print(res.getBody()) # 오류 원인 확인 필요시 사용 # Assuming 'output' is a dictionary that you want to convert to a DataFrame if output_dv == "1": current_data = pd.DataFrame(res.getBody().output1, index=[0]) # 시간외 현재가 * getBody() kis_auth.py 존재 else: current_data = pd.DataFrame(res.getBody().output2) # 일자별 시간외주가 최근 30일 dataframe = current_data return dataframe ############################################################################################## # [국내주식] 기본시세 > 주식당일분봉조회 # 실전계좌/모의계좌의 경우, 한 번의 호출에 최대 30건까지 확인 가능합니다. ############################################################################################## # 주식당일분봉조회 Object를 DataFrame 으로 반환 # Input: None (Option) 상세 Input값 변경이 필요한 경우 API문서 참조 # Output: DataFrame (Option) output def get_inquire_time_itemchartprice(output_dv="1", div_code="J", itm_no="", inqr_hour=None, incu_yn="N", tr_cont="", FK100="", NK100="", dataframe=None): # [국내주식] 기본시세 > 주식당일분봉조회 url = '/uapi/domestic-stock/v1/quotations/inquire-time-itemchartprice' tr_id = "FHKST03010200" # 주식당일분봉조회 if inqr_hour is None: now = datetime.now() # 시, 분, 초 추출 hour = now.hour minute = now.minute second = now.second # HHMMSS 형식으로 조합 inqr_hour = f"{hour:02d}{minute:02d}{second:02d}" # 현재 시간 가져오기 params = { "FID_ETC_CLS_CODE": "", # 시장 분류 코드 J : 주식/ETF/ETN, W: ELW "FID_COND_MRKT_DIV_CODE": div_code, # 시장 분류 코드 J : 주식/ETF/ETN, W: ELW "FID_INPUT_ISCD": itm_no, # 종목번호 (6자리) ETN의 경우, Q로 시작 (EX. Q500001) "FID_INPUT_HOUR_1": inqr_hour, # 조회대상(FID_COND_MRKT_DIV_CODE)에 따라 입력하는 값 상이 # 종목(J)일 경우, 조회 시작일자(HHMMSS) # ex) "123000" 입력 시 12시 30분 이전부터 1분 간격으로 조회 # 업종(U)일 경우, 조회간격(초) (60 or 120 만 입력 가능) # ex) "60" 입력 시 현재시간부터 1분간격으로 조회 # "120" 입력 시 현재시간부터 2분간격으로 조회 # ※ FID_INPUT_HOUR_1 에 미래일시 입력 시에 현재가로 조회됩니다. # ex) 오전 10시에 113000 입력 시에 오전 10시~11시30분 사이의 데이터가 오전 10시 값으로 조회됨 "FID_PW_DATA_INCU_YN": incu_yn # 과거 데이터 포함 여부(Y/N) * 업종(U) 조회시에만 동작하는 구분값 N : 당일데이터만 조회, Y : 이후데이터도 조회 # (조회시점이 083000(오전8:30)일 경우 전일자 업종 시세 데이터도 같이 조회됨) } res = kis._url_fetch(url, tr_id, tr_cont, params) # print(res.getBody()) # 오류 원인 확인 필요시 사용 # Assuming 'output' is a dictionary that you want to convert to a DataFrame if output_dv == "1": current_data = pd.DataFrame(res.getBody().output1, index=[0]) # 현재가 * getBody() kis_auth.py 존재 else: current_data = pd.DataFrame(res.getBody().output2) # 시간별 분봉 dataframe = current_data return dataframe ############################################################################################## # [국내주식] 기본시세 > 주식현재가 시세2 ############################################################################################## # 주식현재가 시세2 Object를 DataFrame 으로 반환 # Input: None (Option) 상세 Input값 변경이 필요한 경우 API문서 참조 # Output: DataFrame (Option) output def get_inquire_daily_price_2(div_code="J", itm_no="", tr_cont="", FK100="", NK100="", dataframe=None): # [국내주식] 기본시세 > 주식현재가 시세2 url = '/uapi/domestic-stock/v1/quotations/inquire-price-2' tr_id = "FHPST01010000" # 주식현재가 시세2 params = { "FID_COND_MRKT_DIV_CODE": div_code, # 시장 분류 코드 J : 주식/ETF/ETN, W: ELW "FID_INPUT_ISCD": itm_no # 종목번호 (6자리) ETN의 경우, Q로 시작 (EX. Q500001) } res = kis._url_fetch(url, tr_id, tr_cont, params) # print(res.getBody()) # 오류 원인 확인 필요시 사용 # Assuming 'output' is a dictionary that you want to convert to a DataFrame current_data = pd.DataFrame(res.getBody().output, index=[0]) # 시세2 * getBody() kis_auth.py 존재 dataframe = current_data return dataframe ############################################################################################## # [국내주식] 기본시세 > ETF/ETN 현재가 # 한국투자 HTS(eFriend Plus) > [0240] ETF/ETN 현재가 화면의 기능을 API로 개발한 사항으로, 해당 화면을 참고하시면 기능을 이해하기 쉽습니다 ############################################################################################## # ETF/ETN 현재가 Object를 DataFrame 으로 반환 # Input: None (Option) 상세 Input값 변경이 필요한 경우 API문서 참조 # Output: DataFrame (Option) output def get_quotations_inquire_price(div_code="J", itm_no="", tr_cont="", FK100="", NK100="", dataframe=None): # [국내주식] 기본시세 > ETF/ETN 현재가 url = '/uapi/etfetn/v1/quotations/inquire-price' tr_id = "FHPST02400000" # ETF/ETN 현재가 params = { "FID_COND_MRKT_DIV_CODE": div_code, # 시장 분류 코드 J : 주식/ETF/ETN, W: ELW "FID_INPUT_ISCD": itm_no # 종목번호 (6자리) ETN의 경우, Q로 시작 (EX. Q500001) } res = kis._url_fetch(url, tr_id, tr_cont, params) # print(res.getBody()) # 오류 원인 확인 필요시 사용 # Assuming 'output' is a dictionary that you want to convert to a DataFrame current_data = pd.DataFrame(res.getBody().output, index=[0]) # 시세2 * getBody() kis_auth.py 존재 dataframe = current_data return dataframe ############################################################################################## # [국내주식] 기본시세 > NAV 비교추이(종목) # 한국투자 HTS(eFriend Plus) > [0244] ETF/ETN 비교추이(NAV/IIV) 좌측 화면의 기능을 API로 개발한 사항으로, 해당 화면을 참고하시면 기능을 이해하기 쉽습니다. ############################################################################################## # NAV 비교추이(종목) Object를 DataFrame 으로 반환 # Input: None (Option) 상세 Input값 변경이 필요한 경우 API문서 참조 # Output: DataFrame (Option) output def get_quotations_nav_comparison_trend(output_dv="1", div_code="J", itm_no="", tr_cont="", FK100="", NK100="", dataframe=None): # [국내주식] 기본시세 > NAV 비교추이(종목) url = '/uapi/etfetn/v1/quotations/nav-comparison-trend' tr_id = "FHPST02440000" # NAV 비교추이(종목) params = { "FID_COND_MRKT_DIV_CODE": div_code, # 시장 분류 코드 J : 주식/ETF/ETN, W: ELW "FID_INPUT_ISCD": itm_no # 종목번호 (6자리) ETN의 경우, Q로 시작 (EX. Q500001) } res = kis._url_fetch(url, tr_id, tr_cont, params) # print(res.getBody()) # 오류 원인 확인 필요시 사용 # Assuming 'output' is a dictionary that you want to convert to a DataFrame if output_dv == "1": current_data = pd.DataFrame(res.getBody().output1, index=[0]) # 현재가 * getBody() kis_auth.py 존재 else: current_data = pd.DataFrame(res.getBody().output2, index=[0]) # 시간별 분봉 dataframe = current_data return dataframe ############################################################################################## # [국내주식] 업종/기타 > 국내휴장일조회 # 국내휴장일조회 API입니다. # 영업일, 거래일, 개장일, 결제일 여부를 조회할 수 있습니다. # 주문을 넣을 수 있는지 확인하고자 하실 경우 개장일여부(opnd_yn)을 사용하시면 됩니다. ############################################################################################## def get_quotations_ch_holiday(dt="", tr_cont="", FK100="", NK100="", dataframe=None): url = '/uapi/domestic-stock/v1/quotations/chk-holiday' tr_id = "CTCA0903R" # 국내휴장일조회 params = { "BASS_DT": dt, # 시장 분류 코드 J : 주식/ETF/ETN, W: ELW "CTX_AREA_FK": FK100, # 공란 : 최초 조회시 이전 조회 Output CTX_AREA_FK100 값 : 다음페이지 조회시(2번째부터) "CTX_AREA_NK": NK100 # 공란 : 최초 조회시 이전 조회 Output CTX_AREA_NK100 값 : 다음페이지 조회시(2번째부터) } res = kis._url_fetch(url, tr_id, tr_cont, params) # print(res.getBody()) # 오류 원인 확인 필요시 사용 # Assuming 'output' is a dictionary that you want to convert to a DataFrame current_data = pd.DataFrame(res.getBody().output) dataframe = current_data # 첫 번째 값만 선택하여 반환 first_value = current_data.iloc[0] if not current_data.empty else None return first_value