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,90 @@
"""
Created on 20250601
"""
import sys
import logging
import pandas as pd
sys.path.extend(['../..', '.'])
import kis_auth as ka
from search_opt_detail import search_opt_detail
# 로깅 설정
logging.basicConfig(level=logging.INFO)
##############################################################################################
# [해외선물옵션] 기본시세 > 해외옵션 상품기본정보 [해외선물-041]
##############################################################################################
# 컬럼명 매핑
COLUMN_MAPPING = {
'exch_cd': '거래소코드',
'clas_cd': '품목종류',
'crc_cd': '거래통화',
'sttl_price': '정산가',
'sttl_date': '정산일',
'trst_mgn': '증거금',
'disp_digit': '가격표시진법',
'tick_sz': '틱사이즈',
'tick_val': '틱가치',
'mrkt_open_date': '장개시일자',
'mrkt_open_time': '장개시시각',
'mrkt_close_date': '장마감일자',
'mrkt_close_time': '장마감시각',
'trd_fr_date': '상장일',
'expr_date': '만기일',
'trd_to_date': '최종거래일',
'remn_cnt': '잔존일수',
'stat_tp': '매매여부',
'ctrt_size': '계약크기',
'stl_tp': '최종결제구분',
'frst_noti_date': '최초식별일'
}
# 숫자형 컬럼
NUMERIC_COLUMNS = []
def main():
"""
해외옵션 상품기본정보 조회 테스트 함수
이 함수는 해외옵션 상품기본정보 API를 호출하여 결과를 출력합니다.
테스트 데이터로 6AM24 종목코드를 사용합니다.
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 = search_opt_detail(qry_cnt="1", srs_cd_01="6AM24")
except ValueError as e:
logging.error("에러 발생: %s" % str(e))
return
logging.info("사용 가능한 컬럼: %s", result.columns.tolist())
# 한글 컬럼명으로 변환
result = result.rename(columns=COLUMN_MAPPING)
# 메타데이터에 자료형이 명시적으로 'number'로 선언된 필드 없음
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,198 @@
"""
Created on 20250601
"""
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)
##############################################################################################
# [해외선물옵션] 기본시세 > 해외옵션 상품기본정보 [해외선물-041]
##############################################################################################
# 상수 정의
API_URL = "/uapi/overseas-futureoption/v1/quotations/search-opt-detail"
def search_opt_detail(
qry_cnt: str, # [필수] 요청개수 (SRS_CD_N 개수)
srs_cd_01: str, # [필수] 종목코드1
srs_cd_02: Optional[str] = "", # 종목코드2
srs_cd_03: Optional[str] = "", # 종목코드3
srs_cd_04: Optional[str] = "", # 종목코드4
srs_cd_05: Optional[str] = "", # 종목코드5
srs_cd_06: Optional[str] = "", # 종목코드6
srs_cd_07: Optional[str] = "", # 종목코드7
srs_cd_08: Optional[str] = "", # 종목코드8
srs_cd_09: Optional[str] = "", # 종목코드9
srs_cd_10: Optional[str] = "", # 종목코드10
srs_cd_11: Optional[str] = "", # 종목코드11
srs_cd_12: Optional[str] = "", # 종목코드12
srs_cd_13: Optional[str] = "", # 종목코드13
srs_cd_14: Optional[str] = "", # 종목코드14
srs_cd_15: Optional[str] = "", # 종목코드15
srs_cd_16: Optional[str] = "", # 종목코드16
srs_cd_17: Optional[str] = "", # 종목코드17
srs_cd_18: Optional[str] = "", # 종목코드18
srs_cd_19: Optional[str] = "", # 종목코드19
srs_cd_20: Optional[str] = "", # 종목코드20
srs_cd_21: Optional[str] = "", # 종목코드21
srs_cd_22: Optional[str] = "", # 종목코드22
srs_cd_23: Optional[str] = "", # 종목코드23
srs_cd_24: Optional[str] = "", # 종목코드24
srs_cd_25: Optional[str] = "", # 종목코드25
srs_cd_26: Optional[str] = "", # 종목코드26
srs_cd_27: Optional[str] = "", # 종목코드27
srs_cd_28: Optional[str] = "", # 종목코드28
srs_cd_29: Optional[str] = "", # 종목코드29
srs_cd_30: Optional[str] = "" # 종목코드30
) -> pd.DataFrame:
"""
해외옵션 상품기본정보 API입니다.
(중요) 해외옵션시세 출력값을 해석하실 때 focode.mst(해외지수옵션 종목마스터파일), fostkcode.mst(해외주식옵션 종목마스터파일)에 있는 sCalcDesz(계산 소수점) 값을 활용하셔야 정확한 값을 받아오실 수 있습니다.
- focode.mst(해외지수옵션 종목마스터파일), (해외주식옵션 종목마스터파일) 다운로드 방법
1) focode.mst(해외지수옵션 종목마스터파일)
: 포럼 > FAQ > 종목정보 다운로드(해외) - 해외지수옵션 클릭하여 다운로드 후
Github의 헤더정보(https://github.com/koreainvestment/open-trading-api/blob/main/stocks_info/해외옵션정보.h)를 참고하여 해석
2) fostkcode.mst(해외주식옵션 종목마스터파일)
: 포럼 > FAQ > 종목정보 다운로드(해외) - 해외주식옵션 클릭하여 다운로드 후
Github의 헤더정보(https://github.com/koreainvestment/open-trading-api/blob/main/stocks_info/해외주식옵션정보.h)를 참고하여 해석
- 소수점 계산 시, focode.mst(해외지수옵션 종목마스터파일), fostkcode.mst(해외주식옵션 종목마스터파일)의 sCalcDesz(계산 소수점) 값 참고
EX) focode.mst 파일의 sCalcDesz(계산 소수점) 값
품목코드 OES 계산소수점 -2 → 시세 7525 수신 시 75.25 로 해석
품목코드 O6E 계산소수점 -4 → 시세 54.0 수신 시 0.0054 로 해석
Args:
qry_cnt (str): [필수] 요청개수 (ex. SRS_CD_N 개수)
srs_cd_01 (str): [필수] 종목코드1
srs_cd_02 (Optional[str]): 종목코드2
srs_cd_03 (Optional[str]): 종목코드3
srs_cd_04 (Optional[str]): 종목코드4
srs_cd_05 (Optional[str]): 종목코드5
srs_cd_06 (Optional[str]): 종목코드6
srs_cd_07 (Optional[str]): 종목코드7
srs_cd_08 (Optional[str]): 종목코드8
srs_cd_09 (Optional[str]): 종목코드9
srs_cd_10 (Optional[str]): 종목코드10
srs_cd_11 (Optional[str]): 종목코드11
srs_cd_12 (Optional[str]): 종목코드12
srs_cd_13 (Optional[str]): 종목코드13
srs_cd_14 (Optional[str]): 종목코드14
srs_cd_15 (Optional[str]): 종목코드15
srs_cd_16 (Optional[str]): 종목코드16
srs_cd_17 (Optional[str]): 종목코드17
srs_cd_18 (Optional[str]): 종목코드18
srs_cd_19 (Optional[str]): 종목코드19
srs_cd_20 (Optional[str]): 종목코드20
srs_cd_21 (Optional[str]): 종목코드21
srs_cd_22 (Optional[str]): 종목코드22
srs_cd_23 (Optional[str]): 종목코드23
srs_cd_24 (Optional[str]): 종목코드24
srs_cd_25 (Optional[str]): 종목코드25
srs_cd_26 (Optional[str]): 종목코드26
srs_cd_27 (Optional[str]): 종목코드27
srs_cd_28 (Optional[str]): 종목코드28
srs_cd_29 (Optional[str]): 종목코드29
srs_cd_30 (Optional[str]): 종목코드30
Returns:
pd.DataFrame: 해외옵션 상품기본정보 데이터
Example:
>>> df = search_opt_detail(qry_cnt="1", srs_cd_01="6AM24")
>>> print(df)
"""
# 필수 파라미터 검증
if qry_cnt == "":
raise ValueError("qry_cnt is required (e.g. 'SRS_CD_N 개수')")
if srs_cd_01 == "":
raise ValueError("srs_cd_01 is required")
tr_id = "HHDFO55200000" # 해외옵션 상품기본정보
params = {
"QRY_CNT": qry_cnt,
"SRS_CD_01": srs_cd_01
}
# 옵션 파라미터 추가
if srs_cd_02:
params["SRS_CD_02"] = srs_cd_02
if srs_cd_03:
params["SRS_CD_03"] = srs_cd_03
if srs_cd_04:
params["SRS_CD_04"] = srs_cd_04
if srs_cd_05:
params["SRS_CD_05"] = srs_cd_05
if srs_cd_06:
params["SRS_CD_06"] = srs_cd_06
if srs_cd_07:
params["SRS_CD_07"] = srs_cd_07
if srs_cd_08:
params["SRS_CD_08"] = srs_cd_08
if srs_cd_09:
params["SRS_CD_09"] = srs_cd_09
if srs_cd_10:
params["SRS_CD_10"] = srs_cd_10
if srs_cd_11:
params["SRS_CD_11"] = srs_cd_11
if srs_cd_12:
params["SRS_CD_12"] = srs_cd_12
if srs_cd_13:
params["SRS_CD_13"] = srs_cd_13
if srs_cd_14:
params["SRS_CD_14"] = srs_cd_14
if srs_cd_15:
params["SRS_CD_15"] = srs_cd_15
if srs_cd_16:
params["SRS_CD_16"] = srs_cd_16
if srs_cd_17:
params["SRS_CD_17"] = srs_cd_17
if srs_cd_18:
params["SRS_CD_18"] = srs_cd_18
if srs_cd_19:
params["SRS_CD_19"] = srs_cd_19
if srs_cd_20:
params["SRS_CD_20"] = srs_cd_20
if srs_cd_21:
params["SRS_CD_21"] = srs_cd_21
if srs_cd_22:
params["SRS_CD_22"] = srs_cd_22
if srs_cd_23:
params["SRS_CD_23"] = srs_cd_23
if srs_cd_24:
params["SRS_CD_24"] = srs_cd_24
if srs_cd_25:
params["SRS_CD_25"] = srs_cd_25
if srs_cd_26:
params["SRS_CD_26"] = srs_cd_26
if srs_cd_27:
params["SRS_CD_27"] = srs_cd_27
if srs_cd_28:
params["SRS_CD_28"] = srs_cd_28
if srs_cd_29:
params["SRS_CD_29"] = srs_cd_29
if srs_cd_30:
params["SRS_CD_30"] = srs_cd_30
res = ka._url_fetch(API_URL, tr_id, "", params)
if res.isOK():
# 메타데이터에 따라 output2 (array)를 pd.DataFrame으로 반환
return pd.DataFrame(res.getBody().output2)
else:
res.printError(url=API_URL)
return pd.DataFrame()