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,128 @@
"""
Created on 2025-07-08
"""
import logging
import sys
import pandas as pd
sys.path.extend(['../..', '.'])
import kis_auth as ka
from index_exp_ccnl import index_exp_ccnl
# 로깅 설정
logging.basicConfig(level=logging.INFO, format='%(levelname)s - %(message)s')
logger = logging.getLogger(__name__)
##############################################################################################
# [국내주식] 실시간시세 > 국내지수 실시간예상체결 [실시간-027]
##############################################################################################
COLUMN_MAPPING = {
"bstp_cls_code": "업종 구분 코드",
"bsop_hour": "영업 시간",
"prpr_nmix": "현재가 지수",
"prdy_vrss_sign": "전일 대비 부호",
"bstp_nmix_prdy_vrss": "업종 지수 전일 대비",
"acml_vol": "누적 거래량",
"acml_tr_pbmn": "누적 거래 대금",
"pcas_vol": "건별 거래량",
"pcas_tr_pbmn": "건별 거래 대금",
"prdy_ctrt": "전일 대비율",
"oprc_nmix": "시가 지수",
"nmix_hgpr": "지수 최고가",
"nmix_lwpr": "지수 최저가",
"oprc_vrss_nmix_prpr": "시가 대비 지수 현재가",
"oprc_vrss_nmix_sign": "시가 대비 지수 부호",
"hgpr_vrss_nmix_prpr": "최고가 대비 지수 현재가",
"hgpr_vrss_nmix_sign": "최고가 대비 지수 부호",
"lwpr_vrss_nmix_prpr": "최저가 대비 지수 현재가",
"lwpr_vrss_nmix_sign": "최저가 대비 지수 부호",
"prdy_clpr_vrss_oprc_rate": "전일 종가 대비 시가2 비율",
"prdy_clpr_vrss_hgpr_rate": "전일 종가 대비 최고가 비율",
"prdy_clpr_vrss_lwpr_rate": "전일 종가 대비 최저가 비율",
"uplm_issu_cnt": "상한 종목 수",
"ascn_issu_cnt": "상승 종목 수",
"stnr_issu_cnt": "보합 종목 수",
"down_issu_cnt": "하락 종목 수",
"lslm_issu_cnt": "하한 종목 수",
"qtqt_ascn_issu_cnt": "기세 상승 종목수",
"qtqt_down_issu_cnt": "기세 하락 종목수",
"tick_vrss": "TICK대비"
}
NUMERIC_COLUMNS = [
"현재가 지수", "업종 지수 전일 대비", "누적 거래량", "누적 거래 대금",
"건별 거래량", "건별 거래 대금", "전일 대비율", "시가 지수",
"지수 최고가", "지수 최저가", "시가 대비 지수 현재가",
"최고가 대비 지수 현재가", "최저가 대비 지수 현재가",
"전일 종가 대비 시가2 비율", "전일 종가 대비 최고가 비율",
"전일 종가 대비 최저가 비율", "상한 종목 수", "상승 종목 수",
"보합 종목 수", "하락 종목 수", "하한 종목 수",
"기세 상승 종목수", "기세 하락 종목수", "TICK대비"
]
def main():
"""
국내지수 실시간예상체결
[참고자료]
종목코드 마스터파일 파이썬 정제코드는 한국투자증권 Github 참고 부탁드립니다.
https://github.com/koreainvestment/open-trading-api/tree/main/stocks_info
[호출 데이터]
헤더와 바디 값을 합쳐 JSON 형태로 전송합니다.
[응답 데이터]
1. 정상 등록 여부 (JSON)
- JSON["body"]["msg1"] - 정상 응답 시, SUBSCRIBE SUCCESS
- JSON["body"]["output"]["iv"] - 실시간 결과 복호화에 필요한 AES256 IV (Initialize Vector)
- JSON["body"]["output"]["key"] - 실시간 결과 복호화에 필요한 AES256 Key
2. 실시간 결과 응답 ( | 로 구분되는 값)
ex) 0|H0STCNT0|004|005930^123929^73100^5^...
- 암호화 유무 : 0 암호화 되지 않은 데이터 / 1 암호화된 데이터
- TR_ID : 등록한 tr_id (ex. H0STCNT0)
- 데이터 건수 : (ex. 001 인 경우 데이터 건수 1건, 004인 경우 데이터 건수 4건)
- 응답 데이터 : 아래 response 데이터 참조 ( ^로 구분됨)
"""
# pandas 출력 옵션 설정
pd.set_option('display.max_columns', None) # 모든 컬럼 표시
pd.set_option('display.width', None) # 출력 너비 제한 해제
pd.set_option('display.max_rows', None) # 모든 행 표시
# 인증 토큰 발급
ka.auth()
ka.auth_ws()
# 인증(auth_ws()) 이후에 선언
kws = ka.KISWebSocket(api_url="/tryitout")
# 조회
kws.subscribe(request=index_exp_ccnl, data=["0001"])
# 결과 표시
def on_result(ws, tr_id: str, result: pd.DataFrame, data_map: dict):
try:
# 컬럼명 매핑
result.rename(columns=COLUMN_MAPPING, inplace=True)
# 숫자형 컬럼 변환
for col in NUMERIC_COLUMNS:
if col in result.columns:
result[col] = pd.to_numeric(result[col], errors='coerce')
logging.info("결과:")
print(result)
except Exception as e:
logging.error(f"결과 처리 중 오류: {e}")
logging.error(f"받은 데이터: {result}")
kws.start(on_result=on_result)
if __name__ == "__main__":
main()

View File

@@ -0,0 +1,72 @@
"""
Created on 2025-07-08
"""
import logging
import sys
sys.path.extend(['../..', '.'])
import kis_auth as ka
# 로깅 설정
logging.basicConfig(level=logging.INFO, format='%(levelname)s - %(message)s')
logger = logging.getLogger(__name__)
##############################################################################################
# [국내주식] 실시간시세 > 국내지수 실시간예상체결 [실시간-027]
##############################################################################################
def index_exp_ccnl(
tr_type: str,
tr_key: str,
) -> tuple[dict, list[str]]:
"""
국내지수 실시간예상체결[H0UPANC0] 구독 함수
이 함수는 한국투자증권 웹소켓 API를 통해 국내지수의 실시간 데이터를 구독합니다.
실시간 데이터는 웹소켓을 통해 지속적으로 업데이트되며, 구독 등록/해제 여부와 종목코드를 통해 데이터를 필터링합니다.
Args:
tr_type (str): [필수] 구독 등록("1") 또는 해제("0") 여부를 나타내는 문자열
tr_key (str): [필수] 종목코드를 나타내는 문자열. 빈 문자열일 수 없습니다.
Returns:
message (dict): 실시간 데이터 구독에 대한 응답 메시지
columns (list[str]): 실시간 데이터의 컬럼 정보 리스트
Raises:
ValueError: tr_key가 빈 문자열인 경우 발생
Example:
>>> msg, columns = index_exp_ccnl("1", "005930")
>>> print(msg, columns)
"""
# 필수 파라미터 검증
if not tr_key:
raise ValueError("tr_key is required and cannot be an empty string")
tr_id = "H0UPANC0"
params = {
"tr_key": tr_key,
}
# 데이터 구독 요청
msg = ka.data_fetch(tr_id, tr_type, params)
# 응답 데이터 컬럼 정보
columns = [
"bstp_cls_code", "bsop_hour", "prpr_nmix", "prdy_vrss_sign",
"bstp_nmix_prdy_vrss", "acml_vol", "acml_tr_pbmn", "pcas_vol",
"pcas_tr_pbmn", "prdy_ctrt", "oprc_nmix", "nmix_hgpr", "nmix_lwpr",
"oprc_vrss_nmix_prpr", "oprc_vrss_nmix_sign", "hgpr_vrss_nmix_prpr",
"hgpr_vrss_nmix_sign", "lwpr_vrss_nmix_prpr", "lwpr_vrss_nmix_sign",
"prdy_clpr_vrss_oprc_rate", "prdy_clpr_vrss_hgpr_rate",
"prdy_clpr_vrss_lwpr_rate", "uplm_issu_cnt", "ascn_issu_cnt",
"stnr_issu_cnt", "down_issu_cnt", "lslm_issu_cnt",
"qtqt_ascn_issu_cnt", "qtqt_down_issu_cnt", "tick_vrss"
]
return msg, columns