한국투자증권 API로 주가를 가져오는 파이썬 프로그래밍
가장 빠르게 익히는 방법은 직접 해보는 것입니다. 파이썬 바이낸스 API로 바이낸스라는 코인거래소에서 코인 가격을 가져왔듯, 한국투자증권 API를 통해 실감나는 주식 가격을 수집하는 방법을 익혀보겠습니다. 최종 결과물은 한국투자증권 API로 거래소에 접속해서 LG 에너지솔루션의 시계열 데이터(가격)를 가져오는 파이썬 코드입니다.
글의 순서
한국투자증권 API로 내 계좌에 접속하는 방법
한국투자증권 API로 내 계좌에 접속하기
LG에너지솔루션 주가 가져오기
한국투자증권 API로 내 계좌에 접속하는 방법
한국투자증권 API에 로그인하는 과정은 바이낸스 API와 유사하게 접근할 수 있습니다. 바이낸스 API에서 Client 객체를 생성하는 것처럼, KIS API에서도 토큰을 발급받아 API 호출에 사용할 수 있습니다.
그러나 KIS API의 경우, 바이낸스와 달리 기본적으로 세션 유지나 로그인 객체 생성 방식이 없고, 각 요청마다 발급받은 액세스 토큰(Access Token)을 사용해야 합니다. 따라서, Client 객체를 생성하는 대신, 액세스 토큰을 받아서 이후의 모든 API 호출에 사용하는 방법으로 접근합니다.
한국투자증권 API로 내 계좌에 접속하기
실습코드01은 한국투자증권 API에 연결하여 나의 계좌에 로그인하는 과정을 보여줍니다. 한국투자증권 API에 연결하기 위해 KIS_APP_KEY, KIS_APP_SECRET라는 환경변수와 나의 계좌를 확인하기 위해 KIS_ACCOUNT_NUMBER라는 환경변수를 미리 설정해 두었습니다.
실습코드 01은 아래의 절차로 작동합니다.
▶환경 변수에서 API Key와 Secret 가져오기: 이 부분은 바이낸스에서 사용했던 방식과 동일하게, os.getenv를 사용하여 환경 변수에서 API Key와 Secret을 가져옵니다.
▶액세스 토큰 발급: get_access_token() 함수는 KIS API 서버에 요청을 보내 액세스 토큰을 발급받습니다. 이 토큰은 이후의 모든 API 요청에 사용됩니다. 성공적으로 토큰을 받으면 — Account accessed with Access Token — 메시지를 출력하고, 토큰을 반환합니다. 참고로, 한국투자증권 API의 접근 토큰 유효기간은 1일, 즉 하루 동안 유효합니다.
▶계좌의 잔액 확인 : 한국투자증권 API를 통해 계좌 정보를 조회하는 API 엔드포인트를 호출해야 합니다. 이를 위해서는 이미 발급받은 액세스 토큰을 사용해야 하며, 추가적으로 필요한 계좌 정보(계좌번호 등)도 함께 요청에 포함시켜야 합니다.
코드가 다소 길어 보이지만, 두 함수 def get_access_token():와 def get_balance(access_token): 내부를 바꾸지는 않을 것이므로, 이 함수는 그냥 복사해서 쓰면 됩니다. 그러니까, 주석처리한 # 액세스 토큰 발급 시도, # 계좌 잔액 조회 부분만 주의깊게 보시면 되겠습니다.
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 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 |
import os import requests import json # KIS API 설정 api_key = os.getenv('KIS_APP_KEY') api_secret = os.getenv('KIS_APP_SECRET') account_number = os.getenv('KIS_ACCOUNT_NUMBER') # 계좌번호 앞 8자리 product_code = os.getenv('KIS_PRODUCT_CODE', '01') # 계좌번호 뒤 2자리 기본값 01 # KIS API 기본 설정 URL_BASE = "https://openapi.koreainvestment.com:9443" # 실전투자 URL # 액세스 토큰 def get_access_token(): """KIS API를 위한 액세스 토큰 발급""" headers = {"content-type": "application/json"} body = { "grant_type": "client_credentials", "appkey": api_key, "appsecret": api_secret } PATH = "oauth2/tokenP" URL = f"{URL_BASE}/{PATH}" res = requests.post(URL, headers=headers, data=json.dumps(body)) if res.status_code == 200: access_token = res.json()["access_token"] print("-- Account accessed with Access Token --") return access_token else: print(f"Failed to get access token: {res.json()}") return None # 계좌 잔액 조회 def get_balance(access_token): """계좌 잔액 조회""" PATH = "uapi/domestic-stock/v1/trading/inquire-psbl-order" URL = f"{URL_BASE}/{PATH}" headers = { "Content-Type": "application/json", "authorization": f"Bearer {access_token}", "appKey": api_key, "appSecret": api_secret, "tr_id": "TTTC8908R", # 잔고 조회용 거래 ID "custtype": "P", # 고객 유형 (개인: P, 법인: B) } params = { "CANO": account_number, "ACNT_PRDT_CD": product_code, "PDNO": "", # 조회할 상품번호(빈 문자열로 모든 상품 조회) "ORD_UNPR": "0", # 주문 단가 "ORD_DVSN": "01", # 주문 구분 (지정가: 00, 시장가: 01 등) "CMA_EVLU_AMT_ICLD_YN": "Y", # CMA 평가 금액 포함 여부 "OVRS_ICLD_YN": "Y" # 해외 포함 여부 } res = requests.get(URL, headers=headers, params=params) if res.status_code == 200: cash_balance = res.json()['output']['ord_psbl_cash'] print(f"잔액: {cash_balance}원") else: print(f"잔액 조회 실패: {res.json()}") # 액세스 토큰 발급 시도 access_token = get_access_token() # 계좌 잔액 조회 if access_token: get_balance(access_token) else: print('Failed to access the account. Please check your API Key and Secret.') |
1 2 |
-- Account accessed with Access Token -- 잔액: 300000원 |
이제 이 구조를 통해 KIS API와의 초기 연결을 수행할 수 있습니다. 이후의 모든 요청에서 access_token을 사용하여 KIS API에 인증된 상태로 데이터를 조회하거나 거래를 수행할 수 있습니다. 이 과정은 바이낸스 API의 Client 객체를 생성하는 것과 비슷한 역할을 합니다.
LG에너지솔루션 주가 가져오기
실습코드02는 특정 종목의 주가를 가져오는 파이썬 코드입니다. 종목 코드는 KRX 정보데이터시스템, 네이버 금융 등에서 확인할 수 있습니다. 실습코드 02에는 LG에너지솔루션의 주가를 가져올 수 있도록 종목코드 373220을 함수 def get_stock_data(access_token, code): 에 인자로 넘겼습니다.
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 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 |
import os import requests import json # KIS API 설정 api_key = os.getenv('KIS_APP_KEY') api_secret = os.getenv('KIS_APP_SECRET') account_number = os.getenv('KIS_ACCOUNT_NUMBER') # 계좌번호 앞 8자리 product_code = os.getenv('KIS_PRODUCT_CODE', '01') # 계좌번호 뒤 2자리 기본값 01 # KIS API 기본 설정 URL_BASE = "https://openapi.koreainvestment.com:9443" # 실전투자 URL # 액세스 토큰 def get_access_token(): """KIS API를 위한 액세스 토큰 발급""" headers = {"content-type": "application/json"} body = { "grant_type": "client_credentials", "appkey": api_key, "appsecret": api_secret } PATH = "oauth2/tokenP" URL = f"{URL_BASE}/{PATH}" res = requests.post(URL, headers=headers, data=json.dumps(body)) if res.status_code == 200: access_token = res.json()["access_token"] print("-- Account accessed with Access Token --") return access_token else: print(f"Failed to get access token: {res.json()}") return None # 특정 주식 종목의 현재가 정보를 조회 # def get_stock_data(access_token, code="005930"): def get_stock_data(access_token, code): """특정 주식 종목의 현재가 정보를 조회""" PATH = "uapi/domestic-stock/v1/quotations/inquire-price" URL = f"{URL_BASE}/{PATH}" headers = { "Content-Type": "application/json", "authorization": f"Bearer {access_token}", "appKey": api_key, "appSecret": api_secret, "tr_id": "FHKST01010100" # 현재가 조회용 거래 ID } params = { "fid_cond_mrkt_div_code": "J", # 시장 구분 (J: 유가증권, Q: 코스닥 등) "fid_input_iscd": code # 주식 종목 코드 (예: 삼성전자 005930) } res = requests.get(URL, headers=headers, params=params) if res.status_code == 200: data = res.json()['output'] # print(data) current_price = int(data['stck_prpr']) # 현재가 market_cap = int(data['hts_avls']) # 시가총액 print(f"종목 코드: {code}, 현재가: {current_price}원, 시가총액: {market_cap}원") # print(f"종목 코드: {code}, 현재가: {current_price}원, 시가총액: {market_cap}원") return data else: print(f"종목 정보 조회 실패: {res.json()}") return None # 액세스 토큰 발급 시도 access_token = get_access_token() # 특정 주식 종목의 정보를 가져오는 방법 if access_token: stock_data = get_stock_data(access_token, code="373220") # LG에너지솔루션 else: print('Failed to access the account. Please check your API Key and Secret.') |
1 2 |
-- Account accessed with Access Token -- 종목 코드: 373220, 현재가: 391500원, 시가총액: 916110원 |
마치며 …
가장 빠르게 익히는 방법은 직접 해보는 것입니다. 이번 포스팅에서는 한국투자증권 API로 계정에 접속하는 방법과 특정 종목의 주가를 가져오는 방법을 정리하였습니다.
최종 결과물은 한국투자증권 API로 거래소에 접속해서 LG 에너지솔루션의 시계열 데이터(가격)를 가져오는 실습코드02입니다. 액세스토큰 발행, 계좌 확인, 주가 확인에 필요한 함수 사용법을 연습해 보시기 바랍니다.
함께 참고하면 좋은 글
▶ 파이썬 바이낸스 API로 시계열 데이터를 가져오는 파이썬 프로그래밍
▶ 파이썬으로 금융시장 분석하기 : FDR(FinanceDataReader) 패키지 활용법
▶ yfinance로 주식, 암호화폐, 원자재까지: 파이썬으로 금융 데이터 쉽게 분석하기
▶ 한국투자증권 API 신청 방법
▶ 한국투자증권 파이썬 패키지 pykis로 준비하는 알고리즘 투자
▶ RESTful API : 웹 애플리케이션 개발자를 위한 기초부터 실전까지
▶ 파이썬 데이터 분석을 위한 API 이해, REST API, WebSocket API
▶ 업비트 REST API를 이용한 비트코인 가격 추출 파이썬 프로그래밍