한국투자증권 API로 1분봉 OHLCV 데이터 가져오기
가장 빠르게 익히는 방법은 직접 해보는 것입니다. 이번 포스팅에서는 한국투자증권 REST API로 주가에 대한 1분봉 시계열 데이터를 가져와 보겠습니다. 최종 결과물은 시간 순서로 배열된 1분봉 ohlcv 데이터입니다.
글의 순서
한국투자증권 API로 내 계좌에 접속하기
KIS 1분봉 OHLCV 데이터 가져오기
파이썬 코드 : KIS API로 1분봉 OHLCV 데이터 가져오기
한국투자증권 API로 내 계좌에 접속하기
한국투자증권 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라는 환경변수를 미리 설정해 두었습니다.
KIS 1분봉 OHLCV 데이터 가져오기
한국투자증권 API는 일, 주, 월의 캔들을 가져올 수 있습니다. 그러나 분봉 데이터의 경우 당일(오늘)만 가능합니다. 그것도 1분봉만 가능하며, 한번에 30건만 조회할 수 있습니다.
파이썬 코드 : KIS API로 1분봉 OHLCV 데이터 가져오기
실습코드에 1분봉 데이터를 가져오는 방법을 나타내었습니다. 실습코드에서 time_end라는 변수에 시간을 입력하면, 그 시간부터 시간을 거꾸로 거슬러 올라가서 30개의 데이터를 받아옵니다. 한번에 30개만 받을 수 있으므로, 09:00부터 15:30까지의 데이터를 모두 받기 위해서는 time_end라는 변수를 자동으로 30분씩 당겨서 입력하게 하면 됩니다. decrease_time() 함수가 이를 담당해줍니다
참고로, 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 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 |
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(): """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"] return access_token else: print(f"Failed to get access token: {res.json()}") return None # time_end를 minutes만큼 줄여주는 함수 def decrease_time(time_str, minutes): """time_str을 분 단위로 감소시켜서 새로운 시간을 반환""" time_format = '%H%M%S' dt = datetime.datetime.strptime(time_str, time_format) dt -= datetime.timedelta(minutes=minutes) return dt.strftime(time_format) # 당일 분봉 OHLCV 데이터 조회 함수 def get_minute_ohlcv_data(access_token, code="005930", time_end="153000"): """당일 분봉 OHLCV 데이터를 조회하고 DataFrame으로 반환""" PATH = "/uapi/domestic-stock/v1/quotations/inquire-time-itemchartprice" URL = f"{URL_BASE}{PATH}" all_data = [] # 반복적으로 데이터를 요청하면서 time_end 값을 줄여가며 데이터를 받아옴 while True: # 현재 날짜 설정 # today = datetime.datetime.now().strftime('%Y%m%d') headers = { "Content-Type": "application/json", "authorization": f"Bearer {access_token}", "appKey": api_key, "appSecret": api_secret, "tr_id": "FHKST03010200", # 당일 분봉 데이터 조회용 거래 ID } params = { "FID_ETC_CLS_CODE": "", # 기타 구분 코드 "FID_COND_MRKT_DIV_CODE": "J", # 시장 분류 코드 "FID_INPUT_ISCD": code, # 종목 코드 "FID_INPUT_HOUR_1": time_end, # 조회 종료 시간 (HHMMSS) "FID_PW_DATA_INCU_YN": "N" # 과거 데이터 포함 여부 (N: 당일만 조회) } 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'], # 거래일자 "Time": item['stck_cntg_hour'], # 체결 시간 "Open": item['stck_oprc'], # 시가 "High": item['stck_hgpr'], # 고가 "Low": item['stck_lwpr'], # 저가 "Close": item['stck_prpr'], # 종가 "Volume": item['cntg_vol'] # 체결 거래량 } for item in data] all_data.extend(ohlcv_data) # 30개의 데이터를 받았으면 time_end를 줄여서 다음 데이터를 요청 time_end = decrease_time(time_end, minutes=30) print(f"Next time_end: {time_end}") else: print("No more data available for the specified time.") break else: print(f"Failed to retrieve data: {res.status_code}, {res.text}") return None # DataFrame 생성 및 정렬 df = pd.DataFrame(all_data) df['DateTime'] = pd.to_datetime(df['Date'] + df['Time'], format='%Y%m%d%H%M%S') # 날짜와 시간 결합 df = df.astype({'Open': 'float', 'High': 'float', 'Low': 'float', 'Close': 'float', 'Volume': 'float'}) # 데이터 타입 변환 df = df[['DateTime', 'Open', 'High', 'Low', 'Close', 'Volume']] # 열 정렬 df = df.sort_values(by='DateTime', ascending=True) # 시간 오름차순 정렬 df = df.reset_index(drop=True) # 인덱스를 다시 설정 return df # 메인 실행 부분 if __name__ == "__main__": access_token = get_access_token() if access_token: # 종목, 조회 종료 시간 지정 (예: 15:30:00까지 데이터를 받아오기 시작) code_stock_krx = '032640' time_end = "153000" # 종료 시간 df = get_minute_ohlcv_data(access_token, code=code_stock_krx, time_end=time_end) 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 20 21 22 23 24 25 26 27 28 29 |
Next time_end: 150000 Next time_end: 143000 Next time_end: 140000 Next time_end: 133000 Next time_end: 130000 Next time_end: 123000 Next time_end: 120000 Next time_end: 113000 Next time_end: 110000 Next time_end: 103000 Next time_end: 100000 Next time_end: 093000 Next time_end: 090000 Next time_end: 083000 No more data available for the specified time. DateTime Open High Low Close Volume 0 2024-11-29 09:00:00 11780.0 11780.0 11700.0 11700.0 43848.0 1 2024-11-29 09:01:00 11700.0 11730.0 11700.0 11710.0 5528.0 2 2024-11-29 09:02:00 11710.0 11720.0 11700.0 11700.0 6139.0 3 2024-11-29 09:03:00 11700.0 11710.0 11650.0 11670.0 30110.0 4 2024-11-29 09:04:00 11670.0 11680.0 11640.0 11640.0 15926.0 .. ... ... ... ... ... ... 386 2024-11-29 15:26:00 11590.0 11590.0 11590.0 11590.0 0.0 387 2024-11-29 15:27:00 11590.0 11590.0 11590.0 11590.0 0.0 388 2024-11-29 15:28:00 11590.0 11590.0 11590.0 11590.0 0.0 389 2024-11-29 15:29:00 11590.0 11590.0 11590.0 11590.0 0.0 390 2024-11-29 15:30:00 11590.0 11590.0 11590.0 11590.0 431426.0 [391 rows x 6 columns] |
마치며 …
이번 포스팅에서는 한국투자증권 REST API를 사용해 당일 1분봉 OHLCV 데이를 가져오는 방법에 대해 알아보았습니다. 한국투자증권 API는 일, 주, 월의 캔들을 가져올 수 있습니다. 그러나 분봉 데이터의 경우 당일(오늘)만 가능합니다. 그것도 1분봉만 가능하며, 한번에 30건만 조회할 수 있습니다. 실습코드에서도 보신바와 같이 1분봉 데이터를 가져오는 함수는 종목코드와 데이터를 시간을 인자로 받습니다. 이 시간을 거슬러 올라가며 30개의 캔들을 가져 옵니다. 그러므로 오늘 전체 시간인 09:00~15:30의 데이터를 가져오려면 끝 시간에서 30분씩 줄여가며 09:00시까지 거슬러 올라가야 합니다. 실습코드의 decrease_time 함수를 유심히 봐주시기 바랍니다.
기술적 분석에서 OHLCV 데이터는 트레이딩 전략의 기본이 되는 자료입니다. 이러한 데이터를 활용해 캔들 차트를 그리거나, 알고리즘 트레이딩에서 필요한 다양한 분석을 할 수 있을 것입니니다. 직접 API를 사용해보고 데이터를 처리해보시기 바랍니다. 이 경험들은 더욱 깊이 있는 데이터 분석에 큰 도움이 될 것입니다.
함께 참고하면 좋은 글
▶ 한국투자증권 REST API로 시계열 데이터를 가져오는 파이썬 코드
▶ 한국투자증권 API로 주가를 가져오는 파이썬 프로그래밍
▶ 한국투자증권 파이썬 패키지 pykis로 시계열 데이터 가져오기
▶ 파이썬 바이낸스 API로 시계열 데이터를 가져오는 파이썬 프로그래밍
▶ 업비트 REST API를 이용한 비트코인 가격 추출 파이썬 프로그래밍
▶ 파이썬으로 금융시장 분석하기 : FDR(FinanceDataReader) 패키지 활용법
▶ yfinance로 주식, 암호화폐, 원자재까지: 파이썬으로 금융 데이터 쉽게 분석하기
▶ 한국투자증권 API 신청 방법
▶ 한국투자증권 파이썬 패키지 pykis로 준비하는 알고리즘 투자
▶ RESTful API : 웹 애플리케이션 개발자를 위한 기초부터 실전까지
▶ 파이썬 데이터 분석을 위한 API 이해, REST API, WebSocket API