Project/trading

[개발일지] 주식 자동매매 프로그램 - 가격 조회

아카카 2025. 6. 20. 16:00

2025.06.19 - [Project/trading] - [개발일지] 주식 자동매매 프로그램 - 인증 토큰 관리

 

[개발일지] 주식 자동매매 프로그램 - 인증 토큰 관리

2025.06.18 - [Project/trading] - [개발일지] 주식 자동매매 프로그램 - 한국 투자증권 API 신청하기 [개발일지] 주식 자동매매 프로그램 - 한국 투자증권 API 신청하기트레이딩 봇 개발을 위해서는 증권사

dev-kjs1219.tistory.com

이어서 특정 종목의 현재가를 조회하는 기능을 구현하였습니다.

현재가 시세를 조회하는 API를 사용하였습니다.

def get_current_price(ticker):
    '''
    한국투자증권 현재가 조회
    '''
    url = _baseUrl + '/uapi/domestic-stock/v1/quotations/inquire-price'
    headers = {
        "Content-Type": "application/json; charset=UTF-8",
        "Authorization": f"Bearer {get_access_token()}",
        "appKey": _appKey,
        "appSecret": _appSecret,
        "tr_id": "FHKST01010100"  # 국내주식 현재가조회 (모의투자)
    }

    params = {
        "fid_cond_mrkt_div_code": "J",  # 시장구분 (J:코스피, K:코스닥)
        "fid_input_iscd": ticker  # 종목코드
    }
    response = requests.get(url, headers=headers, params=params)
    data = response.json()
    print('data : {}'.format(data.get("output", {})))
    return data.get('output', {}).get('stck_prpr', 'N/A')

 

Request header
국내 주식 현재가 시세 조회 API Request Header

 

국내 주식 현재가 시세 조회 API Parameter


단일 종목의 현재가 시세를 조회하는 함수를 구현하였습니다. 파라미터로는 특정 종목의 종목코드를 매개변수로 받고,
API 문서를 참고하여 요청 header와 파리미터를 구성하였습니다. Authorization에는 지난 번에 구현한 get_access_token함수로 인증 토큰 값을 저장하고, APPKEY와 APPSECRET을 포함하였습니다. 거래 ID는 API 문서에 있는 값을 그대로 넣었습니다. 파라미터에는 조건 시장 분류코드(원화), 종목코드를 전달하도록 구현하였습니다.

 

Response Body 부분에 대한 명세를 보면 output이라는 Element가 있고 해당 요소 안에 종목에 대한 정보가 들어 있는 것을 확인할 수 있습니다. 가장 아래 항목을 보며 stck_prpr이라는 값이 주식의 현재가 인 것을 알 수 있습니다.

따라서 위의 함수에서는 response의 output앙늬 stck_prpr을 반환하도록 구현했습니다.

 

if __name__=='__main__':
    ticker = '035420'  # 예시: NAVER의 종목 코드
    current_price = get_current_price(ticker)
    print("Current price of {}: {}".format(ticker, current_price))
    
# data : {'iscd_stat_cls_code': '55', 'marg_rate': '20.00', 'rprs_mrkt_kor_name': 'KOSPI200', 'new_hgpr_lwpr_cls_code': '신고가', 'bstp_kor_isnm': 'IT 서비스', 'temp_stop_yn': 'N', 'oprc_rang_cont_yn': 'N', 'clpr_rang_cont_yn': 'N', 'crdt_able_yn': 'Y', 'grmn_rate_cls_code': '40', 'elw_pblc_yn': 'Y', 'stck_prpr': '269500', 'prdy_vrss': '17500', 'prdy_vrss_sign': '2', 'prdy_ctrt': '6.94', 'acml_tr_pbmn': '1275262145250', 'acml_vol': '4886043', 'prdy_vrss_vol_rate': '128.23', 'stck_oprc': '249000', 'stck_hgpr': '269500', 'stck_lwpr': '245000', 'stck_mxpr': '327500', 'stck_llam': '176500', 'stck_sdpr': '252000', 'wghn_avrg_stck_prc': '261001.23', 'hts_frgn_ehrt': '48.84', 'frgn_ntby_qty': '0', 'pgtr_ntby_qty': '335127', 'pvt_scnd_dmrs_prc': '263666', 'pvt_frst_dmrs_prc': '257832', 'pvt_pont_val': '253166', 'pvt_frst_dmsp_prc': '247332', 'pvt_scnd_dmsp_prc': '242666', 'dmrs_val': '255500', 'dmsp_val': '245000', 'cpfn': '165', 'rstc_wdth_prc': '75500', 'stck_fcam': '100', 'stck_sspr': '191520', 'aspr_unit': '500', 'hts_deal_qty_unit_val': '1', 'lstn_stcn': '158437008', 'hts_avls': '426988', 'per': '22.62', 'pbr': '1.62', 'stac_month': '12', 'vol_tnrt': '3.08', 'eps': '11913.00', 'bps': '166221.00', 'd250_hgpr': '269500', 'd250_hgpr_date': '20250620', 'd250_hgpr_vrss_prpr_rate': '0.00', 'd250_lwpr': '151100', 'd250_lwpr_date': '20240805', 'd250_lwpr_vrss_prpr_rate': '78.36', 'stck_dryy_hgpr': '269500', 'dryy_hgpr_vrss_prpr_rate': '0.00', 'dryy_hgpr_date': '20250620', 'stck_dryy_lwpr': '176200', 'dryy_lwpr_vrss_prpr_rate': '52.95', 'dryy_lwpr_date': '20250409', 'w52_hgpr': '269500', 'w52_hgpr_vrss_prpr_ctrt': '0.00', 'w52_hgpr_date': '20250620', 'w52_lwpr': '151100', 'w52_lwpr_vrss_prpr_ctrt': '78.36', 'w52_lwpr_date': '20240805', 'whol_loan_rmnd_rate': '0.58', 'ssts_yn': 'Y', 'stck_shrn_iscd': '035420', 'fcam_cnnm': '100', 'cpfn_cnnm': '164 억', 'frgn_hldn_qty': '77375650', 'vi_cls_code': 'N', 'ovtm_vi_cls_code': 'N', 'last_ssts_cntg_qty': '296296', 'invt_caful_yn': 'N', 'mrkt_warn_cls_code': '00', 'short_over_yn': 'N', 'sltr_yn': 'N', 'mang_issu_cls_code': 'N'}
# Current price of 035420: 269500

 

해당 함수가 정상적으로 동작하는지 확인하기 위해 네이버의 종목코드를 명시적으로 선언 후 함수를 동작해보았습니다.

그 결과 Naver 종목에 대한 정보와 현재가가 정상적으로 출력되는 것을 확인할 수 있습니다.

 

그런데 위의 예제에서는 종목코드 값을 하나의 종목 코드 값을 임의로 집어넣었지만, 트레이딩 봇을 목적에 맞게 사용하려면 여러 종목의 종목 코드 값이 필요합니다. 아래는 종목코드를 얻는 방법입니다.

종목코드를 얻는 대표적인 방법

(1) KRX 정보데이터시스템 활용

한국거래소(KRX)는 모든 상장 종목 데이터를 무료로 EXCEL/CSV로 제공한다.
가장 표준적이고 정확하다.

  • KRX 정보데이터시스템
  • 매일 장 시작 전에 다운로드해서 최신화하면 됨
  • CSV 파일로 관리하면 봇에서 쉽게 종목명 → 종목코드를 찾을 수 있다
  • 주식 → 종목정보 →  전종목기본정보 메뉴에서 다운로드

KRX 정보데이터 시스템 - 전종목 기본 정보 다운로드

(2) 네이버 금융/다음 금융 크롤링

많은 개인 개발자가 간편하게 사용하는 방법.
네이버 금융 사이트 HTML에서 종목명과 코드를 파싱해서 리스트로 만들 수 있다.

단점:

  • 사이트 구조가 바뀌면 스크립트를 수정해야 함
  • 실시간 요청은 권장하지 않고, 정적 파일로 주기적 갱신만 사용한다

각자의 방식으로 구현을 하면 되는데, 저는 CSV읽어오는 방식으로 구현하였습니다.

다음 포스팅에서 이어서 내용 정리하도록 하겠습니다