# -*- 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] # # * 모의투자의 경우, 모든 해외 종목 매매가 지원되지 않습니다. 일부 종목만 매매 가능한 점 유의 부탁드립니다. # # * 해외주식 서비스 신청 후 이용 가능합니다. (아래 링크 3번 해외증권 거래신청 참고) # https://securities.koreainvestment.com/main/bond/research/_static/TF03ca010001.jsp # # * 해외 거래소 운영시간 외 API 호출 시 애러가 발생하오니 운영시간을 확인해주세요. # * 해외 거래소 운영시간(한국시간 기준) # 1) 미국 : 23:30 ~ 06:00 (썸머타임 적용 시 22:30 ~ 05:00) # 2) 일본 : (오전) 09:00 ~ 11:30, (오후) 12:30 ~ 15:00 # 3) 상해 : 10:30 ~ 16:00 # 4) 홍콩 : (오전) 10:30 ~ 13:00, (오후) 14:00 ~ 17:00 # # ※ 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_overseas_order(ord_dv="", excg_cd="", itm_no="", qty=0, unpr=0, tr_cont="", FK100="", NK100="", dataframe=None): # 국내주식주문 > 주식주문(현금) url = '/uapi/overseas-stock/v1/trading/order' if ord_dv == "buy": if excg_cd in ("NASD","NYSE","AMEX"): tr_id = "TTTT1002U" # 미국 매수 주문 [모의투자] VTTT1002U elif excg_cd == "SHEK": tr_id = "TTTS1002U" # 홍콩 매수 주문 [모의투자] VTTS1002U elif excg_cd == "SHAA": tr_id = "TTTS0202U" # 중국상해 매수 주문 [모의투자] VTTS0202U elif excg_cd == "SZAA": tr_id = "TTTS0305U" # 중국심천 매수 주문 [모의투자] VTTS0305U elif excg_cd == "TKSE": tr_id = "TTTS0308U" # 일본 매수 주문 [모의투자] VTTS0308U elif excg_cd in ("HASE", "VNSE"): tr_id = "TTTS0311U" # 베트남(하노이,호치민) 매수 주문 [모의투자] VTTS0311U else: print("해외거래소코드 확인요망!!!") return None elif ord_dv == "sell": if excg_cd in ("NASD", "NYSE", "AMEX"): tr_id = "TTTT1006U" # 미국 매도 주문 [모의투자] VTTT1006U elif excg_cd == "SHEK": tr_id = "TTTS1001U" # 홍콩 매도 주문 [모의투자] VTTS1001U elif excg_cd == "SHAA": tr_id = "TTTS1005U" # 중국상해 매도 주문 [모의투자] VTTS1005U elif excg_cd == "SZAA": tr_id = "TTTS0304U" # 중국심천 매도 주문 [모의투자] VTTS0304U elif excg_cd == "TKSE": tr_id = "TTTS0307U" # 일본 매도 주문 [모의투자] VTTS0307U elif excg_cd in ("HASE", "VNSE"): tr_id = "TTTS0310U" # 베트남(하노이,호치민) 매도 주문 [모의투자] VTTS0311U else: print("해외거래소코드 확인요망!!!") return None else: print("매수/매도 구분 확인요망!") return None if itm_no == "": print("주문종목번호(상품번호) 확인요망!!!") return None if qty == 0: print("주문수량 확인요망!!!") return None if unpr == 0: print("해외주문단가 확인요망!!!") return None if ord_dv == "buy": sll_type = "" elif ord_dv == "sell": sll_type = "00" else: print("매수/매도 구분 확인요망!!!") return None params = { "CANO": kis.getTREnv().my_acct, # 종합계좌번호 8자리 "ACNT_PRDT_CD": kis.getTREnv().my_prod, # 계좌상품코드 2자리 "OVRS_EXCG_CD": excg_cd, # 해외거래소코드 # NASD:나스닥,NYSE:뉴욕,AMEX:아멕스,SEHK:홍콩,SHAA:중국상해,SZAA:중국심천,TKSE:일본,HASE:베트남하노이,VNSE:호치민 "PDNO": itm_no, # 종목코드 "ORD_DVSN": "00", # 주문구분 00:지정가, 01:시장가, 02:조건부지정가 나머지주문구분 API 문서 참조 "ORD_QTY": str(int(qty)), # 주문주식수 "OVRS_ORD_UNPR": str(int(unpr)), # 해외주문단가 "SLL_TYPE": sll_type, # 판매유형 "ORD_SVR_DVSN_CD": "0" # 주문서버구분코드l } 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_overseas_order_rvsecncl(excg_cd="", itm_no="", orgn_odno="", rvse_cncl_dvsn_cd="", qty=0, unpr=0, tr_cont="", dataframe=None): url = '/uapi/overseas-stock/v1/trading/order-rvsecncl' if excg_cd in ("NASD", "NYSE", "AMEX"): tr_id = "TTTT1004U" # 미국 매수 주문 [모의투자] VTTT1004U elif excg_cd == "SHEK": tr_id = "TTTS1003U" # 홍콩 매수 주문 [모의투자] VTTS1003U elif excg_cd == "SHAA": tr_id = "TTTS0302U" # 중국상해 매수 주문 [모의투자] VTTS0302U elif excg_cd == "SZAA": tr_id = "TTTS0306U" # 중국심천 매수 주문 [모의투자] VTTS0306U elif excg_cd == "TKSE": tr_id = "TTTS0309U" # 일본 매수 주문 [모의투자] VTTS0309U elif excg_cd in ("HASE", "VNSE"): tr_id = "TTTS0312U" # 베트남(하노이,호치민) 매수 주문 [모의투자] VTTS0312U else: print("해외거래소코드 확인요망!!!") return None if orgn_odno == "": print("원주문번호 확인요망!!!") return None if not rvse_cncl_dvsn_cd in ["01","02"]: print("정정취소구분코드 확인요망!!!") # 정정:01. 취소:02 return None if rvse_cncl_dvsn_cd == "01" and unpr == 0: print("주문단가 확인요망!!!") return None params = { "CANO": kis.getTREnv().my_acct, # 종합계좌번호 8자리 "ACNT_PRDT_CD": kis.getTREnv().my_prod, # 계좌상품코드 2자리 "OVRS_EXCG_CD": excg_cd, # 해외거래소코드 NASD:나스닥,NYSE:뉴욕,AMEX:아멕스,SEHK:홍콩,SHAA:중국상해,SZAA:중국심천,TKSE:일본,HASE:베트남하노이,VNSE:호치민 "PDNO": itm_no, # 종목번호(상품번호) "ORGN_ODNO": orgn_odno, # 원주문번호 정정 또는 취소할 원주문번호 (해외주식_주문 API ouput ODNO or 해외주식 미체결내역 API output ODNO 참고) "RVSE_CNCL_DVSN_CD": rvse_cncl_dvsn_cd, # 정정 : 01, 취소 : 02 "ORD_QTY": str(int(qty)), # 주문수량 [잔량전부 취소/정정주문] "0" 설정 ( QTY_ALL_ORD_YN=Y 설정 ) [잔량일부 취소/정정주문] 취소/정정 수량 "OVRS_ORD_UNPR": str(int(unpr)), # 주문단가 [정정] 정정주문 1주당 가격 [취소] "0" 설정 "MGCO_APTM_ODNO": "", # 운용사지정주문번호 "ORD_SVR_DVSN_CD": "0" # 주문서버구분코드 } 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_overseas_order_allcncl(excg_cd="", itm_no="", tr_cont="", FK100="", NK100="", dataframe=None): url = '/uapi/overseas-stock/v1/trading/inquire-nccs' tr_id = "TTTS3018R" # 모의투자 VTTS3018R t_cnt = 0 if excg_cd == "": # 해외거래소코드 필수 print("해외거래소코드 확인요망!!!") return None params = { "CANO": kis.getTREnv().my_acct, # 종합계좌번호 8자리 "ACNT_PRDT_CD": kis.getTREnv().my_prod, # 계좌상품코드 2자리 "OVRS_EXCG_CD": excg_cd, # 해외거래소코드 NASD:나스닥,NYSE:뉴욕,AMEX:아멕스,SEHK:홍콩,SHAA:중국상해,SZAA:중국심천,TKSE:일본,HASE:베트남하노이,VNSE:호치민 "SORT_SQN": "DS", # DS : 정순, 그외 : 역순 "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 존재 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("미체결내역 있음") for index, row in current_data.iterrows(): print(row['odno']) r_odno = row['odno'] res_cncl = get_overseas_order_rvsecncl(excg_cd="NASD", itm_no="", orgn_odno=r_odno, rvse_cncl_dvsn_cd="02") print(res_cncl) dataframe = current_data return dataframe elif tr_cont == "F" or tr_cont == "M": # 다음 페이지 존재하는 경우 자기 호출 처리 print('Call Next') time.sleep(0.1) # 시스템 안정적 운영을 위하여 반드시 지연 time 필요 return get_overseas_order_allcncl(excg_cd, itm_no, "N", FK100, NK100, dataframe) ############################################################################################## # [해외주식] 주문/계좌 > 해외주식 미체결내역[v1_해외주식-005] # 접수된 해외주식 주문 중 체결되지 않은 미체결 내역을 조회하는 API입니다. # 실전계좌의 경우, 한 번의 호출에 최대 40건까지 확인 가능하며, 이후의 값은 연속조회를 통해 확인하실 수 있습니다. # # * 해외주식 서비스 신청 후 이용 가능합니다. (아래 링크 3번 해외증권 거래신청 참고) # https://securities.koreainvestment.com/main/bond/research/_static/TF03ca010001.jsp # # ※ 해외 거래소 운영시간(한국시간 기준) # 1) 미국 : 23:30 ~ 06:00 (썸머타임 적용 시 22:30 ~ 05:00) # 2) 일본 : (오전) 09:00 ~ 11:30, (오후) 12:30 ~ 15:00 # 3) 상해 : 10:30 ~ 16:00 # 4) 홍콩 : (오전) 10:30 ~ 13:00, (오후) 14:00 ~ 17:00 ############################################################################################## # 해외주식 미체결내역 List를 DataFrame 으로 반환 # Input: None (Option) 상세 Input값 변경이 필요한 경우 API문서 참조 # Output: DataFrame (Option) output API 문서 참조 등 def get_overseas_inquire_nccs(excg_cd="", tr_cont="", FK100="", NK100="", dataframe=None): url = '/uapi/overseas-stock/v1/trading/inquire-nccs' tr_id = "TTTS3018R" # 모의투자 VTTS3018R t_cnt = 0 if excg_cd == "": # 해외거래소코드 필수 print("해외거래소코드 확인요망!!!") return None params = { "CANO": kis.getTREnv().my_acct, # 종합계좌번호 8자리 "ACNT_PRDT_CD": kis.getTREnv().my_prod, # 계좌상품코드 2자리 "OVRS_EXCG_CD": excg_cd, # 해외거래소코드 NASD:나스닥,NYSE:뉴욕,AMEX:아멕스,SEHK:홍콩,SHAA:중국상해,SZAA:중국심천,TKSE:일본,HASE:베트남하노이,VNSE:호치민 "SORT_SQN": "DS", # DS : 정순, 그외 : 역순 "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_overseas_inquire_nccs(excg_cd, "N", FK100, NK100, dataframe) ############################################################################################## # [해외주식] 주문/계좌 > 해외주식 잔고_현황 [v1_해외주식-006] # 해외주식 잔고를 조회하는 API 입니다. # 한국투자 HTS(eFriend Plus) > [7600] 해외주식 종합주문 화면의 좌측 하단 '실시간잔고' 기능을 API로 개발한 사항으로, 해당 화면을 참고하시면 기능을 이해하기 쉽습니다. # 다만 미국주간거래 가능종목에 대해서는 frcr_evlu_pfls_amt(외화평가손익금액), evlu_pfls_rt(평가손익율), ovrs_stck_evlu_amt(해외주식평가금액), now_pric2(현재가격2) 값이 HTS와는 상이하게 표출될 수 있습니다. # (주간시간 시간대에 HTS는 주간시세로 노출, API로는 야간시세로 노출) # # 실전계좌의 경우, 한 번의 호출에 최대 100건까지 확인 가능하며, 이후의 값은 연속조회를 통해 확인하실 수 있습니다. # # * 해외주식 서비스 신청 후 이용 가능합니다. (아래 링크 3번 해외증권 거래신청 참고) # https://securities.koreainvestment.com/main/bond/research/_static/TF03ca010001.jsp # # * 미니스탁 잔고는 해당 API로 확인이 불가합니다. ############################################################################################## # 해외주식 잔고 List를 DataFrame 으로 반환 # Input: None (Option) 상세 Input값 변경이 필요한 경우 API문서 참조 # Output: DataFrame (Option) output API 문서 참조 등 def get_overseas_inquire_balance(excg_cd="", crcy_cd="", tr_cont="", FK100="", NK100="", dataframe=None): url = '/uapi/overseas-stock/v1/trading/inquire-balance' tr_id = "TTTS3012R" # 모의투자 VTTS3012R t_cnt = 0 params = { "CANO": kis.getTREnv().my_acct, # 종합계좌번호 8자리 "ACNT_PRDT_CD": kis.getTREnv().my_prod, # 계좌상품코드 2자리 "OVRS_EXCG_CD": excg_cd, # 해외거래소코드 NASD:나스닥,NYSE:뉴욕,AMEX:아멕스,SEHK:홍콩,SHAA:중국상해,SZAA:중국심천,TKSE:일본,HASE:베트남하노이,VNSE:호치민 "TR_CRCY_CD": crcy_cd, # 거래통화코드 USD : 미국달러,HKD : 홍콩달러,CNY : 중국위안화,JPY : 일본엔화,VND : 베트남동 "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) if str(res.getBody().rt_cd) == "0": current_data = pd.DataFrame(res.getBody().output2, index=[0]) dataframe = current_data else: print(res.getBody().msg_cd + "," + res.getBody().msg1) #print(res.getErrorCode() + "," + res.getErrorMessage()) dataframe = None return dataframe ############################################################################################## # [해외주식] 주문/계좌 > 해외주식 잔고 내역[v1_해외주식-006] # 해외주식 잔고를 조회하는 API 입니다. # 한국투자 HTS(eFriend Plus) > [7600] 해외주식 종합주문 화면의 좌측 하단 '실시간잔고' 기능을 API로 개발한 사항으로, 해당 화면을 참고하시면 기능을 이해하기 쉽습니다. # 다만 미국주간거래 가능종목에 대해서는 frcr_evlu_pfls_amt(외화평가손익금액), evlu_pfls_rt(평가손익율), ovrs_stck_evlu_amt(해외주식평가금액), now_pric2(현재가격2) 값이 HTS와는 상이하게 표출될 수 있습니다. # (주간시간 시간대에 HTS는 주간시세로 노출, API로는 야간시세로 노출) # # 실전계좌의 경우, 한 번의 호출에 최대 100건까지 확인 가능하며, 이후의 값은 연속조회를 통해 확인하실 수 있습니다. # # * 해외주식 서비스 신청 후 이용 가능합니다. (아래 링크 3번 해외증권 거래신청 참고) # https://securities.koreainvestment.com/main/bond/research/_static/TF03ca010001.jsp # # * 미니스탁 잔고는 해당 API로 확인이 불가합니다. ############################################################################################## # 해외주식 잔고 List를 DataFrame 으로 반환 # Input: None (Option) 상세 Input값 변경이 필요한 경우 API문서 참조 # Output: DataFrame (Option) output API 문서 참조 등 def get_overseas_inquire_balance_lst(excg_cd="", crcy_cd="", tr_cont="", FK100="", NK100="", dataframe=None): url = '/uapi/overseas-stock/v1/trading/inquire-balance' tr_id = "TTTS3012R" # 모의투자 VTTS3012R t_cnt = 0 params = { "CANO": kis.getTREnv().my_acct, # 종합계좌번호 8자리 "ACNT_PRDT_CD": kis.getTREnv().my_prod, # 계좌상품코드 2자리 "OVRS_EXCG_CD": excg_cd, # 해외거래소코드 NASD:나스닥,NYSE:뉴욕,AMEX:아멕스,SEHK:홍콩,SHAA:중국상해,SZAA:중국심천,TKSE:일본,HASE:베트남하노이,VNSE:호치민 "TR_CRCY_CD": crcy_cd, # 거래통화코드 USD : 미국달러,HKD : 홍콩달러,CNY : 중국위안화,JPY : 일본엔화,VND : 베트남동 "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().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_overseas_inquire_balance_lst(excg_cd, crcy_cd, "N", FK100, NK100, dataframe) ############################################################################################## # [해외주식] 주문/계좌 > 해외주식 주문체결내역[v1_해외주식-007] # 일정 기간의 해외주식 주문 체결 내역을 확인하는 API입니다. # 실전계좌의 경우, 한 번의 호출에 최대 20건까지 확인 가능하며, 이후의 값은 연속조회를 통해 확인하실 수 있습니다. # 모의계좌의 경우, 한 번의 호출에 최대 15건까지 확인 가능하며, 이후의 값은 연속조회를 통해 확인하실 수 있습니다. # # * 해외주식 서비스 신청 후 이용 가능합니다. (아래 링크 3번 해외증권 거래신청 참고) # https://securities.koreainvestment.com/main/bond/research/_static/TF03ca010001.jsp # # ※ 해외 거래소 운영시간(한국시간 기준) # 1) 미국 : 23:30 ~ 06:00 (썸머타임 적용 시 22:30 ~ 05:00) # 2) 일본 : (오전) 09:00 ~ 11:30, (오후) 12:30 ~ 15:00 # 3) 상해 : 10:30 ~ 16:00 # 4) 홍콩 : (오전) 10:30 ~ 13:00, (오후) 14:00 ~ 17:00 ############################################################################################## # 해외주식 주문체결내역 List를 DataFrame 으로 반환 # Input: None (Option) 상세 Input값 변경이 필요한 경우 API문서 참조 # Output: DataFrame (Option) output API 문서 참조 등 def get_overseas_inquire_ccnl(st_dt="", ed_dt="", ord_dv="00", ccld_dv="00", excg_cd="%", tr_cont="", FK100="", NK100="", dataframe=None): url = '/uapi/overseas-stock/v1/trading/inquire-ccnl' tr_id = "TTTS3035R" # 모의투자 VTTS3035R t_cnt = 0 if st_dt =="": st_dt = datetime.today().strftime("%Y%m%d") # 주문내역조회 시작일자 값이 없으면 현재일자 if ed_dt =="": ed_dt = datetime.today().strftime("%Y%m%d") # 주문내역조회 종료일자 값이 없으면 현재일자 params = { "CANO": kis.getTREnv().my_acct, # 종합계좌번호 8자리 "ACNT_PRDT_CD": kis.getTREnv().my_prod, # 계좌상품코드 2자리 "PDNO": "%", # 전종목일 경우 "%" 입력 ※ 모의투자계좌의 경우 ""(전체 조회)만 가능 "ORD_STRT_DT": st_dt, # YYYYMMDD 형식 (현지시각 기준) "ORD_END_DT": ed_dt, # YYYYMMDD 형식 (현지시각 기준) "SLL_BUY_DVSN": ord_dv, # 매도매수구분 00:전체,01:매도,02:매수 ※ 모의투자계좌의 경우 "00"(전체 조회)만 가능 "CCLD_NCCS_DVSN": ccld_dv, # 체결미체결구분 00:전체,01:체결,02:미체결 ※ 모의투자계좌의 경우 "00"(전체 조회)만 가능 "OVRS_EXCG_CD": excg_cd, # 해외거래소코드, 전종목일 경우 "%" 입력, NASD:미국시장 전체(나스닥,뉴욕,아멕스),NYSE:뉴욕,AMEX:아멕스,SEHK:홍콩,SHAA:중국상해,SZAA:중국심천,TKSE:일본,HASE:베트남하노이,VNSE:호치민 "SORT_SQN": "DS", # DS:정순,AS:역순, ※ 모의투자계좌의 경우 정렬순서 사용불가(Default : DS(정순)) "ORD_DT": "", # "" (Null 값 설정) "ORD_GNO_BRNO": "", # "" (Null 값 설정) "ODNO": "", # "" (Null 값 설정) "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_overseas_inquire_ccnl(st_dt, ed_dt, ord_dv, ccld_dv, excg_cd, "N", FK100, NK100, dataframe) ############################################################################################## # [해외주식] 주문/계좌 > 해외주식 체결기준현재잔고[v1_해외주식-008] # 해외주식 잔고를 체결 기준으로 확인하는 API 입니다. # # HTS(eFriend Plus) [0839] 해외 체결기준잔고 화면을 API로 구현한 사항으로 화면을 함께 보시면 기능 이해가 쉽습니다. # # (※모의계좌의 경우 output3(외화평가총액 등 확인 가능)만 정상 출력됩니다. # 잔고 확인을 원하실 경우에는 해외주식 잔고[v1_해외주식-006] API 사용을 부탁드립니다.) # # * 해외주식 서비스 신청 후 이용 가능합니다. (아래 링크 3번 해외증권 거래신청 참고) # https://securities.koreainvestment.com/main/bond/research/_static/TF03ca010001.jsp # # 해외주식 체결기준현재잔고 유의사항 # 1. 해외증권 체결기준 잔고현황을 조회하는 화면입니다. # 2. 온라인국가는 수수료(국내/해외)가 반영된 최종 정산금액으로 잔고가 변동되며, 결제작업 지연등으로 인해 조회시간은 차이가 발생할 수 있습니다. # - 아시아 온라인국가 : 매매일 익일 08:40 ~ 08:45분 경 # - 미국 온라인국가 : 당일 장 종료후 08:40 ~ 08:45분 경 # ※ 단, 애프터연장 참여 신청계좌는 10:30 ~ 10:35분 경(Summer Time : 09:30 ~ 09:35분 경)에 최종 정산금액으로 변동됩니다. # 3. 미국 현재가 항목은 주간시세 및 애프터시세는 반영하지 않으며, 정규장 마감 후에는 종가로 조회됩니다. # 4. 온라인국가를 제외한 국가의 현재가는 실시간 시세가 아니므로 주문화면의 잔고 평가금액 등과 차이가 발생할 수 있습니다. # 5. 해외주식 담보대출 매도상환 체결내역은 해당 잔고화면에 반영되지 않습니다. # 결제가 완료된 이후 외화잔고에 포함되어 반영되오니 참고하여 주시기 바랍니다. # 6. 외화평가금액은 당일 최초고시환율이 적용된 금액으로 실제 환전금액과는 차이가 있습니다. # 7. 미국은 메인 시스템이 아닌 별도 시스템을 통해 거래되므로, 18시 10~15분 이후 발생하는 미국 매매내역은 해당 화면에 실시간으로 반영되지 않으니 하단 내용을 참고하여 안내하여 주시기 바랍니다. # [외화잔고 및 해외 유가증권 현황 조회] # - 일반/통합증거금 계좌 : 미국장 종료 + 30분 후 부터 조회 가능 # 단, 통합증거금 계좌에 한해 주문금액은 외화잔고 항목에 실시간 반영되며, 해외 유가증권 현황은 반영되지 # 않아 해외 유가증권 평가금액이 과다 또는 과소 평가될 수 있습니다. # - 애프터연장 신청계좌 : 실시간 반영 # 단, 시스템정산작업시간(23:40~00:10) 및 거래량이 많은 경우 메인시스템에 반영되는 시간으로 인해 차이가 # 발생할 수 있습니다. # ※ 배치작업시간에 따라 시간은 변동될 수 있습니다. ############################################################################################## # 해외주식 체결기준현재잔고 List를 DataFrame 으로 반환 # Input: None (Option) 상세 Input값 변경이 필요한 경우 API문서 참조 # Output: DataFrame (Option) output API 문서 참조 등 def get_overseas_inquire_present_balance(dv="03", dvsn="01", natn="000", mkt="00", inqr_dvsn="00", tr_cont="", FK100="", NK100="", dataframe=None): url = '/uapi/overseas-stock/v1/trading/inquire-present-balance' tr_id = "CTRP6504R" # 모의투자 VTRP6504R t_cnt = 0 params = { "CANO": kis.getTREnv().my_acct, # 종합계좌번호 8자리 "ACNT_PRDT_CD": kis.getTREnv().my_prod, # 계좌상품코드 2자리 "WCRC_FRCR_DVSN_CD": dvsn, # 원화외화구분코드 01 : 원화, 02 : 외화 "NATN_CD": natn, # 국가코드 000 전체, 840 미국, 344 홍콩, 156 중국, 392 일본, 704 베트남 "TR_MKET_CD": mkt, # 거래시장코드 00:전체 (API문서 참조) "INQR_DVSN_CD": inqr_dvsn # 00 : 전체,01 : 일반해외주식,02 : 미니스탁 } res = kis._url_fetch(url, tr_id, tr_cont, params) if str(res.getBody().rt_cd) == "0": if dv == "01": current_data = pd.DataFrame(res.getBody().output1) elif dv == "02": current_data = pd.DataFrame(res.getBody().output2) else: current_data = pd.DataFrame(res.getBody().output3, index=[0]) dataframe = current_data else: print(res.getBody().msg_cd + "," + res.getBody().msg1) #print(res.getErrorCode() + "," + res.getErrorMessage()) dataframe = None return dataframe ############################################################################################## # [해외주식] 주문/계좌 > 해외주식 매수가능금액조회[v1_해외주식-014] # 해외주식 매수가능금액조회 API입니다. # # * 해외주식 서비스 신청 후 이용 가능합니다. (아래 링크 3번 해외증권 거래신청 참고) # https://securities.koreainvestment.com/main/bond/research/_static/TF03ca010001.jsp ############################################################################################## # 해외주식 매수가능금액조회 List를 DataFrame 으로 반환 # Input: None (Option) 상세 Input값 변경이 필요한 경우 API문서 참조 # Output: DataFrame (Option) output API 문서 참조 등 def get_overseas_inquire_psamount(dv="03", dvsn="01", natn="000", mkt="00", inqr_dvsn="00", tr_cont="", FK100="", NK100="", dataframe=None): url = '/uapi/overseas-stock/v1/trading/inquire-psamount' tr_id = "TTTS3007R" # 모의투자 VTTS3007R t_cnt = 0 params = { "CANO": kis.getTREnv().my_acct, # 종합계좌번호 8자리 "ACNT_PRDT_CD": kis.getTREnv().my_prod, # 계좌상품코드 2자리 "OVRS_EXCG_CD": dvsn, # 원화외화구분코드 01 : 원화, 02 : 외화 "OVRS_ORD_UNPR": natn, # 국가코드 000 전체, 840 미국, 344 홍콩, 156 중국, 392 일본, 704 베트남 "ITEM_CD": inqr_dvsn # 00 : 전체,01 : 일반해외주식,02 : 미니스탁 } 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_해외주식-026] # 해외주식 미국주간주문 API입니다. # # * 미국주식 주간거래 시 아래 참고 부탁드립니다. # . 포럼 > FAQ > 미국주식 주간거래 시 어떤 API를 사용해야 하나요? # # * 미국주간거래의 경우, 모든 미국 종목 매매가 지원되지 않습니다. 일부 종목만 매매 가능한 점 유의 부탁드립니다. # # * 해외주식 서비스 신청 후 이용 가능합니다. (아래 링크 3번 해외증권 거래신청 참고) # https://securities.koreainvestment.com/main/bond/research/_static/TF03ca010001.jsp # # * 미국주간거래시간 외 API 호출 시 에러가 발생하오니 운영시간을 확인해주세요. # . 주간거래(장전거래)(한국시간 기준) : 10:00 ~ 18:00 (Summer Time 동일) # # * 한국투자증권 해외주식 시장별 매매안내(매매수수료, 거래시간 안내, 결제일 정보, 환전안내) # https://securities.koreainvestment.com/main/bond/research/_static/TF03ca050000.jsp # # ※ 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_overseas_daytime_order(ord_dv="", excg_cd="", itm_no="", qty=0, unpr=0, tr_cont="", FK100="", NK100="", dataframe=None): # 국내주식주문 > 주식주문(현금) url = '/uapi/overseas-stock/v1/trading/daytime-order' if ord_dv == "buy": tr_id = "TTTS6036U" # 미국주간매수 elif ord_dv == "sell": tr_id = "TTTS6037U" # 미국주간매도 else: print("매수매도구분(ord_dv) 확인요망!!!") return None if excg_cd == "": print("해외거래소코드(excg_cd) 확인요망!!!") return None if itm_no == "": print("주문종목번호(itm_no 상품번호) 확인요망!!!") return None if qty == 0: print("주문수량(qty) 확인요망!!!") return None if unpr == 0: print("해외주문단가(unpr) 확인요망!!!") return None params = { "CANO": kis.getTREnv().my_acct, # 종합계좌번호 8자리 "ACNT_PRDT_CD": kis.getTREnv().my_prod, # 계좌상품코드 2자리 "OVRS_EXCG_CD": excg_cd, # 해외거래소코드 NASD:나스닥,NYSE:뉴욕,AMEX:아멕스 "PDNO": itm_no, # 종목코드 "ORD_DVSN": "00", # 주문구분 00:지정가 * 주간거래는 지정가만 가능 "ORD_QTY": str(int(qty)), # 주문주식수 "OVRS_ORD_UNPR": str(int(unpr)), # 해외주문단가 "CTAC_TLNO": "", # 연락전화번호 "MGCO_APTM_ODNO": "", # 운용사지정주문번호 "ORD_SVR_DVSN_CD": "0" # 주문서버구분코드 } 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_해외주식-027] ############################################################################################## # Input: None (Option) 상세 Input값 변경이 필요한 경우 API문서 참조 # Output: DataFrame (Option) output API 문서 참조 등 def get_overseas_daytime_order_rvsecncl(excg_cd="", itm_no="", orgn_odno="", rvse_cncl_dvsn_cd="", qty=0, unpr=0, tr_cont="", dataframe=None): url = '/uapi/overseas-stock/v1/trading/daytime-order-rvsecncl' tr_id = "TTTS6038U" # 미국주간정정취소 if excg_cd == "": print("해외거래소코드(excg_cd) 확인요망!!!") return None if itm_no == "": print("주문종목번호(itm_no 상품번호) 확인요망!!!") return None if orgn_odno == "": print("원주문번호(orgn_odno) 확인요망!!!") return None if not rvse_cncl_dvsn_cd in ["01","02"]: print("정정취소구분코드(rvse_cncl_dvsn_cd) 확인요망!!!") # 정정:01. 취소:02 return None if rvse_cncl_dvsn_cd == "01" and unpr == 0: print("주문단가(unpr) 확인요망!!!") return None params = { "CANO": kis.getTREnv().my_acct, # 종합계좌번호 8자리 "ACNT_PRDT_CD": kis.getTREnv().my_prod, # 계좌상품코드 2자리 "OVRS_EXCG_CD": excg_cd, # 해외거래소코드 NASD:나스닥,NYSE:뉴욕,AMEX:아멕스,SEHK:홍콩,SHAA:중국상해,SZAA:중국심천,TKSE:일본,HASE:베트남하노이,VNSE:호치민 "PDNO": itm_no, # 종목번호(상품번호) "ORGN_ODNO": orgn_odno, # 원주문번호 정정 또는 취소할 원주문번호 (해외주식_주문 API ouput ODNO or 해외주식 미체결내역 API output ODNO 참고) "RVSE_CNCL_DVSN_CD": rvse_cncl_dvsn_cd, # 정정 : 01, 취소 : 02 "ORD_QTY": str(int(qty)), # 주문수량 [잔량전부 취소/정정주문] "0" 설정 ( QTY_ALL_ORD_YN=Y 설정 ) [잔량일부 취소/정정주문] 취소/정정 수량 "OVRS_ORD_UNPR": str(int(unpr)), # 해외주문단가 [정정] 소수점 포함, 1주당 가격 [취소] "0" 설정 "CTAC_TLNO": "", # 연락전화번호 "MGCO_APTM_ODNO": "", # 운용사지정주문번호 "ORD_SVR_DVSN_CD": "0" # 주문서버구분코드 } 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_해외주식-032] # 해외주식 기간손익 API입니다. # 한국투자 HTS(eFriend Plus) > [7717] 해외 기간손익 화면의 기능을 API로 개발한 사항으로, 해당 화면을 참고하시면 기능을 이해하기 쉽습니다. # # * 해외주식 서비스 신청 후 이용 가능합니다. (아래 링크 3번 해외증권 거래신청 참고) # https://securities.koreainvestment.com/main/bond/research/_static/TF03ca010001.jsp # # [해외 기간손익 유의 사항] # ■ 단순 매체결내역을 기초로 만든 화면으로 매도체결시점의 체결기준 매입단가와 비교하여 손익이 계산됩니다. # 결제일의 환율과 금액을 기준으로 산출하는 해외주식 양도소득세 계산방식과는 상이하오니, 참고용으로만 활용하여 주시기 바랍니다. # ■ 기간손익은 매매일 익일부터 조회가능합니다. # ■ 매입금액/매도금액 원화 환산 시 매도일의 환율이 적용되어있습니다. # ■ 손익금액의 비용은 "매도비용" 만 포함되어있습니다. 단, 동일 종목의 매수/매도가 동시에 있는 경우에는 해당일 발생한 매수비용도 함께 계산됩니다. # ■ 담보상환내역은 기간손익화면에 표시되지 많으니 참고하여 주시기 바랍니다. ############################################################################################## # 해외주식 기간손익 List를 DataFrame 으로 반환 # Input: None (Option) 상세 Input값 변경이 필요한 경우 API문서 참조 # Output: DataFrame (Option) output API 문서 참조 등 def get_overseas_inquire_period_profit(excg_cd="", crcy="", itm_no="", st_dt="", ed_dt="", tr_cont="", FK100="", NK100="", dataframe=None): url = '/uapi/overseas-stock/v1/trading/inquire-period-profit' tr_id = "TTTS3039R" t_cnt = 0 if st_dt =="": st_dt = datetime.today().strftime("%Y%m%d") # 기간손익 시작일자 값이 없으면 현재일자 if ed_dt =="": ed_dt = datetime.today().strftime("%Y%m%d") # 기간손익 종료일자 값이 없으면 현재일자 params = { "CANO": kis.getTREnv().my_acct, # 종합계좌번호 8자리 "ACNT_PRDT_CD": kis.getTREnv().my_prod, # 계좌상품코드 2자리 "OVRS_EXCG_CD": excg_cd, # 해외거래소코드, 공란:전체,NASD:미국,SEHK:홍콩,SHAA:중국,TKSE:일본,HASE:베트남 "NATN_CD": "", # 국가코드 공란(Default) "CRCY_CD": crcy, # 통화코드 공란:전체,USD:미국달러,HKD:홍콩달러,CNY:중국위안화,JPY:일본엔화,VND:베트남동 "PDNO": itm_no, # 상품번호 공란:전체 "INQR_STRT_DT": st_dt, # 조회시작일자 YYYYMMDD "INQR_END_DT": ed_dt, # 조회종료일자 YYYYMMDD "WCRC_FRCR_DVSN_CD": "02", # 원화외화구분코드 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) if str(res.getBody().rt_cd) == "0": current_data = pd.DataFrame(res.getBody().output2, index=[0]) dataframe = current_data else: print(res.getBody().msg_cd + "," + res.getBody().msg1) #print(res.getErrorCode() + "," + res.getErrorMessage()) dataframe = None return dataframe ############################################################################################## # [해외주식] 주문/계좌 > 해외주식 기간손익[v1_해외주식-032] ############################################################################################## # 해외주식 기간손익 List를 DataFrame 으로 반환 # Input: None (Option) 상세 Input값 변경이 필요한 경우 API문서 참조 # Output: DataFrame (Option) output API 문서 참조 등 def get_overseas_inquire_period_profit_output1(excg_cd="", crcy="", itm_no="", st_dt="", ed_dt="", tr_cont="", FK100="", NK100="", dataframe=None): url = '/uapi/overseas-stock/v1/trading/inquire-period-profit' tr_id = "TTTS3039R" t_cnt = 0 if st_dt =="": st_dt = datetime.today().strftime("%Y%m%d") # 기간손익 시작일자 값이 없으면 현재일자 if ed_dt =="": ed_dt = datetime.today().strftime("%Y%m%d") # 기간손익 종료일자 값이 없으면 현재일자 params = { "CANO": kis.getTREnv().my_acct, # 종합계좌번호 8자리 "ACNT_PRDT_CD": kis.getTREnv().my_prod, # 계좌상품코드 2자리 "OVRS_EXCG_CD": excg_cd, # 해외거래소코드, 공란:전체,NASD:미국,SEHK:홍콩,SHAA:중국,TKSE:일본,HASE:베트남 "NATN_CD": "", # 국가코드 공란(Default) "CRCY_CD": crcy, # 통화코드 공란:전체,USD:미국달러,HKD:홍콩달러,CNY:중국위안화,JPY:일본엔화,VND:베트남동 "PDNO": itm_no, # 상품번호 공란:전체 "INQR_STRT_DT": st_dt, # 조회시작일자 YYYYMMDD "INQR_END_DT": ed_dt, # 조회종료일자 YYYYMMDD "WCRC_FRCR_DVSN_CD": "02", # 원화외화구분코드 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().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_overseas_inquire_period_profit_output1(excg_cd, crcy, itm_no, st_dt, ed_dt, "N", FK100, NK100, dataframe) ############################################################################################## # [해외주식] 주문/계좌 > 해외증거금 통화별조회 [해외주식-035] # 해외증거금 통화별조회 API입니다. # 한국투자 HTS(eFriend Plus) > [7718] 해외주식 증거금상세 화면 의 기능을 API로 개발한 사항으로, 해당 화면을 참고하시면 기능을 이해하기 쉽습니다. ############################################################################################## # 해외주식 기간손익 List를 DataFrame 으로 반환 # Input: None (Option) 상세 Input값 변경이 필요한 경우 API문서 참조 # Output: DataFrame (Option) output API 문서 참조 등 def get_overseas_inquire_foreign_margin(tr_cont="", FK100="", NK100="", dataframe=None): url = '/uapi/overseas-stock/v1/trading/foreign-margin' tr_id = "TTTC2101R" params = { "CANO": kis.getTREnv().my_acct, # 종합계좌번호 8자리 "ACNT_PRDT_CD": kis.getTREnv().my_prod # 계좌상품코드 2자리 } 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.loc[current_data.crcy_cd != ""] # 통화코드(crcy_cd) 값이 없는 경우 제외 else: print(res.getBody().msg_cd + "," + res.getBody().msg1) #print(res.getErrorCode() + "," + res.getErrorMessage()) dataframe = None return dataframe ############################################################################################## # [해외주식] 주문/계좌 > 해외주식 일별거래내역 [해외주식-063] # 해외주식 일별거래내역 API입니다. # 한국투자 HTS(eFriend Plus) > [0828] 해외증권 일별거래내역 화면 의 기능을 API로 개발한 사항으로, 해당 화면을 참고하시면 기능을 이해하기 쉽습니다. # # ※ 체결가격, 매매금액, 정산금액, 수수료 원화금액은 국내 결제일까지는 예상환율로 적용되고, 국내 결제일 익일부터 확정환율로 적용됨으로 금액이 변경될 수 있습니다. # ※ 해외증권 투자 및 업무문의 안내: 한국투자증권 해외투자지원부 02)3276-5300 ############################################################################################## # 해외주식 일별거래내역 List를 DataFrame 으로 반환 # Input: None (Option) 상세 Input값 변경이 필요한 경우 API문서 참조 # Output: DataFrame (Option) output API 문서 참조 등 def get_overseas_inquire_period_trans(excg_cd="", dvsn="", itm_no="", st_dt="", ed_dt="", tr_cont="", FK100="", NK100="", dataframe=None): url = '/uapi/overseas-stock/v1/trading/inquire-period-trans' tr_id = "CTOS4001R" t_cnt = 0 if st_dt =="": st_dt = datetime.today().strftime("%Y%m%d") # 기간손익 시작일자 값이 없으면 현재일자 if ed_dt =="": ed_dt = datetime.today().strftime("%Y%m%d") # 기간손익 종료일자 값이 없으면 현재일자 params = { "CANO": kis.getTREnv().my_acct, # 종합계좌번호 8자리 "ACNT_PRDT_CD": kis.getTREnv().my_prod, # 계좌상품코드 2자리 "ERLM_STRT_DT": st_dt, # 조회시작일자 YYYYMMDD "ERLM_END_DT": ed_dt, # 조회종료일자 YYYYMMDD "OVRS_EXCG_CD": excg_cd, # 해외거래소코드, 공란:전체,NASD:미국,SEHK:홍콩,SHAA:중국,TKSE:일본,HASE:베트남 "PDNO": itm_no, # 상품번호 공란:전체 "SLL_BUY_DVSN_CD": dvsn, # 매도매수구분코드 00(전체), 01(매도), 02(매수) "LOAN_DVSN_CD": "", # 대출구분코드 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().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") 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_inquire_period_trans(excg_cd, dvsn, itm_no, st_dt, ed_dt, "N", FK100, NK100, dataframe) ############################################################################################## # [해외주식] 주문/계좌 > 해외주식 일별거래내역합계 [해외주식-063] ############################################################################################## # 해외주식 일별거래내역합계 List를 DataFrame 으로 반환 # Input: None (Option) 상세 Input값 변경이 필요한 경우 API문서 참조 # Output: DataFrame (Option) output API 문서 참조 등 def get_overseas_inquire_period_trans_output2(excg_cd="", dvsn="", itm_no="", st_dt="", ed_dt="", tr_cont="", FK100="", NK100="", dataframe=None): url = '/uapi/overseas-stock/v1/trading/inquire-period-trans' tr_id = "CTOS4001R" t_cnt = 0 params = { "CANO": kis.getTREnv().my_acct, # 종합계좌번호 8자리 "ACNT_PRDT_CD": kis.getTREnv().my_prod, # 계좌상품코드 2자리 "ERLM_STRT_DT": st_dt, # 조회시작일자 YYYYMMDD "ERLM_END_DT": ed_dt, # 조회종료일자 YYYYMMDD "OVRS_EXCG_CD": excg_cd, # 해외거래소코드, 공란:전체,NASD:미국,SEHK:홍콩,SHAA:중국,TKSE:일본,HASE:베트남 "PDNO": itm_no, # 상품번호 공란:전체 "SLL_BUY_DVSN_CD": dvsn, # 매도매수구분코드 00(전체), 01(매도), 02(매수) "LOAN_DVSN_CD": "", # 대출구분코드 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) if str(res.getBody().rt_cd) == "0": current_data = pd.DataFrame(res.getBody().output2, index=[0]) dataframe = current_data else: print(res.getBody().msg_cd + "," + res.getBody().msg1) #print(res.getErrorCode() + "," + res.getErrorMessage()) dataframe = None return dataframe ############################################################################################## # [해외주식] 주문/계좌 > 해외주식 결제기준잔고 [해외주식-064] # 해외주식 결제기준잔고 API입니다. # 한국투자 HTS(eFriend Plus) > [0829] 해외 결제기준잔고 화면 의 기능을 API로 개발한 사항으로, 해당 화면을 참고하시면 기능을 이해하기 쉽습니다. # # ※ 적용환율은 당일 매매기준이며, 현재가의 경우 지연된 시세로 평가되므로 실제매도금액과 상이할 수 있습니다. # ※ 주문가능수량 : 보유수량 - 미결제 매도수량 # ※ 매입금액 계산 시 결제일의 최초고시환율을 적용하므로, 금일 최초고시환율을 적용하는 체결기준 잔고와는 상이합니다. # ※ 해외증권 투자 및 업무문의 안내: 한국투자증권 해외투자지원부 02)3276-5300 ############################################################################################## # 해외주식 결제기준잔고 List를 DataFrame 으로 반환 # Input: None (Option) 상세 Input값 변경이 필요한 경우 API문서 참조 # Output: DataFrame (Option) output API 문서 참조 등 def get_overseas_inquire_paymt_stdr_balance(dv="03", dt="", dvsn="01", inqr_dvsn="00", tr_cont="", FK100="", NK100="", dataframe=None): url = '/uapi/overseas-stock/v1/trading/inquire-paymt-stdr-balance' tr_id = "CTRP6010R" t_cnt = 0 if dt =="": dt = datetime.today().strftime("%Y%m%d") # 기간손익 시작일자 값이 없으면 현재일자 params = { "CANO": kis.getTREnv().my_acct, # 종합계좌번호 8자리 "ACNT_PRDT_CD": kis.getTREnv().my_prod, # 계좌상품코드 2자리 "BASS_DT": dt, # 기준일자(YYYYMMDD) "WCRC_FRCR_DVSN_CD": dvsn, # 원화외화구분코드 01 : 원화, 02 : 외화 "INQR_DVSN_CD": inqr_dvsn # 00 : 전체,01 : 일반해외주식,02 : 미니스탁 } res = kis._url_fetch(url, tr_id, tr_cont, params) if str(res.getBody().rt_cd) == "0": if dv == "01": current_data = pd.DataFrame(res.getBody().output1) elif dv == "02": current_data = pd.DataFrame(res.getBody().output2) else: current_data = pd.DataFrame(res.getBody().output3, index=[0]) dataframe = current_data else: print(res.getBody().msg_cd + "," + res.getBody().msg1) #print(res.getErrorCode() + "," + res.getErrorMessage()) dataframe = None return dataframe #====| [해외주식] 기본시세 |============================================================================================================================ ############################################################################################## # [해외주식] 기본시세 > 해외주식 현재체결가 ############################################################################################## def get_overseas_price_quot_price(excd="", itm_no="", tr_cont="", dataframe=None): url = '/uapi/overseas-price/v1/quotations/price' tr_id = "HHDFS00000300" # 해외주식 현재체결가 params = { "AUTH": "", # 사용자권한정보 : 사용안함 "EXCD": excd, # 거래소코드 HKS : 홍콩,NYS : 뉴욕,NAS : 나스닥,AMS : 아멕스,TSE : 도쿄,SHS : 상해,SZS : 심천,SHI : 상해지수 # SZI : 심천지수,HSX : 호치민,HNX : 하노이,BAY : 뉴욕(주간),BAQ : 나스닥(주간),BAA : 아멕스(주간) "SYMB": 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().output, index=[0]) dataframe = current_data return dataframe ############################################################################################## # [해외주식] 기본시세 > 해외주식 기간별시세 ############################################################################################## def get_overseas_price_quot_dailyprice(excd="", itm_no="", gubn="", bymd="", modp="0", tr_cont="", dataframe=None): url = '/uapi/overseas-price/v1/quotations/dailyprice' tr_id = "HHDFS76240000" # 해외주식 기간별시세 if bymd is None: bymd = datetime.today().strftime("%Y%m%d") # 종료일자 값이 없으면 현재일자 params = { "AUTH": "", # (사용안함) 사용자권한정보 "EXCD": excd, # 거래소코드 HKS : 홍콩,NYS : 뉴욕,NAS : 나스닥,AMS : 아멕스,TSE : 도쿄,SHS : 상해,SZS : 심천,SHI : 상해지수 # SZI : 심천지수,HSX : 호치민,HNX : 하노이,BAY : 뉴욕(주간),BAQ : 나스닥(주간),BAA : 아멕스(주간) "SYMB": itm_no, # 종목번호 "GUBN": gubn, # 일/주/월구분 0:일. 1:주, 2:월 "BYMD": bymd, # 조회기준일자(YYYYMMDD) ※ 공란 설정 시, 기준일 오늘 날짜로 설정 "MODP": modp, # 수정주가반영여부 0 : 미반영, 1 : 반영 "KEYB": "" # (사용안함) NEXT KEY BUFF 응답시 다음값이 있으면 값이 셋팅되어 있으므로 다음 조회시 응답값 그대로 셋팅 } 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 ########################################################################### # [해외주식] 기본시세 > 해외주식 종목/지수/환율기간별시세(일/주/월/년) → 기본정보 ########################################################################### # 해외주식 종목/지수/환율기간별시세(일/주/월/년) API입니다. # 해외지수 당일 시세의 경우 지연시세 or 종가시세가 제공됩니다. # ※ 해당 API로 미국주식 조회 시, 다우30, 나스닥100, S&P500 종목만 조회 가능합니다. # 더 많은 미국주식 종목 시세를 이용할 시에는, 해외주식기간별시세 API 사용 부탁드립니다. ########################################################################### def get_overseas_price_quot_inquire_daily_price(div="N", itm_no="", inqr_strt_dt="", inqr_end_dt="", period="D", tr_cont="", dataframe=None): url = '/uapi/overseas-price/v1/quotations/inquire-daily-chartprice' tr_id = "FHKST03030100" # 해외주식 종목/지수/환율기간별시세(일/주/월/년) 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 = { "FID_COND_MRKT_DIV_CODE": div, # 시장 분류 코드 N: 해외지수, X 환율, I: 국채, S:금선물 "FID_INPUT_ISCD": itm_no, # 종목번호 ※ 해외주식 마스터 코드 참조 (포럼 > FAQ > 종목정보 다운로드 > 해외주식) # ※ 해당 API로 미국주식 조회 시, 다우30, 나스닥100, S&P500 종목만 조회 가능합니다. 더 많은 미국주식 종목 시세를 이용할 시에는, 해외주식기간별시세 API 사용 부탁드립니다. "FID_INPUT_DATE_1": inqr_strt_dt, # 시작일자(YYYYMMDD) "FID_INPUT_DATE_2": inqr_end_dt, # 종료일자(YYYYMMDD) "FID_PERIOD_DIV_CODE": period # 기간분류코드 D:일, W:주, M:월, Y:년 } 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 ############################################################################################## # [해외주식] 기본시세 > 해외주식 종목/지수/환율기간별시세(일/주/월/년) → 일자별정보 (최대 30일까지 조회) ############################################################################################## def get_overseas_price_quot_inquire_daily_chartprice(div="N", itm_no="", inqr_strt_dt="", inqr_end_dt="", period="D", tr_cont="", dataframe=None): url = '/uapi/overseas-price/v1/quotations/inquire-daily-chartprice' tr_id = "FHKST03030100" # 해외주식 종목/지수/환율기간별시세(일/주/월/년) 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 = { "FID_COND_MRKT_DIV_CODE": div, # 시장 분류 코드 N: 해외지수, X 환율, I: 국채, S:금선물 "FID_INPUT_ISCD": itm_no, # 종목번호 ※ 해외주식 마스터 코드 참조 (포럼 > FAQ > 종목정보 다운로드 > 해외주식) # ※ 해당 API로 미국주식 조회 시, 다우30, 나스닥100, S&P500 종목만 조회 가능합니다. 더 많은 미국주식 종목 시세를 이용할 시에는, 해외주식기간별시세 API 사용 부탁드립니다. "FID_INPUT_DATE_1": inqr_strt_dt, # 시작일자(YYYYMMDD) "FID_INPUT_DATE_2": inqr_end_dt, # 종료일자(YYYYMMDD) "FID_PERIOD_DIV_CODE": period # 기간분류코드 D:일, W:주, M:월, Y:년 } 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 ########################################################################### # [해외주식] 기본시세 > 해외주식조건검색 → 기본정보 ########################################################################### # 해외주식 조건검색 API입니다. # # 현재 조건검색 결과값은 최대 100개까지 조회 가능합니다. 다음 조회(100개 이후의 값) 기능에 대해서는 개선검토 중에 있습니다. # # ※ 그날 거래량이나 시세 형성이 안된 종목은 해외주식 기간별시세(HHDFS76240000)에서는 조회되지만 # 해외주식 조건검색(HHDFS76410000)에서 조회되지 않습니다. (EX. NAS AATC) # # [미국주식시세 이용시 유의사항] # ■ 무료 실시간 시세(0분 지연) 제공 # ※ 무료(매수/매도 각 1호가) : 나스닥 마켓센터에서 거래되는 호가 및 호가 잔량 정보 # ※ 유료(매수/매도 각 1호가) : 미국 전체 거래소들의 통합 주문체결 및 최우선 호가 # ■ 무료 실시간 시세 서비스는 유료 실시간 시세 서비스 대비 평균 50% 수준에 해당하는 정보이므로 # 현재가/호가/순간체결량/차트 등에서 일시적·부분적 차이가 있을 수 있습니다. # ■ 무료∙유료 모두 미국에 상장된 종목(뉴욕, 나스닥, 아멕스 등)의 시세를 제공하며, 동일한 시스템을 사용하여 주문∙체결됩니다. # 단, 무료∙유료의 기반 데이터 차이로 호가 및 체결 데이터는 차이가 발생할 수 있고, 이로 인해 발생하는 손실에 대해서 당사가 책임지지 않습니다. # ■ 무료 실시간 시세 서비스의 시가, 저가, 고가, 종가는 유료 실시간 시세 서비스와 다를 수 있으며, # 종목별 과거 데이터(거래량, 시가, 종가, 고가, 차트 데이터 등)는 장 종료 후(오후 12시경) 유료 실시간 시세 서비스 데이터와 동일하게 업데이트됩니다. # ■ 유료 실시간 시세 서비스는 신청 시 1~12개월까지 기간 선택 후 해당 요금을 일괄 납부하며, # 해지 시 해지한 달의 말일까지 시세 제공 후 남은 기간 해당 금액이 환급되니 유의하시기 바랍니다. # (출처: 한국투자증권 외화증권 거래설명서 - https://www.truefriend.com/main/customer/guide/Guide.jsp?&cmd=TF04ag010002¤tPage=1&num=64) ########################################################################### def get_overseas_price_quot_inquire_search(div="02", excd="", pr_st="", pr_en="", rate_st="", rate_en="", vol_st="", vol_en="", per_st="", per_en="", eps_st="", eps_en="", amt_st="", amt_en="", shar_st="", shar_en="", valx_st="", valx_en="", tr_cont="", dataframe=None): url = '/uapi/overseas-price/v1/quotations/inquire-search' tr_id = "HHDFS76410000" # [해외주식] 기본시세 > 해외주식조건검색 pr_yn = "" rate_yn = "" vol_yn = "" per_yn = "" eps_yn = "" amt_yn = "" shar_yn = "" valx_yn = "" if pr_st != "" and pr_en != "": pr_yn = "1" if rate_st != "" and rate_en != "": rate_yn = "1" if vol_st != "" and vol_en != "": vol_yn = "1" if per_st != "" and per_en != "": per_yn = "1" if eps_st != "" and eps_en != "": eps_yn = "1" if amt_st != "" and amt_en != "": amt_yn = "1" if shar_st != "" and shar_en != "": shar_yn = "1" if valx_st != "" and valx_en != "": valx_yn = "1" params = { "AUTH": "", # (사용안함)사용자권한정보(Null 값 설정) "EXCD": excd, # 거래소코드 NYS:뉴욕, NAS:나스닥, AMS:아멕스, HKS:홍콩, SHS:상해, SZS:심천, HSX:호치민, HNX:하노이, TSE:도쿄 "CO_YN_PRICECUR": pr_yn, # 현재가선택조건 해당조건 사용시(1), 미사용시 필수항목아님 "CO_ST_PRICECUR": pr_st, # 현재가시작범위가 "CO_EN_PRICECUR": pr_en, # 현재가끝범위가 "CO_YN_RATE": rate_yn, # 등락율선택조건 해당조건 사용시(1), 미사용시 필수항목아님 "CO_ST_RATE": rate_st, # 등락율시작율 "CO_EN_RATE": rate_en, # 등락율끝율 "CO_YN_VOLUME": vol_yn, # 거래량선택조건 해당조건 사용시(1), 미사용시 필수항목아님 "CO_ST_VOLUME": vol_st, # 거래량시작량 "CO_EN_VOLUME": vol_en, # 거래량끝량 "CO_YN_PER": per_yn, # PER선택조건 해당조건 사용시(1), 미사용시 필수항목아님 "CO_ST_PER": per_st, # PER시작 "CO_EN_PER": per_en, # PER끝 "CO_YN_EPS": eps_yn, # EPS선택조건 해당조건 사용시(1), 미사용시 필수항목아님 "CO_ST_EPS": eps_st, # EPS시작 "CO_EN_EPS": eps_en, # EPS끝 "CO_YN_AMT": amt_yn, # 거래대금선택조건 해당조건 사용시(1), 미사용시 필수항목아님 "CO_ST_AMT": amt_st, # 거래대금시작금 "CO_EN_AMT": amt_en, # 거래대금끝금 "CO_YN_SHAR": shar_yn, # 발행주식수선택조건 해당조건 사용시(1), 미사용시 필수항목아님 "CO_ST_SHAR": shar_st, # 발행주식시작수 "CO_EN_SHAR": shar_en, # 발행주식끝수 "CO_YN_VALX": valx_yn, # 시가총액선택조건 "CO_ST_VALX": valx_st, # 시가총액시작액 "CO_EN_VALX": valx_en, # 시가총액끝액 "KEYB": "" # (사용안함)NEXT KEY BUFF } res = kis._url_fetch(url, tr_id, tr_cont, params) # Assuming 'output' is a dictionary that you want to convert to a DataFrame if div == "01": current_data = pd.DataFrame(res.getBody().output2) else: current_data = pd.DataFrame(res.getBody().output1, index=[0]) dataframe = current_data return dataframe ########################################################################### # [해외주식] 기본시세 > 해외결제일자조회[해외주식] ########################################################################### # 해외결제일자조회 API입니다. ########################################################################### def get_overseas_price_quot_countries_holiday(dt="", tr_cont="", FK100="", NK100="", dataframe=None): url = '/uapi/overseas-stock/v1/quotations/countries-holiday' tr_id = "CTOS5011R" # [해외주식] 기본시세 > 해외결제일자조회 if dt == "": dt = datetime.today().strftime("%Y%m%d") # 시작일자 값이 없으면 현재일자 params = { "TRAD_DT": dt, # 기준일자(YYYYMMDD) "CTX_AREA_FK": FK100, # 공란 : 최초 조회시 이전 조회 Output CTX_AREA_FK 값 : 다음페이지 조회시(2번째부터) "CTX_AREA_NK": NK100 # 공란 : 최초 조회시 이전 조회 Output CTX_AREA_NK 값 : 다음페이지 조회시(2번째부터) } 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().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_fk, res.getBody().ctx_area_nk # 페이징 처리 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_overseas_price_quot_countries_holiday(dt, "N", FK100, NK100, dataframe) ############################################################################################## # [해외주식] 기본시세 > 해외주식 현재가상세 # 개요 # 해외주식 현재가상세 API입니다. # 해당 API를 활용하여 해외주식 종목의 매매단위(vnit), 호가단위(e_hogau), PER, PBR, EPS, BPS 등의 데이터를 확인하실 수 있습니다. # 해외주식 시세는 무료시세(지연시세)만이 제공되며, API로는 유료시세(실시간시세)를 받아보실 수 없습니다. # ※ 지연시세 지연시간 : 미국 - 실시간무료(0분지연) / 홍콩, 베트남, 중국 - 15분지연 / 일본 - 15분지연 # 미국의 경우 0분지연시세로 제공되나, 장중 당일 시가는 상이할 수 있으며, 익일 정정 표시됩니다. # ※ 추후 HTS(efriend Plus) [7781] 시세신청(실시간) 화면에서 유료 서비스 신청 시 실시간 시세 수신할 수 있도록 변경 예정 # [미국주식시세 이용시 유의사항] # ■ 무료 실시간 시세(0분 지연) 제공 # ※ 무료(매수/매도 각 1호가) : 나스닥 마켓센터에서 거래되는 호가 및 호가 잔량 정보 # ※ 유료(매수/매도 각 1호가) : 미국 전체 거래소들의 통합 주문체결 및 최우선 호가 # ■ 무료 실시간 시세 서비스는 유료 실시간 시세 서비스 대비 평균 50% 수준에 해당하는 정보이므로 # 현재가/호가/순간체결량/차트 등에서 일시적·부분적 차이가 있을 수 있습니다. # ■ 무료∙유료 모두 미국에 상장된 종목(뉴욕, 나스닥, 아멕스 등)의 시세를 제공하며, 동일한 시스템을 사용하여 주문∙체결됩니다. # 단, 무료∙유료의 기반 데이터 차이로 호가 및 체결 데이터는 차이가 발생할 수 있고, 이로 인해 발생하는 손실에 대해서 당사가 책임지지 않습니다. # ■ 무료 실시간 시세 서비스의 시가, 저가, 고가, 종가는 유료 실시간 시세 서비스와 다를 수 있으며, # 종목별 과거 데이터(거래량, 시가, 종가, 고가, 차트 데이터 등)는 장 종료 후(오후 12시경) 유료 실시간 시세 서비스 데이터와 동일하게 업데이트됩니다. # ■ 유료 실시간 시세 서비스는 신청 시 1~12개월까지 기간 선택 후 해당 요금을 일괄 납부하며, # 해지 시 해지한 달의 말일까지 시세 제공 후 남은 기간 해당 금액이 환급되니 유의하시기 바랍니다. # (출처: 한국투자증권 외화증권 거래설명서 - https://www.truefriend.com/main/customer/guide/Guide.jsp?&cmd=TF04ag010002¤tPage=1&num=64) ############################################################################################## # 해외주식 현재가상세 시세 Object를 DataFrame 으로 반환 # Input: None (Option) 상세 Input값 변경이 필요한 경우 API문서 참조 # Output: DataFrame (Option) output def get_overseas_price_quot_price_detail(excd="", itm_no="", tr_cont="", dataframe=None): url = '/uapi/overseas-price/v1/quotations/price-detail' tr_id = "HHDFS76200200" # 해외주식 현재가상세 params = { "AUTH": "", # 시장 분류 코드 J : 주식/ETF/ETN, W: ELW "EXCD": excd, # 종목번호 (6자리) ETN의 경우, Q로 시작 (EX. Q500001) "SYMB": 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 ############################################################################################## # [해외주식] 기본시세 > 해외주식분봉조회 # 해외주식분봉조회 API입니다. # 실전계좌의 경우, 최근 120건까지 확인 가능합니다. # # ※ 해외주식 분봉은 정규장만 제공됩니다. # # [미국주식시세 이용시 유의사항] # ■ 무료 실시간 시세(0분 지연) 제공 # ※ 무료(매수/매도 각 1호가) : 나스닥 마켓센터에서 거래되는 호가 및 호가 잔량 정보 # ※ 유료(매수/매도 각 1호가) : 미국 전체 거래소들의 통합 주문체결 및 최우선 호가 # ■ 무료 실시간 시세 서비스는 유료 실시간 시세 서비스 대비 평균 50% 수준에 해당하는 정보이므로 # 현재가/호가/순간체결량/차트 등에서 일시적·부분적 차이가 있을 수 있습니다. # ■ 무료∙유료 모두 미국에 상장된 종목(뉴욕, 나스닥, 아멕스 등)의 시세를 제공하며, 동일한 시스템을 사용하여 주문∙체결됩니다. # 단, 무료∙유료의 기반 데이터 차이로 호가 및 체결 데이터는 차이가 발생할 수 있고, 이로 인해 발생하는 손실에 대해서 당사가 책임지지 않습니다. # ■ 무료 실시간 시세 서비스의 시가, 저가, 고가, 종가는 유료 실시간 시세 서비스와 다를 수 있으며, # 종목별 과거 데이터(거래량, 시가, 종가, 고가, 차트 데이터 등)는 장 종료 후(오후 12시경) 유료 실시간 시세 서비스 데이터와 동일하게 업데이트됩니다. # ■ 유료 실시간 시세 서비스는 신청 시 1~12개월까지 기간 선택 후 해당 요금을 일괄 납부하며, # 해지 시 해지한 달의 말일까지 시세 제공 후 남은 기간 해당 금액이 환급되니 유의하시기 바랍니다. # (출처: 한국투자증권 외화증권 거래설명서 - https://www.truefriend.com/main/customer/guide/Guide.jsp?&cmd=TF04ag010002¤tPage=1&num=64) ############################################################################################## # 해외주식 해외주식분봉조회 시세 Object를 DataFrame 으로 반환 # Input: None (Option) 상세 Input값 변경이 필요한 경우 API문서 참조 # Output: DataFrame (Option) output def get_overseas_price_quot_inquire_time_itemchartprice(div="02", excd="", itm_no="", nmin="", pinc="0", tr_cont="", dataframe=None): url = '/uapi/overseas-price/v1/quotations/inquire-time-itemchartprice' tr_id = "HHDFS76950200" # 해외주식 해외주식분봉조회 params = { "AUTH": "", # 시장 분류 코드 J : 주식/ETF/ETN, W: ELW "EXCD": excd, # 거래소코드 HKS : 홍콩,NYS : 뉴욕,NAS : 나스닥,AMS : 아멕스,TSE : 도쿄,SHS : 상해,SZS : 심천,SHI : 상해지수 # SZI : 심천지수,HSX : 호치민,HNX : 하노이,BAY : 뉴욕(주간),BAQ : 나스닥(주간),BAA : 아멕스(주간) "SYMB": itm_no, # 종목코드(ex. TSLA) "NMIN": nmin, # 분갭 분단위(1: 1분봉, 2: 2분봉, ...) "PINC": pinc, # 전일포함여부(0:당일 1:전일포함) "NEXT": "", # (사용안함)다음여부 "NREC": "120", # 요청갯수 레코드요청갯수 (최대 120) "FILL": "", # (사용안함)미체결채움구분 "KEYB": "" # (사용안함)NEXT KEY BUFF } res = kis._url_fetch(url, tr_id, tr_cont, params) # Assuming 'output' is a dictionary that you want to convert to a DataFrame if div == "02": current_data = pd.DataFrame(res.getBody().output2) else: current_data = pd.DataFrame(res.getBody().output1, index=[0]) dataframe = current_data return dataframe ############################################################################################## # [해외주식] 기본시세 > 해외지수분봉조회 # 해외지수분봉조회 API입니다. # 실전계좌의 경우, 최근 102건까지 확인 가능합니다. ############################################################################################## # 해외주식 해외지수분봉조회 시세 Object를 DataFrame 으로 반환 # Input: None (Option) 상세 Input값 변경이 필요한 경우 API문서 참조 # Output: DataFrame (Option) output def get_overseas_price_quot_inquire_time_indexchartprice(div="01", code="N", iscd="", tm_dv="0", inc="N", tr_cont="", dataframe=None): url = '/uapi/overseas-price/v1/quotations/inquire-time-indexchartprice' tr_id = "FHKST03030200" # 해외주식 해외지수분봉조회 params = { "FID_COND_MRKT_DIV_CODE": code, # 시장 분류 코드 N 해외지수, X 환율, KX 원화환율 "FID_INPUT_ISCD": iscd, # 종목코드 "FID_HOUR_CLS_CODE": tm_dv, # 시간 구분 코드 0: 정규장, 1: 시간외 "FID_PW_DATA_INCU_YN": inc # 과거 데이터 포함 여부 (Y/N) } res = kis._url_fetch(url, tr_id, tr_cont, params) # Assuming 'output' is a dictionary that you want to convert to a DataFrame if div == "02": current_data = pd.DataFrame(res.getBody().output2) else: current_data = pd.DataFrame(res.getBody().output1, index=[0]) dataframe = current_data return dataframe ############################################################################################## # [해외주식] 기본시세 > 해외주식 상품기본정보 ############################################################################################## # 해외주식 상품기본정보 시세 Object를 DataFrame 으로 반환 # Input: None (Option) 상세 Input값 변경이 필요한 경우 API문서 참조 # Output: DataFrame (Option) output def get_overseas_price_search_info(itm_no="", prdt_type_cd="", tr_cont="", FK100="", NK100="", dataframe=None): url = '/uapi/overseas-price/v1/quotations/search-info' tr_id = "CTPF1702R" # 해외주식 상품기본정보 params = { "PDNO": itm_no, # 종목번호 (6자리) ETN의 경우, Q로 시작 (EX. Q500001) "PRDT_TYPE_CD": prdt_type_cd # 종목유형 512 미국 나스닥 / 513 미국 뉴욕 / 529 미국 아멕스 / 515 일본 / 501 홍콩 / 543 홍콩CNY / 558 홍콩USD # 507 베트남 하노이 / 508 베트남 호치민 / 551 중국 상해A / 552 중국 심천A } 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 ############################################################################################## # [해외주식] 기본시세 > 해외주식 현재가 1호가 # 해외주식 현재가 호가 API입니다. # 한국투자 HTS(eFriend Plus) > [7620] 해외주식 현재가 화면에서 "왼쪽 호가 창" 기능을 API로 개발한 사항으로, 해당 화면을 참고하시면 기능을 이해하기 쉽습니다. # # ※ 지연시세 지연시간 : 미국 - 실시간무료(0분지연, 나스닥 마켓센터에서 거래되는 호가 및 호가 잔량 정보) # 홍콩, 베트남, 중국 - 15분지연 / 일본 - 15분지연 # 미국의 경우 0분지연시세로 제공되나, 장중 당일 시가는 상이할 수 있으며, 익일 정정 표시됩니다. # ※ 추후 HTS(efriend Plus) [7781] 시세신청(실시간) 화면에서 유료 서비스 신청 시 유료시세 수신할 수 있도록 변경 예정 # # [미국주식시세 이용시 유의사항] # ■ 무료 실시간 시세(0분 지연) 제공 # ※ 무료(매수/매도 각 1호가) : 나스닥 마켓센터에서 거래되는 호가 및 호가 잔량 정보 # ※ 유료(매수/매도 각 1호가) : 미국 전체 거래소들의 통합 주문체결 및 최우선 호가 # ■ 무료 실시간 시세 서비스는 유료 실시간 시세 서비스 대비 평균 50% 수준에 해당하는 정보이므로 # 현재가/호가/순간체결량/차트 등에서 일시적·부분적 차이가 있을 수 있습니다. # ■ 무료∙유료 모두 미국에 상장된 종목(뉴욕, 나스닥, 아멕스 등)의 시세를 제공하며, 동일한 시스템을 사용하여 주문∙체결됩니다. # 단, 무료∙유료의 기반 데이터 차이로 호가 및 체결 데이터는 차이가 발생할 수 있고, 이로 인해 발생하는 손실에 대해서 당사가 책임지지 않습니다. # ■ 무료 실시간 시세 서비스의 시가, 저가, 고가, 종가는 유료 실시간 시세 서비스와 다를 수 있으며, # 종목별 과거 데이터(거래량, 시가, 종가, 고가, 차트 데이터 등)는 장 종료 후(오후 12시경) 유료 실시간 시세 서비스 데이터와 동일하게 업데이트됩니다. # ■ 유료 실시간 시세 서비스는 신청 시 1~12개월까지 기간 선택 후 해당 요금을 일괄 납부하며, # 해지 시 해지한 달의 말일까지 시세 제공 후 남은 기간 해당 금액이 환급되니 유의하시기 바랍니다. # (출처: 한국투자증권 외화증권 거래설명서 - https://www.truefriend.com/main/customer/guide/Guide.jsp?&cmd=TF04ag010002¤tPage=1&num=64) ############################################################################################## # 해외주식 해외주식 현재가 1호가 Object를 DataFrame 으로 반환 # Input: None (Option) 상세 Input값 변경이 필요한 경우 API문서 참조 # Output: DataFrame (Option) output def get_overseas_price_inquire_asking_price(div="", excd="", itm_no="", tr_cont="", FK100="", NK100="", dataframe=None): url = '/uapi/overseas-price/v1/quotations/inquire-asking-price' tr_id = "HHDFS76200100" # 해외주식 현재가 1호가 params = { "AUTH": "", # (사용안함) 공백 "EXCD": excd, # 거래소코드 "SYMB": 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 if div == "01": current_data = pd.DataFrame(res.getBody().output1, index=[0]) # 01:기본시세 elif div == "02": current_data = pd.DataFrame(res.getBody().output2, index=[0]) # 02:1호가 else: current_data = pd.DataFrame(res.getBody().output3, index=[0]) # getBody() kis_auth.py 존재 dataframe = current_data return dataframe