initial commit

This commit is contained in:
2026-02-04 00:16:34 +09:00
commit ae11528dd9
867 changed files with 209640 additions and 0 deletions

View File

@@ -0,0 +1,103 @@
"""
Created on 20250101
"""
import sys
import logging
import pandas as pd
sys.path.extend(['../..', '.'])
import kis_auth as ka
from intstock_multprice import intstock_multprice
# 로깅 설정
logging.basicConfig(level=logging.INFO)
##############################################################################################
# [국내주식] 시세분석 > 관심종목(멀티종목) 시세조회 [국내주식-205]
##############################################################################################
COLUMN_MAPPING = {
'kospi_kosdaq_cls_name': '코스피 코스닥 구분 명',
'mrkt_trtm_cls_name': '시장 조치 구분 명',
'hour_cls_code': '시간 구분 코드',
'inter_shrn_iscd': '관심 단축 종목코드',
'inter_kor_isnm': '관심 한글 종목명',
'inter2_prpr': '관심2 현재가',
'inter2_prdy_vrss': '관심2 전일 대비',
'prdy_vrss_sign': '전일 대비 부호',
'prdy_ctrt': '전일 대비율',
'acml_vol': '누적 거래량',
'inter2_oprc': '관심2 시가',
'inter2_hgpr': '관심2 고가',
'inter2_lwpr': '관심2 저가',
'inter2_llam': '관심2 하한가',
'inter2_mxpr': '관심2 상한가',
'inter2_askp': '관심2 매도호가',
'inter2_bidp': '관심2 매수호가',
'seln_rsqn': '매도 잔량',
'shnu_rsqn': '매수2 잔량',
'total_askp_rsqn': '총 매도호가 잔량',
'total_bidp_rsqn': '총 매수호가 잔량',
'acml_tr_pbmn': '누적 거래 대금',
'inter2_prdy_clpr': '관심2 전일 종가',
'oprc_vrss_hgpr_rate': '시가 대비 최고가 비율',
'intr_antc_cntg_vrss': '관심 예상 체결 대비',
'intr_antc_cntg_vrss_sign': '관심 예상 체결 대비 부호',
'intr_antc_cntg_prdy_ctrt': '관심 예상 체결 전일 대비율',
'intr_antc_vol': '관심 예상 거래량',
'inter2_sdpr': '관심2 기준가'
}
NUMERIC_COLUMNS = []
def main():
"""
관심종목(멀티종목) 시세조회 테스트 함수
이 함수는 관심종목(멀티종목) 시세조회 API를 호출하여 결과를 출력합니다.
테스트 데이터로 419530, 092070을 사용합니다.
Returns:
None
"""
# pandas 출력 옵션 설정
pd.set_option('display.max_columns', None) # 모든 컬럼 표시
pd.set_option('display.width', None) # 출력 너비 제한 해제
pd.set_option('display.max_rows', None) # 모든 행 표시
# 인증 토큰 발급
ka.auth()
# case1 조회
logging.info("=== case1 조회 ===")
try:
result = intstock_multprice(
fid_cond_mrkt_div_code_1="J",
fid_input_iscd_1="419530",
fid_cond_mrkt_div_code_2="J",
fid_input_iscd_2="092070"
)
except ValueError as e:
logging.error("에러 발생: %s" % str(e))
return
logging.info("사용 가능한 컬럼: %s", result.columns.tolist())
# 컬럼명 한글 변환 및 데이터 출력
result = result.rename(columns=COLUMN_MAPPING)
# 숫자형 컬럼 소수점 둘째자리까지 표시
for col in NUMERIC_COLUMNS:
if col in result.columns:
result[col] = pd.to_numeric(result[col], errors='coerce').round(2)
logging.info("결과:")
print(result)
if __name__ == "__main__":
main()

View File

@@ -0,0 +1,309 @@
"""
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()