# -*- coding: utf-8 -*- """ Created on 2025-06-19 """ import sys import logging import pandas as pd sys.path.extend(['../..', '.']) # kis_auth 파일 경로 추가 import kis_auth as ka from cond_search import cond_search # 로깅 설정 logging.basicConfig(level=logging.INFO, format='%(levelname)s - %(message)s') logger = logging.getLogger(__name__) ############################################################################################## # [국내주식] ELW시세 - ELW 종목검색[국내주식-166] ############################################################################################## COLUMN_MAPPING = { 'bond_shrn_iscd': '채권단축종목코드', 'hts_kor_isnm': 'HTS한글종목명', 'rght_type_name': '권리유형명', 'elw_prpr': 'ELW현재가', 'prdy_vrss': '전일대비', 'prdy_vrss_sign': '전일대비부호', 'prdy_ctrt': '전일대비율', 'acml_vol': '누적거래량', 'acpr': '행사가', 'stck_cnvr_rate': '주식전환비율', 'stck_lstn_date': '주식상장일자', 'stck_last_tr_date': '주식최종거래일자', 'hts_rmnn_dynu': 'HTS잔존일수', 'unas_isnm': '기초자산종목명', 'unas_prpr': '기초자산현재가', 'unas_prdy_vrss': '기초자산전일대비', 'unas_prdy_vrss_sign': '기초자산전일대비부호', 'unas_prdy_ctrt': '기초자산전일대비율', 'unas_acml_vol': '기초자산누적거래량', 'moneyness': 'MONEYNESS', 'atm_cls_name': 'ATM구분명', 'prit': '패리티', 'delta_val': '델타값', 'hts_ints_vltl': 'HTS내재변동성', 'tmvl_val': '시간가치값', 'gear': '기어링', 'lvrg_val': '레버리지값', 'prls_qryr_rate': '손익분기비율', 'cfp': '자본지지점', 'lstn_stcn': '상장주수', 'pblc_co_name': '발행회사명', 'lp_mbcr_name': 'LP회원사명', 'lp_hldn_rate': 'LP보유비율', 'elw_rght_form': 'ELW권리형태', 'elw_ko_barrier': '조기종료발생기준가격', 'apprch_rate': '접근도', 'unas_shrn_iscd': '기초자산단축종목코드', 'mtrt_date': '만기일자', 'prmm_val': '프리미엄값', 'stck_lp_fin_date': '주식LP종료일자', 'tick_conv_prc': '틱환산가', 'prls_qryr_stpr_prc': '손익분기주가가격', 'lp_hvol': 'LP보유량' } NUMERIC_COLUMNS = [ 'elw_prpr', 'prdy_ctrt', 'acml_vol', 'acpr', 'stck_cnvr_rate', 'hts_rmnn_dynu', 'unas_prpr', 'unas_prdy_ctrt', 'unas_acml_vol', 'moneyness', 'prit', 'delta_val', 'hts_ints_vltl', 'tmvl_val', 'gear', 'lvrg_val', 'prls_qryr_rate', 'cfp', 'lstn_stcn', 'pblc_co_name', 'lp_mbcr_name', 'lp_hldn_rate', 'elw_rght_form', 'elw_ko_barrier', 'apprch_rate', 'unas_shrn_iscd', 'mtrt_date', 'prmm_val', 'stck_lp_fin_date', 'tick_conv_prc', 'prls_qryr_stpr_prc', 'lp_hvol' ] def main(): """ [국내주식] ELW시세 ELW 종목검색[국내주식-166] ELW 종목검색 테스트 함수 Parameters: - fid_cond_mrkt_div_code (str): 조건시장분류코드 (ELW(W)) - fid_cond_scr_div_code (str): 조건화면분류코드 (화면번호(11510)) - fid_rank_sort_cls_code (str): 순위정렬구분코드 ('정렬1정렬안함(0)종목코드(1)현재가(2)대비율(3)거래량(4)행사가격(5) 전환비율(6)상장일(7)만기일(8)잔존일수(9)레버리지(10)') - fid_input_cnt_1 (str): 입력수1 (정렬1기준 - 상위(1)하위(2)) - fid_rank_sort_cls_code_2 (str): 순위정렬구분코드2 (정렬2) - fid_input_cnt_2 (str): 입력수2 (정렬2기준 - 상위(1)하위(2)) - fid_rank_sort_cls_code_3 (str): 순위정렬구분코드3 (정렬3) - fid_input_cnt_3 (str): 입력수3 (정렬3기준 - 상위(1)하위(2)) - fid_trgt_cls_code (str): 대상구분코드 (0:발행회사종목코드,1:기초자산종목코드,2:FID시장구분코드,3:FID입력날짜1(상장일), 4:FID입력날짜2(만기일),5:LP회원사종목코드,6:행사가기초자산비교>=(1) <=(2), 7:잔존일 이상 이하, 8:현재가, 9:전일대비율, 10:거래량, 11:최종거래일, 12:레버리지) - fid_input_iscd (str): 입력종목코드 (발행사종목코드전체(00000)) - fid_unas_input_iscd (str): 기초자산입력종목코드 () - fid_mrkt_cls_code (str): 시장구분코드 (권리유형전체(A)콜(CO)풋(PO)) - fid_input_date_1 (str): 입력날짜1 (상장일전체(0)금일(1)7일이하(2)8~30일(3)31~90일(4)) - fid_input_date_2 (str): 입력날짜2 (만기일전체(0)1개월(1)1~2(2)2~3(3)3~6(4)6~9(5)9~12(6)12이상(7)) - fid_input_iscd_2 (str): 입력종목코드2 () - fid_etc_cls_code (str): 기타구분코드 (행사가전체(0)>=(1)) - fid_input_rmnn_dynu_1 (str): 입력잔존일수1 (잔존일이상) - fid_input_rmnn_dynu_2 (str): 입력잔존일수2 (잔존일이하) - fid_prpr_cnt1 (str): 현재가수1 (현재가이상) - fid_prpr_cnt2 (str): 현재가수2 (현재가이하) - fid_rsfl_rate1 (str): 등락비율1 (전일대비율이상) - fid_rsfl_rate2 (str): 등락비율2 (전일대비율이하) - fid_vol1 (str): 거래량1 (거래량이상) - fid_vol2 (str): 거래량2 (거래량이하) - fid_aply_rang_prc_1 (str): 적용범위가격1 (최종거래일from) - fid_aply_rang_prc_2 (str): 적용범위가격2 (최종거래일to) - fid_lvrg_val1 (str): 레버리지값1 () - fid_lvrg_val2 (str): 레버리지값2 () - fid_vol3 (str): 거래량3 (LP종료일from) - fid_vol4 (str): 거래량4 (LP종료일to) - fid_ints_vltl1 (str): 내재변동성1 (내재변동성이상) - fid_ints_vltl2 (str): 내재변동성2 (내재변동성이하) - fid_prmm_val1 (str): 프리미엄값1 (프리미엄이상) - fid_prmm_val2 (str): 프리미엄값2 (프리미엄이하) - fid_gear1 (str): 기어링1 (기어링이상) - fid_gear2 (str): 기어링2 (기어링이하) - fid_prls_qryr_rate1 (str): 손익분기비율1 (손익분기이상) - fid_prls_qryr_rate2 (str): 손익분기비율2 (손익분기이하) - fid_delta1 (str): 델타1 (델타이상) - fid_delta2 (str): 델타2 (델타이하) - fid_acpr1 (str): 행사가1 () - fid_acpr2 (str): 행사가2 () - fid_stck_cnvr_rate1 (str): 주식전환비율1 (전환비율이상) - fid_stck_cnvr_rate2 (str): 주식전환비율2 (전환비율이하) - fid_div_cls_code (str): 분류구분코드 (0:전체,1:일반,2:조기종료) - fid_prit1 (str): 패리티1 (패리티이상) - fid_prit2 (str): 패리티2 (패리티이하) - fid_cfp1 (str): 자본지지점1 (배리어이상) - fid_cfp2 (str): 자본지지점2 (배리어이하) - fid_input_nmix_price_1 (str): 지수가격1 (LP보유비율이상) - fid_input_nmix_price_2 (str): 지수가격2 (LP보유비율이하) - fid_egea_val1 (str): E기어링값1 (접근도이상) - fid_egea_val2 (str): E기어링값2 (접근도이하) - fid_input_dvdn_ert (str): 배당수익율 (손익분기점이상) - fid_input_hist_vltl (str): 역사적변동성 (손익분기점이하) - fid_theta1 (str): 세타1 (MONEYNESS이상) - fid_theta2 (str): 세타2 (MONEYNESS이하) Returns: - DataFrame: ELW 종목검색 결과 Example: >>> df = cond_search(fid_cond_mrkt_div_code="W", fid_cond_scr_div_code="11510", fid_rank_sort_cls_code="0", fid_input_cnt_1="100") """ try: # pandas 출력 옵션 설정 pd.set_option('display.max_columns', None) # 모든 컬럼 표시 pd.set_option('display.width', None) # 출력 너비 제한 해제 pd.set_option('display.max_rows', None) # 모든 행 표시 # 토큰 발급 logger.info("토큰 발급 중...") ka.auth() logger.info("토큰 발급 완료") # api 호출 logger.info("API 호출 ") result = cond_search( fid_cond_mrkt_div_code="W", # 조건시장분류코드 fid_cond_scr_div_code="11510", # 조건화면분류코드 fid_rank_sort_cls_code="0", # 순위정렬구분코드 fid_input_cnt_1="100", # 입력수1 fid_rank_sort_cls_code_2="", # 순위정렬구분코드2 fid_input_cnt_2="", # 입력수2 fid_rank_sort_cls_code_3="", # 순위정렬구분코드3 fid_input_cnt_3="", # 입력수3 fid_trgt_cls_code="", # 대상구분코드 fid_input_iscd="", # 입력종목코드 fid_unas_input_iscd="", # 기초자산입력종목코드 fid_mrkt_cls_code="", # 시장구분코드 fid_input_date_1="", # 입력날짜1 fid_input_date_2="", # 입력날짜2 fid_input_iscd_2="", # 입력종목코드2 fid_etc_cls_code="", # 기타구분코드 fid_input_rmnn_dynu_1="", # 입력잔존일수1 fid_input_rmnn_dynu_2="", # 입력잔존일수2 fid_prpr_cnt1="", # 현재가수1 fid_prpr_cnt2="", # 현재가수2 fid_rsfl_rate1="", # 등락비율1 fid_rsfl_rate2="", # 등락비율2 fid_vol1="", # 거래량1 fid_vol2="", # 거래량2 fid_aply_rang_prc_1="", # 적용범위가격1 fid_aply_rang_prc_2="", # 적용범위가격2 fid_lvrg_val1="", # 레버리지값1 fid_lvrg_val2="", # 레버리지값2 fid_vol3="", # 거래량3 fid_vol4="", # 거래량4 fid_ints_vltl1="", # 내재변동성1 fid_ints_vltl2="", # 내재변동성2 fid_prmm_val1="", # 프리미엄값1 fid_prmm_val2="", # 프리미엄값2 fid_gear1="", # 기어링1 fid_gear2="", # 기어링2 fid_prls_qryr_rate1="", # 손익분기비율1 fid_prls_qryr_rate2="", # 손익분기비율2 fid_delta1="", # 델타1 fid_delta2="", # 델타2 fid_acpr1="", # 행사가1 fid_acpr2="", # 행사가2 fid_stck_cnvr_rate1="", # 주식전환비율1 fid_stck_cnvr_rate2="", # 주식전환비율2 fid_div_cls_code="", # 분류구분코드 fid_prit1="", # 패리티1 fid_prit2="", # 패리티2 fid_cfp1="", # 자본지지점1 fid_cfp2="", # 자본지지점2 fid_input_nmix_price_1="", # 지수가격1 fid_input_nmix_price_2="", # 지수가격2 fid_egea_val1="", # E기어링값1 fid_egea_val2="", # E기어링값2 fid_input_dvdn_ert="", # 배당수익율 fid_input_hist_vltl="", # 역사적변동성 fid_theta1="", # 세타1 fid_theta2="", # 세타2 ) if result is None or result.empty: logger.warning("조회된 데이터가 없습니다.") return # 컬럼명 출력 logger.info("사용 가능한 컬럼 목록:") logger.info(result.columns.tolist()) # 숫자형 컬럼 소수점 둘째자리까지 표시 for col in NUMERIC_COLUMNS: if col in result.columns: result[col] = pd.to_numeric(result[col], errors='coerce').round(2) # 한글 컬럼명으로 변환 result = result.rename(columns=COLUMN_MAPPING) # 컬럼명 출력 logger.info("사용 가능한 컬럼 목록:") logger.info(result.columns.tolist()) # 결과 출력 logger.info("=== ELW 종목검색 결과 ===") logger.info("조회된 데이터 건수: %d", len(result)) print(result) except Exception as e: logger.error("에러 발생: %s", str(e)) raise if __name__ == "__main__": main()