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,124 @@
"""
Created on 2025-07-09
"""
import logging
import sys
import pandas as pd
sys.path.extend(['../..', '.'])
import kis_auth as ka
from index_ccnl import index_ccnl
# 로깅 설정
logging.basicConfig(level=logging.INFO, format='%(levelname)s - %(message)s')
logger = logging.getLogger(__name__)
##############################################################################################
# [국내주식] 실시간시세 > 국내지수 실시간체결 [실시간-026]
##############################################################################################
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_ccnl, data=["0001", "0128"])
# 결과 표시
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,73 @@
"""
Created on 2025-07-09
"""
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__)
##############################################################################################
# [국내주식] 실시간시세 > 국내지수 실시간체결 [실시간-026]
##############################################################################################
def index_ccnl(
tr_type: str,
tr_key: str,
) -> tuple[dict, list[str]]:
"""
국내지수 실시간체결[H0UPCNT0] 구독 함수
이 함수는 한국투자증권의 웹소켓 API를 통해 국내지수의 실시간 데이터를 구독합니다.
실시간 데이터는 웹소켓을 통해 지속적으로 업데이트되며, 구독을 통해 실시간으로 데이터를 수신할 수 있습니다.
Args:
tr_type (str): [필수] 구독 등록("1") 또는 해제("0") 여부를 나타내는 값
tr_key (str): [필수] 종목코드 (빈 문자열 불가)
Returns:
message (dict): 메시지 데이터
columns (list[str]): 응답 데이터의 컬럼 정보
Raises:
ValueError: tr_key가 빈 문자열인 경우 발생
Example:
>>> msg, columns = subscribe_realtime_index("1", "005930")
>>> print(msg, columns)
"""
# 필수 파라미터 검증
if not tr_key:
raise ValueError("tr_key는 필수 입력값입니다.")
tr_id = "H0UPCNT0"
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