한국투자증권 REST API로 시계열 데이터를 가져오는 파이썬 코드
가장 빠르게 익히는 방법은 직접 해보는 것입니다. pykis를 활용했던 지난 포스팅에 이어 이번에는 한국투자증권 REST API로 주가에 대한 시계열 데이터를 가져와 보겠습니다. 최종 결과물은 시간 순서로 배열된 ohlcv 데이터입니다.
글의 순서
한국투자증권 REST API로 내 계좌에 접속하기
OHLCV 데이터 가져오기
파이썬 코드 : KIS API로 OHLCV 데이터 가져오기
한국투자증권 REST API로 내 계좌에 접속하기
한국투자증권 REST API를 이용하여 나의 계좌에 로그인하는 과정은 다음과 같이 2단계로 구성됩니다.
(1) 환경 변수에서 API Key와 API Secret 가져오기
(2) KIS API 서버로부터 액세스 토큰 발급 받기 : get_access_token() 함수
액세스 토큰은 이후의 모든 API 요청에 사용되며, 액세스 토큰 유효기간은 1일입니다. 참고로 한국투자증권 API에 연결하기 위해 KIS_APP_KEY, KIS_APP_SECRET라는 환경변수와 나의 계좌를 확인하기 위해 KIS_ACCOUNT_NUMBER라는 환경변수를 미리 설정해 두었습니다.
OHLCV 데이터 가져오기
지난 포스팅에서 한국투자증권 API를 쉽게 사용할 수 있도록 만든 파이썬 패키지 pykis를 이용하여 OHLCV(Open, High, Low, Close, Volume) 데이터를 가져오는 연습을 했었습니다. pykis의 get_kr_ohlcv 함수는 단 2개의 파라미터를 이용하여 간편하게 데이터를 가져올 수 있었습니다만, 기간을 정하는 등 내가 원하는 대로 할 수 없는 제한이 있었습니다. 파이썬 바이낸스 API와 비교했을 때, 가장 최근 데이터가 맨 먼저 나오므로 왼쪽에서 오른쪽으로 가면서 시간이 증가하는 그 캔들 차트를 그리기도 곤란했습니다.
이번 포스팅에서는 한국투자증권 REST API를 사용하여 이런 제한 사항들을 없애보겠습니다. 한국투자증권 REST API로 받아온 데이터 res를 우리 눈에 익숙한 형태로 바꾸기 위해 json을 이용하였습니다. 아래 코드에서 res_data = res.json() 부분이 바로 json으로 데이터를 변환하는 부분입니다. ohlcv_data는 여러 개의 dictionary로 이루어진 리스트입니다. item은 ohlcv_data 리스트에서 각 요소(element)를 의미하며, item[‘stck_bsop_date’]는 그 딕셔너리의 stck_bsop_date 키에 해당하는 값을 가져오는 역할을 합니다.
파이썬 코드 : KIS API로 OHLCV 데이터 가져오기
한국투자증권 REST API로 주가에 대한 시계열 데이터, ohlcv 데이터로 가공하는 과정을 아래의 파이썬 코드에서 구현하였습니다. 코드는 크게 두 부분으로 구성되어 있습니다. 한국투자증권 API로 서버에 접속하는 과정, 시계열 데이터를 ohlcv 형태로 바꾸는 과정을 확인해 보시기 바랍니다.
참고로, ohlcv 데이터가 기술적 분석을 위한 가장 기본 데이터라고 할 수 있으며, 알고리즘 트레이딩을 위한 데이터 처리와 분석은 여기서부터 시작됩니다.
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 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 |
import os import requests import json import datetime import pandas as pd # KIS API 설정 api_key = os.getenv('KIS_APP_KEY') api_secret = os.getenv('KIS_APP_SECRET') # KIS API 기본 설정 URL_BASE = "https://openapi.koreainvestment.com:9443" # 액세스 토큰 발급 함수 def get_access_token(): headers = {"content-type": "application/json"} body = { "grant_type": "client_credentials", "appkey": api_key, "appsecret": api_secret } res = requests.post(f"{URL_BASE}/oauth2/tokenP", headers=headers, data=json.dumps(body)) if res.status_code == 200: access_token = res.json()["access_token"] return access_token else: print(f"Failed to get access token: {res.json()}") return None # OHLCV 데이터 조회 함수 def get_ohlcv_data(access_token, code="005930", start_date=None, end_date=None): """OHLCV 데이터를 날짜 범위로 조회하고 DataFrame으로 반환""" PATH = "uapi/domestic-stock/v1/quotations/inquire-daily-itemchartprice" URL = f"{URL_BASE}/{PATH}" # 시작일 및 종료일 설정 today = datetime.datetime.now() if start_date is None: start_date = (today - datetime.timedelta(days=1)).strftime('%Y%m%d') if end_date is None: end_date = start_date # 미래 날짜 요청 방지 current_date = today.strftime('%Y%m%d') if start_date > current_date or end_date > current_date: print("시작일과 종료일은 현재 날짜 이전이어야 합니다.") return None headers = { "Content-Type": "application/json", "authorization": f"Bearer {access_token}", "appKey": api_key, "appSecret": api_secret, "tr_id": "FHKST03010100" # 일봉 데이터 조회용 거래 ID } params = { "FID_COND_MRKT_DIV_CODE": "J", # 시장 분류 코드 "FID_INPUT_ISCD": code, # 종목 코드 "FID_INPUT_DATE_1": start_date, # 시작일 "FID_INPUT_DATE_2": end_date, # 종료일 "FID_PERIOD_DIV_CODE": "D", # 기간 분류 코드 ('D': 일봉) "FID_ORG_ADJ_PRC": "1" # 수정주가 여부 ('0': 수정주가, '1': 원주가) } res = requests.get(URL, headers=headers, params=params) if res.status_code == 200: res_data = res.json() data = res_data.get('output2', []) if data: # OHLCV 데이터를 DataFrame으로 변환 ohlcv_data = [{ "Date": item['stck_bsop_date'], # 거래일자 "Open": item['stck_oprc'], # 시가 "High": item['stck_hgpr'], # 고가 "Low": item['stck_lwpr'], # 저가 "Close": item['stck_clpr'], # 종가 "Volume": item['acml_vol'] # 누적 거래량 } for item in data] # DataFrame 생성 및 정렬 df = pd.DataFrame(ohlcv_data) df['Date'] = pd.to_datetime(df['Date'], format='%Y%m%d') # 날짜 형식 변환 df = df.astype({'Open': 'float', 'High': 'float', 'Low': 'float', 'Close': 'float', 'Volume': 'float'}) # 데이터 타입 변환 df = df.sort_values(by='Date', ascending=True) # 날짜 오름차순 정렬 df = df.reset_index(drop=True) # 인덱스를 다시 설정 return df else: print(f"No data available for the period {start_date} to {end_date}.") return None else: print(f"Failed to retrieve data: {res.status_code}, {res.text}") return None # 메인 실행 부분 if __name__ == "__main__": access_token = get_access_token() if access_token: # 유효한 과거 날짜로 설정 start_date = "20230901" end_date = "20230926" df = get_ohlcv_data(access_token, code="005930", start_date=start_date, end_date=end_date) if df is not None: print(df) else: print("Failed to get access token.") |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
Date Open High Low Close Volume 0 2023-09-01 66800.0 71000.0 66700.0 71000.0 29738235.0 1 2023-09-04 72900.0 72900.0 70700.0 71200.0 26286495.0 2 2023-09-05 70900.0 71500.0 70200.0 70700.0 12330239.0 3 2023-09-06 70700.0 70800.0 69700.0 70000.0 11414620.0 4 2023-09-07 70000.0 70600.0 69600.0 70400.0 13741241.0 5 2023-09-08 70200.0 70300.0 69600.0 70300.0 10688118.0 6 2023-09-11 70400.0 70800.0 70000.0 70800.0 11785462.0 7 2023-09-12 70800.0 71000.0 70400.0 70500.0 11688599.0 8 2023-09-13 71100.0 71600.0 70300.0 70900.0 15955797.0 9 2023-09-14 71200.0 71800.0 70800.0 71700.0 21041407.0 10 2023-09-15 71700.0 72300.0 71400.0 72000.0 17823512.0 11 2023-09-18 71300.0 71700.0 70200.0 70200.0 16040727.0 12 2023-09-19 70400.0 70800.0 69600.0 69800.0 11820188.0 13 2023-09-20 70000.0 70300.0 69500.0 69600.0 10873015.0 14 2023-09-21 69200.0 69800.0 68800.0 68900.0 10796336.0 15 2023-09-22 68300.0 68900.0 68300.0 68800.0 9897840.0 16 2023-09-25 68500.0 69700.0 68500.0 69400.0 13582516.0 17 2023-09-26 70000.0 70000.0 68400.0 68600.0 13143470.0 |
마치며 …
이번 포스팅에서는 한국투자증권 REST API를 사용해 주가 시계열 데이터를 가져온 후, OHLCV 형태로 변환하는 과정을 알아보았습니다. 한국투자증권 REST API를 활용하면 원하는 기간 동안의 데이터를 자유롭게 처리할 수 있어서 pykis 패키지에서 겪었던 제한 사항들을 해결할 수 있습니다.
기술적 분석에서 OHLCV 데이터는 트레이딩 전략의 기본이 되는 자료입니다. 이러한 데이터를 활용해 캔들 차트를 그리거나, 알고리즘 트레이딩에서 필요한 다양한 분석을 할 수 있을 것입니니다. 직접 API를 사용해보고 데이터를 처리해보시기 바랍니다. 이 경험들은 더욱 깊이 있는 데이터 분석에 큰 도움이 될 것입니다.
함께 참고하면 좋은 글
▶ 한국투자증권 API로 주가를 가져오는 파이썬 프로그래밍
▶ 한국투자증권 파이썬 패키지 pykis로 시계열 데이터 가져오기
▶ 파이썬 바이낸스 API로 시계열 데이터를 가져오는 파이썬 프로그래밍
▶ 업비트 REST API를 이용한 비트코인 가격 추출 파이썬 프로그래밍
▶ 파이썬으로 금융시장 분석하기 : FDR(FinanceDataReader) 패키지 활용법
▶ yfinance로 주식, 암호화폐, 원자재까지: 파이썬으로 금융 데이터 쉽게 분석하기
▶ 한국투자증권 API 신청 방법
▶ 한국투자증권 파이썬 패키지 pykis로 준비하는 알고리즘 투자
▶ RESTful API : 웹 애플리케이션 개발자를 위한 기초부터 실전까지
▶ 파이썬 데이터 분석을 위한 API 이해, REST API, WebSocket API