""" Created on 20250101 """ import sys import logging from typing import Optional import pandas as pd sys.path.extend(['../..', '.']) import kis_auth as ka # 로깅 설정 logging.basicConfig(level=logging.INFO) ############################################################################################## # [국내주식] 시세분석 > 관심종목(멀티종목) 시세조회 [국내주식-205] ############################################################################################## # 상수 정의 API_URL = "/uapi/domestic-stock/v1/quotations/intstock-multprice" def intstock_multprice( fid_cond_mrkt_div_code_1: str, # [필수] 조건 시장 분류 코드1 (ex. J) fid_input_iscd_1: str, # [필수] 입력 종목코드1 (ex. 123456) fid_cond_mrkt_div_code_2: Optional[str] = None, # 조건 시장 분류 코드2 fid_input_iscd_2: Optional[str] = None, # 입력 종목코드2 fid_cond_mrkt_div_code_3: Optional[str] = None, # 조건 시장 분류 코드3 fid_input_iscd_3: Optional[str] = None, # 입력 종목코드3 fid_cond_mrkt_div_code_4: Optional[str] = None, # 조건 시장 분류 코드4 fid_input_iscd_4: Optional[str] = None, # 입력 종목코드4 fid_cond_mrkt_div_code_5: Optional[str] = None, # 조건 시장 분류 코드5 fid_input_iscd_5: Optional[str] = None, # 입력 종목코드5 fid_cond_mrkt_div_code_6: Optional[str] = None, # 조건 시장 분류 코드6 fid_input_iscd_6: Optional[str] = None, # 입력 종목코드6 fid_cond_mrkt_div_code_7: Optional[str] = None, # 조건 시장 분류 코드7 fid_input_iscd_7: Optional[str] = None, # 입력 종목코드7 fid_cond_mrkt_div_code_8: Optional[str] = None, # 조건 시장 분류 코드8 fid_input_iscd_8: Optional[str] = None, # 입력 종목코드8 fid_cond_mrkt_div_code_9: Optional[str] = None, # 조건 시장 분류 코드9 fid_input_iscd_9: Optional[str] = None, # 입력 종목코드9 fid_cond_mrkt_div_code_10: Optional[str] = None, # 조건 시장 분류 코드10 fid_input_iscd_10: Optional[str] = None, # 입력 종목코드10 fid_cond_mrkt_div_code_11: Optional[str] = None, # 조건 시장 분류 코드11 fid_input_iscd_11: Optional[str] = None, # 입력 종목코드11 fid_cond_mrkt_div_code_12: Optional[str] = None, # 조건 시장 분류 코드12 fid_input_iscd_12: Optional[str] = None, # 입력 종목코드12 fid_cond_mrkt_div_code_13: Optional[str] = None, # 조건 시장 분류 코드13 fid_input_iscd_13: Optional[str] = None, # 입력 종목코드13 fid_cond_mrkt_div_code_14: Optional[str] = None, # 조건 시장 분류 코드14 fid_input_iscd_14: Optional[str] = None, # 입력 종목코드14 fid_cond_mrkt_div_code_15: Optional[str] = None, # 조건 시장 분류 코드15 fid_input_iscd_15: Optional[str] = None, # 입력 종목코드15 fid_cond_mrkt_div_code_16: Optional[str] = None, # 조건 시장 분류 코드16 fid_input_iscd_16: Optional[str] = None, # 입력 종목코드16 fid_cond_mrkt_div_code_17: Optional[str] = None, # 조건 시장 분류 코드17 fid_input_iscd_17: Optional[str] = None, # 입력 종목코드17 fid_cond_mrkt_div_code_18: Optional[str] = None, # 조건 시장 분류 코드18 fid_input_iscd_18: Optional[str] = None, # 입력 종목코드18 fid_cond_mrkt_div_code_19: Optional[str] = None, # 조건 시장 분류 코드19 fid_input_iscd_19: Optional[str] = None, # 입력 종목코드19 fid_cond_mrkt_div_code_20: Optional[str] = None, # 조건 시장 분류 코드20 fid_input_iscd_20: Optional[str] = None, # 입력 종목코드20 fid_cond_mrkt_div_code_21: Optional[str] = None, # 조건 시장 분류 코드21 fid_input_iscd_21: Optional[str] = None, # 입력 종목코드21 fid_cond_mrkt_div_code_22: Optional[str] = None, # 조건 시장 분류 코드22 fid_input_iscd_22: Optional[str] = None, # 입력 종목코드22 fid_cond_mrkt_div_code_23: Optional[str] = None, # 조건 시장 분류 코드23 fid_input_iscd_23: Optional[str] = None, # 입력 종목코드23 fid_cond_mrkt_div_code_24: Optional[str] = None, # 조건 시장 분류 코드24 fid_input_iscd_24: Optional[str] = None, # 입력 종목코드24 fid_cond_mrkt_div_code_25: Optional[str] = None, # 조건 시장 분류 코드25 fid_input_iscd_25: Optional[str] = None, # 입력 종목코드25 fid_cond_mrkt_div_code_26: Optional[str] = None, # 조건 시장 분류 코드26 fid_input_iscd_26: Optional[str] = None, # 입력 종목코드26 fid_cond_mrkt_div_code_27: Optional[str] = None, # 조건 시장 분류 코드27 fid_input_iscd_27: Optional[str] = None, # 입력 종목코드27 fid_cond_mrkt_div_code_28: Optional[str] = None, # 조건 시장 분류 코드28 fid_input_iscd_28: Optional[str] = None, # 입력 종목코드28 fid_cond_mrkt_div_code_29: Optional[str] = None, # 조건 시장 분류 코드29 fid_input_iscd_29: Optional[str] = None, # 입력 종목코드29 fid_cond_mrkt_div_code_30: Optional[str] = None, # 조건 시장 분류 코드30 fid_input_iscd_30: Optional[str] = None # 입력 종목코드30 ) -> pd.DataFrame: """ 관심종목(멀티종목) 시세조회 API입니다. ① 관심종목 그룹조회 → ② 관심종목 그룹별 종목조회 → ③ 관심종목(멀티종목) 시세조회 순서대로 호출하셔서 관심종목 시세 조회 가능합니다. ※ 한 번의 호출에 최대 30종목의 시세 확인 가능합니다. 그룹별종목조회 결과를 아래와 같이 입력하셔서 총 30종목까지 복수종목 조회 가능합니다.(아래 Example 참고) . fid_mrkt_cls_code(시장구분) → FID_COND_MRKT_DIV_CODE_1 . jong_code(종목코드) 1 → FID_INPUT_ISCD_1 ... 한국투자증권 Github 에서 관심종목 복수시세조회 파이썬 샘플코드를 참고하실 수 있습니다. https://github.com/koreainvestment/open-trading-api/blob/main/rest/interest_stocks_price.py Args: fid_cond_mrkt_div_code_1 (str): [필수] 조건 시장 분류 코드1 (J:KRX, NX:NXT) fid_input_iscd_1 (str): [필수] 입력 종목코드1 (ex. 123456) fid_cond_mrkt_div_code_2 (Optional[str]): 조건 시장 분류 코드2 fid_input_iscd_2 (Optional[str]): 입력 종목코드2 fid_cond_mrkt_div_code_3 (Optional[str]): 조건 시장 분류 코드3 fid_input_iscd_3 (Optional[str]): 입력 종목코드3 fid_cond_mrkt_div_code_4 (Optional[str]): 조건 시장 분류 코드4 fid_input_iscd_4 (Optional[str]): 입력 종목코드4 fid_cond_mrkt_div_code_5 (Optional[str]): 조건 시장 분류 코드5 fid_input_iscd_5 (Optional[str]): 입력 종목코드5 fid_cond_mrkt_div_code_6 (Optional[str]): 조건 시장 분류 코드6 fid_input_iscd_6 (Optional[str]): 입력 종목코드6 fid_cond_mrkt_div_code_7 (Optional[str]): 조건 시장 분류 코드7 fid_input_iscd_7 (Optional[str]): 입력 종목코드7 fid_cond_mrkt_div_code_8 (Optional[str]): 조건 시장 분류 코드8 fid_input_iscd_8 (Optional[str]): 입력 종목코드8 fid_cond_mrkt_div_code_9 (Optional[str]): 조건 시장 분류 코드9 fid_input_iscd_9 (Optional[str]): 입력 종목코드9 fid_cond_mrkt_div_code_10 (Optional[str]): 조건 시장 분류 코드10 fid_input_iscd_10 (Optional[str]): 입력 종목코드10 fid_cond_mrkt_div_code_11 (Optional[str]): 조건 시장 분류 코드11 fid_input_iscd_11 (Optional[str]): 입력 종목코드11 fid_cond_mrkt_div_code_12 (Optional[str]): 조건 시장 분류 코드12 fid_input_iscd_12 (Optional[str]): 입력 종목코드12 fid_cond_mrkt_div_code_13 (Optional[str]): 조건 시장 분류 코드13 fid_input_iscd_13 (Optional[str]): 입력 종목코드13 fid_cond_mrkt_div_code_14 (Optional[str]): 조건 시장 분류 코드14 fid_input_iscd_14 (Optional[str]): 입력 종목코드14 fid_cond_mrkt_div_code_15 (Optional[str]): 조건 시장 분류 코드15 fid_input_iscd_15 (Optional[str]): 입력 종목코드15 fid_cond_mrkt_div_code_16 (Optional[str]): 조건 시장 분류 코드16 fid_input_iscd_16 (Optional[str]): 입력 종목코드16 fid_cond_mrkt_div_code_17 (Optional[str]): 조건 시장 분류 코드17 fid_input_iscd_17 (Optional[str]): 입력 종목코드17 fid_cond_mrkt_div_code_18 (Optional[str]): 조건 시장 분류 코드18 fid_input_iscd_18 (Optional[str]): 입력 종목코드18 fid_cond_mrkt_div_code_19 (Optional[str]): 조건 시장 분류 코드19 fid_input_iscd_19 (Optional[str]): 입력 종목코드19 fid_cond_mrkt_div_code_20 (Optional[str]): 조건 시장 분류 코드20 fid_input_iscd_20 (Optional[str]): 입력 종목코드20 fid_cond_mrkt_div_code_21 (Optional[str]): 조건 시장 분류 코드21 fid_input_iscd_21 (Optional[str]): 입력 종목코드21 fid_cond_mrkt_div_code_22 (Optional[str]): 조건 시장 분류 코드22 fid_input_iscd_22 (Optional[str]): 입력 종목코드22 fid_cond_mrkt_div_code_23 (Optional[str]): 조건 시장 분류 코드23 fid_input_iscd_23 (Optional[str]): 입력 종목코드23 fid_cond_mrkt_div_code_24 (Optional[str]): 조건 시장 분류 코드24 fid_input_iscd_24 (Optional[str]): 입력 종목코드24 fid_cond_mrkt_div_code_25 (Optional[str]): 조건 시장 분류 코드25 fid_input_iscd_25 (Optional[str]): 입력 종목코드25 fid_cond_mrkt_div_code_26 (Optional[str]): 조건 시장 분류 코드26 fid_input_iscd_26 (Optional[str]): 입력 종목코드26 fid_cond_mrkt_div_code_27 (Optional[str]): 조건 시장 분류 코드27 fid_input_iscd_27 (Optional[str]): 입력 종목코드27 fid_cond_mrkt_div_code_28 (Optional[str]): 조건 시장 분류 코드28 fid_input_iscd_28 (Optional[str]): 입력 종목코드28 fid_cond_mrkt_div_code_29 (Optional[str]): 조건 시장 분류 코드29 fid_input_iscd_29 (Optional[str]): 입력 종목코드29 fid_cond_mrkt_div_code_30 (Optional[str]): 조건 시장 분류 코드30 fid_input_iscd_30 (Optional[str]): 입력 종목코드30 Returns: pd.DataFrame: 관심종목(멀티종목) 시세 데이터 Example: >>> df = intstock_multprice(fid_cond_mrkt_div_code_1="J", fid_input_iscd_1="419530") >>> print(df) """ if fid_cond_mrkt_div_code_1 == "": raise ValueError("fid_cond_mrkt_div_code_1 is required (e.g. 'J')") if fid_input_iscd_1 == "": raise ValueError("fid_input_iscd_1 is required (e.g. '123456')") tr_id = "FHKST11300006" # 관심종목(멀티종목) 시세조회 params = { "FID_COND_MRKT_DIV_CODE_1": fid_cond_mrkt_div_code_1, "FID_INPUT_ISCD_1": fid_input_iscd_1 } # 옵션 파라미터 처리 if fid_cond_mrkt_div_code_2 is not None: params["FID_COND_MRKT_DIV_CODE_2"] = fid_cond_mrkt_div_code_2 if fid_input_iscd_2 is not None: params["FID_INPUT_ISCD_2"] = fid_input_iscd_2 if fid_cond_mrkt_div_code_3 is not None: params["FID_COND_MRKT_DIV_CODE_3"] = fid_cond_mrkt_div_code_3 if fid_input_iscd_3 is not None: params["FID_INPUT_ISCD_3"] = fid_input_iscd_3 if fid_cond_mrkt_div_code_4 is not None: params["FID_COND_MRKT_DIV_CODE_4"] = fid_cond_mrkt_div_code_4 if fid_input_iscd_4 is not None: params["FID_INPUT_ISCD_4"] = fid_input_iscd_4 if fid_cond_mrkt_div_code_5 is not None: params["FID_COND_MRKT_DIV_CODE_5"] = fid_cond_mrkt_div_code_5 if fid_input_iscd_5 is not None: params["FID_INPUT_ISCD_5"] = fid_input_iscd_5 if fid_cond_mrkt_div_code_6 is not None: params["FID_COND_MRKT_DIV_CODE_6"] = fid_cond_mrkt_div_code_6 if fid_input_iscd_6 is not None: params["FID_INPUT_ISCD_6"] = fid_input_iscd_6 if fid_cond_mrkt_div_code_7 is not None: params["FID_COND_MRKT_DIV_CODE_7"] = fid_cond_mrkt_div_code_7 if fid_input_iscd_7 is not None: params["FID_INPUT_ISCD_7"] = fid_input_iscd_7 if fid_cond_mrkt_div_code_8 is not None: params["FID_COND_MRKT_DIV_CODE_8"] = fid_cond_mrkt_div_code_8 if fid_input_iscd_8 is not None: params["FID_INPUT_ISCD_8"] = fid_input_iscd_8 if fid_cond_mrkt_div_code_9 is not None: params["FID_COND_MRKT_DIV_CODE_9"] = fid_cond_mrkt_div_code_9 if fid_input_iscd_9 is not None: params["FID_INPUT_ISCD_9"] = fid_input_iscd_9 if fid_cond_mrkt_div_code_10 is not None: params["FID_COND_MRKT_DIV_CODE_10"] = fid_cond_mrkt_div_code_10 if fid_input_iscd_10 is not None: params["FID_INPUT_ISCD_10"] = fid_input_iscd_10 if fid_cond_mrkt_div_code_11 is not None: params["FID_COND_MRKT_DIV_CODE_11"] = fid_cond_mrkt_div_code_11 if fid_input_iscd_11 is not None: params["FID_INPUT_ISCD_11"] = fid_input_iscd_11 if fid_cond_mrkt_div_code_12 is not None: params["FID_COND_MRKT_DIV_CODE_12"] = fid_cond_mrkt_div_code_12 if fid_input_iscd_12 is not None: params["FID_INPUT_ISCD_12"] = fid_input_iscd_12 if fid_cond_mrkt_div_code_13 is not None: params["FID_COND_MRKT_DIV_CODE_13"] = fid_cond_mrkt_div_code_13 if fid_input_iscd_13 is not None: params["FID_INPUT_ISCD_13"] = fid_input_iscd_13 if fid_cond_mrkt_div_code_14 is not None: params["FID_COND_MRKT_DIV_CODE_14"] = fid_cond_mrkt_div_code_14 if fid_input_iscd_14 is not None: params["FID_INPUT_ISCD_14"] = fid_input_iscd_14 if fid_cond_mrkt_div_code_15 is not None: params["FID_COND_MRKT_DIV_CODE_15"] = fid_cond_mrkt_div_code_15 if fid_input_iscd_15 is not None: params["FID_INPUT_ISCD_15"] = fid_input_iscd_15 if fid_cond_mrkt_div_code_16 is not None: params["FID_COND_MRKT_DIV_CODE_16"] = fid_cond_mrkt_div_code_16 if fid_input_iscd_16 is not None: params["FID_INPUT_ISCD_16"] = fid_input_iscd_16 if fid_cond_mrkt_div_code_17 is not None: params["FID_COND_MRKT_DIV_CODE_17"] = fid_cond_mrkt_div_code_17 if fid_input_iscd_17 is not None: params["FID_INPUT_ISCD_17"] = fid_input_iscd_17 if fid_cond_mrkt_div_code_18 is not None: params["FID_COND_MRKT_DIV_CODE_18"] = fid_cond_mrkt_div_code_18 if fid_input_iscd_18 is not None: params["FID_INPUT_ISCD_18"] = fid_input_iscd_18 if fid_cond_mrkt_div_code_19 is not None: params["FID_COND_MRKT_DIV_CODE_19"] = fid_cond_mrkt_div_code_19 if fid_input_iscd_19 is not None: params["FID_INPUT_ISCD_19"] = fid_input_iscd_19 if fid_cond_mrkt_div_code_20 is not None: params["FID_COND_MRKT_DIV_CODE_20"] = fid_cond_mrkt_div_code_20 if fid_input_iscd_20 is not None: params["FID_INPUT_ISCD_20"] = fid_input_iscd_20 if fid_cond_mrkt_div_code_21 is not None: params["FID_COND_MRKT_DIV_CODE_21"] = fid_cond_mrkt_div_code_21 if fid_input_iscd_21 is not None: params["FID_INPUT_ISCD_21"] = fid_input_iscd_21 if fid_cond_mrkt_div_code_22 is not None: params["FID_COND_MRKT_DIV_CODE_22"] = fid_cond_mrkt_div_code_22 if fid_input_iscd_22 is not None: params["FID_INPUT_ISCD_22"] = fid_input_iscd_22 if fid_cond_mrkt_div_code_23 is not None: params["FID_COND_MRKT_DIV_CODE_23"] = fid_cond_mrkt_div_code_23 if fid_input_iscd_23 is not None: params["FID_INPUT_ISCD_23"] = fid_input_iscd_23 if fid_cond_mrkt_div_code_24 is not None: params["FID_COND_MRKT_DIV_CODE_24"] = fid_cond_mrkt_div_code_24 if fid_input_iscd_24 is not None: params["FID_INPUT_ISCD_24"] = fid_input_iscd_24 if fid_cond_mrkt_div_code_25 is not None: params["FID_COND_MRKT_DIV_CODE_25"] = fid_cond_mrkt_div_code_25 if fid_input_iscd_25 is not None: params["FID_INPUT_ISCD_25"] = fid_input_iscd_25 if fid_cond_mrkt_div_code_26 is not None: params["FID_COND_MRKT_DIV_CODE_26"] = fid_cond_mrkt_div_code_26 if fid_input_iscd_26 is not None: params["FID_INPUT_ISCD_26"] = fid_input_iscd_26 if fid_cond_mrkt_div_code_27 is not None: params["FID_COND_MRKT_DIV_CODE_27"] = fid_cond_mrkt_div_code_27 if fid_input_iscd_27 is not None: params["FID_INPUT_ISCD_27"] = fid_input_iscd_27 if fid_cond_mrkt_div_code_28 is not None: params["FID_COND_MRKT_DIV_CODE_28"] = fid_cond_mrkt_div_code_28 if fid_input_iscd_28 is not None: params["FID_INPUT_ISCD_28"] = fid_input_iscd_28 if fid_cond_mrkt_div_code_29 is not None: params["FID_COND_MRKT_DIV_CODE_29"] = fid_cond_mrkt_div_code_29 if fid_input_iscd_29 is not None: params["FID_INPUT_ISCD_29"] = fid_input_iscd_29 if fid_cond_mrkt_div_code_30 is not None: params["FID_COND_MRKT_DIV_CODE_30"] = fid_cond_mrkt_div_code_30 if fid_input_iscd_30 is not None: params["FID_INPUT_ISCD_30"] = fid_input_iscd_30 res = ka._url_fetch(API_URL, tr_id, "", params) if res.isOK(): current_data = pd.DataFrame(res.getBody().output) logging.info("Data fetch complete.") return current_data else: res.printError(url=API_URL) return pd.DataFrame()