251 lines
12 KiB
Python
251 lines
12 KiB
Python
# -*- 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() |