2023년 3월 19일 일요일

한국투자증권 API

 

한국투자증권은 주식 시세 조회 및 주문까지 지원하는 오픈API를 제공합니다. 타사처럼 원도우에 제한된 환경도 아니고 http 프로토콜로 접속하고 정보를 얻기 때문에 프로그램 언어 및 OS 환경의 제약을 받지 않습니다. 

여기API 문서와 샘플 코드도 있지만 주식 전종목에 대한 하루치 현재가와 거래량을 가져 오는 파이썬 코드를 작성합니다.


 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
import requests
import json
import csv
import time
import datetime
import sys

url_token = "https://openapi.koreainvestment.com:9443/oauth2/tokenP"
data = {"grant_type": "client_credentials",
        "appsecret": "6S..yQ=",
        "appkey": "PSBv..5KCmKj"}
headers = {"Content-Type": "application/json; charset=UTF-8",}
res = requests.post(url_token, data=json.dumps(data))
rescode = res.status_code
if rescode == 200:
    json_data = json.loads(res.text)
else:
    print("error code " + str(rescode) + " | " + res.text)
    sys.exit("Getting token fails") 

url = "https://openapi.koreainvestment.com:9443/uapi/domestic-stock/v1/quotations/inquire-ccnl"
headers = {'authorization' : 'Bearer ...',
           'appkey' : 'PSBvsN..CmKj',
           'appsecret' : '6S24....zGyQ=',
           'tr_id' : 'FHKST01010100'}
headers['authorization'] = 'Bearer ' + json_data['access_token']

params = {'FID_COND_MRKT_DIV_CODE' : 'J',
         'FID_INPUT_ISCD' : '950160'}

today = datetime.datetime.today()
today_formatted = today.strftime('%Y%m%d') 
with open('data_5732_20230215.csv', 'rt', encoding='euc-kr') as csvfile:
    rows = csv.reader(csvfile, delimiter=',')
    next(rows)  # skip header
    for r in rows:
        print(r[0], r[1])
        params['FID_INPUT_ISCD'] = r[0]
        time.sleep(0.3)
        res = requests.get(url, headers=headers, params=params)
        rescode = res.status_code
        if rescode == 200:
            json_data = json.loads(res.text)
        else:
            print("error code " + str(rescode) + " | " + res.text)
            break
        print(str(today_formatted), json_data['output']['stck_prpr'], json_data['output']['acml_vol'])

 

 

8: API를 웹페이지에서 신청하면 appsecretappkey를 바로 구하지만 API 실행에는 OAuth도 추가로 필요합니다. API에 따라 웹소켓과 REST 방식으로 나뉘는데 국내 주식 시세는 REST 방식이고 OAuth 인증에 접근토큰이 필요합니다. 법인이 아닌 개인을 위한 접근토큰 유효기간은 만 24시간입니다. url_token는 이 접근토큰을 위한 URL입니다.

9,10,11: 접근토근을 얻기 위한 grant_typeclient_credentials이고 appsecretappkey는 웹페이지에서 신청 즉시 구합니다.

12: HTTP POST를 위한 header입니다.

13 : 파이썬의 requests package를 이용해서 POST합니다.  post data인수에 위에서 정의한 datajson.dumps()를 통해 올립니다.

15,16 : POST가 성공적이면 결과를 json 형식으로 바꿉니다.

21 : 주식 현재가를 얻기 위한 URL입니다.

25 : 주식현재가 시세 https://apiportal.koreainvestment.com/apiservice/apiservice-domestic-stock-quotations 를 위한 tr_id입니다.

26: authorization를 앞에서 얻은 접근토큰으로 변경합니다.

28, 29: 주식현재가 시세 https://apiportal.koreainvestment.com/apiservice/apiservice-domestic-stock-quotations 에 나온 대로 query parameter를 설정합니다.

31, 32: 오늘 날짜를 2023-03-19 형태로 변환합니다.

33: 파일 data_5732_20230215.csv는 상장된 주식의 종목코드인데 krx 홈피  http://data.krx.co.kr/contents/MDC/MDI/mdiLoader/index.cmd?menuId=MDC0201010105 에서 구합니다.

37: 첫번째 열이 종목코드, 두번째가 종목명입니다.

38: FID_INPUT_ISCD6자리 종목코드로 지정합니다.

40: requests.get  API를 호출합니다. 인수로 headersparams를 사용합니다.

43: json 형식으로 변환한 json_data를 구합니다.

47: 현재가는 json_data[‘output’][‘stck_prpr’]이고 거래량은 json_data[‘output’][‘acml_vol’]입니다.

 

댓글 없음:

댓글 쓰기