309 lines
17 KiB
Python
309 lines
17 KiB
Python
"""
|
|
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() |