ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • (OpenAPI)KRX OpenAPI 활용: 서비스 이용 신청 및 API 예제
    금융퀀트/프로그램기초 2024. 3. 28. 07:57
    반응형

    서비스 이용 신청

    인증키 발급 확인

    (OpenAPI)KRX OpenAPI 활용: 인증키 발급에서 해 본 것처럼 법인이 아닌 개인은 로그인 후 마이페이지에서 API인증키 신청을 누르면 API를 사용할 수 있는 인증키 발급절차가 진행되고, 발급이 완료되면 아래 그림 1과 같이 마이페이지 -> 이용현황 -> 나의 정보에 인증키가 발급된 내역을 확인할 수 있다.

    그림1: KRX API인증키 발급(http://openapi.krx.co.kr/)

    개별 서비스 신청

    인증키 발급 후 API 서비스를 이용하려면 데이터 별로 추가적인 이용 신청이 필요하다. 예를 들어 유가증권시장에 상장되어 있는 주권의 매매정보를 받고 싶은 경우 아래 그림 2와 같이 서비스이용 -> 주식-> 유가증권일별매매정보를 클릭해서 들어간다. 상세 페이지에서 출력되는 데이터의 layout을 알 수 있고, 샘플 테스트 텝에서 실제로 데이터가 어떻게 입수되는지 볼 수 있다. 

    그림2: 데이터 이용 신청

    그림 3과 같이 하단의 API이용신청 버튼을 누른 후 데이터 이용기간 등을 선택하면 이용신청이 완료되고 마이페이지에서 신청내역 및 승인상태를 알 수 있다. 

    그림3: 데이터 이용 신청 완료

    데이터 입수 예제: python

    데이터 입수 구조 파악

    python으로 유가증권 일별매매정보를 받아오는 코드를 구현해 보자. 샘플테스트, 샘플예제, 개발명세서를 참조하면 쉽게 데이터 입수를 구현할 수 있는데, 먼저 샘플테스트를 보면 인증키, 기준일자 정보를 갖고 API 요청을 하면 "OutBlock_1"이라는 list에 결과들이 출력되는 것을 알 수 있다. 

    그림4: 샘플테스트

    샘플 예제를 보면 "AUTH_KEY"에 나의 API키를 담아서 주어진 url 로 request를 하면 되는 것을 알 수 있다. 여기에서 샘플 URL이 "http://data-dbg.krx.co.kr/svc/sample/apis/sto/stk_bydd_trd"로 주어지는데, 구체적으로 어떤 url로 api 키를 어떻게 담아서 api를 요청할지는 개발 명세서까지 확인을 해야 알 수 있다. 

    그림5: 샘플예제

    개발명세서 상에서는 Description 에 sample url이 아닌 실제 사용할 수 있는 api url 이 주어지고, 요청 시에 (InBlock_1) parameter 값으로 basDd라는 값을 같이 던져야 한다는 것을 명시하고 있다. 

    그림6: 개발명세서

    데이터 입수 구현

    KRX에서 안내하고 있는 자료를 바탕으로 알 수 있는 API 호출 구조는 개발명세서 상 URL로 request를 하고, header 에는 "AUTH_KEY"로 나의 API를 붙이고, parameter에 basDd로 기준일자를 넣는 것이다. 이렇게 받은 결과를 json으로 그대로 출력하면 아래 그림 7과 같이 정신없는 형태가 된다.

    그림7: json 형식 편집없이 출력

    pandas 라이브러리의 json_normalize 함수를 이용해서 최종적으로 데이터프레임 형식으로 결과를 아래와 같이 확인할 수 있다. 

    그림8: 최종 데이터프레임으로 나타낸 결과

    지금까지의 내용을 파이썬 코드로 구현하면 아래와 같이 간단하게 나타낼 수 있다. 

    import requests
    import pandas as pd
    
    url = "http://data-dbg.krx.co.kr/svc/apis/sto/stk_bydd_trd"
    auth_key = "나의 API 키"
    headers = {"AUTH_KEY": auth_key}
    params = {"basDd": "조회 기준 일자, 2 영업일 전 데이터부터 조회 됨"}
    
    # url 에 header 에 api 키, parameter에 기준일자를 넣고 api 요청
    res = requests.get(url, headers=headers, params=params)
    # 응답을 res에 저장하고 응답이 200 이면 정상적인 API응답을 받은 상태임
    if res.status_code == 200:
    	# 응답받은 내용을 json 형태로 변환
        res = res.json()
        # json 데이터를 데이터프레임으로 변환
        df = pd.json_normalize(res['OutBlock_1'])
        print(df)
    else:
    	# 응답 에러시 응답코드 print
        print("Error:", res.status_code)
    반응형
Designed by Tistory.