안녕하세요. 주식 투자 관련 지식을 공유하는 인천고래입니다.
오늘은 분봉 데이터를 연속적으로 가져오기 위해 꼭 알아야만 하는 block_request() 메서드에 대해 작성하도록 하겠습니다.
키움증권에서는 분봉 데이터를 API를 통해서 제공을 하고 있고 1년 치의 데이터를 보유하고 있습니다.
즉, 1년 전의 데이터를 얻을 수 없으니 지속적인 업데이트를 해야 자기만의 주식 데이터를 만들 수 있습니다.
그리고 또 하나의 문제점은 Kiwoom API에서는 분봉 데이터를 요청할 때, 특정 기간을 명시적으로 지정하여 데이터를 요청하는 기능을 제공하지 않습니다. 올해의 데이터만 필요해서 2024년 1월 1일부터 2024년 6월 26일까지의 데이터를 요청할 수 없다는 것이죠.
대신, Kiwoom API는 최신 데이터부터 과거 데이터까지 순차적으로 블록 단위로 데이터를 제공합니다.
따라서 원하는 기간 동안의 데이터를 얻기 위해서는 반복적으로 데이터를 요청 (block_request) 하면서 수집한 데이터의 날짜를 확인하고, 필요한 데이터만 남기도록 필터링해야 합니다.
아래는 기존 코드를 수정하여 특정 기간 동안의 데이터를 요청하고 필터링하는 방법입니다.
# First block request
df_firstblock = kiwoom.block_request(tr,
종목코드=code,
수정주가구분=1,
틱범위=tick_range,
output="주식분봉차트조회",
next=0)
block_request 코드 설명
kiwoom.block_request() kiwoom API를 이용하여 첫 번째 블록 데이터를 요청합니다.
- tr: 은 요청 유형(여기서는 분봉 차트 조회),
- 종목코드: 주식 코드,
- 수정주가구분: 수정주가 여부(1: 수정주가),
- 틱범위: 틱 간격,
- output: 결과 출력 형식,
- next: 다음 데이터 요청 여부(0: 첫 요청)를 의미합니다.
- df_firstblock : 키움 API를 통해서 전달받은 데이터가 데이터프레임 형식으로 저장이 됩니다.
첫 번째 요청을 통해서 자신이 원하는 기간에 대한 데이터가 존재한다면 추가로 호출할 필요없이 전달받은 데이터를 드리븐 하면 됩니다.
다만, 요청 1번으로 받은 데이터가 자신이 원하는 기간에 부족한 경우 next=2로 바꿔서 호출을 하면 됩니다.
이 경우 키움 API가 전달할 수 있는 모든 데이터를 블록화하여 while... 데이터가 바닥이 날 때까지 계속 호출 & 전달을 하게 됩니다.
아래의 코드를 보겠습니다.
df_remainblock = kiwoom.block_request(tr,
종목코드=code,
수정주가구분=1,
틱범위=tick_range,
output="주식분봉차트조회",
next=2)
다른 것이라고는 next=2 만 변경이 된 것입니다.
처음 요청을 하고 받은 데이터에 추가로 데이터가 필요한 경우 block_request() 함수를 재 호출해서 사용해야 하고
모든 데이터를 다 받을 필요가 없는 경우라면
전달 받은 데이터 df_remainblock의 데이터를 검사해서 자신이 원하는 데이터가 있는지 확인한 후 데이터가 충족될 경우 while문을 빠져나와서 추가 요청을 하지 않도록 해야 합니다.
oldest_date_in_block = pd.to_datetime(df_remainblock['체결시간'].min(), format='%Y%m%d%H%M%S')
if oldest_date_in_block < pd.to_datetime(start_date):
break
전달받은 데이터의 '체결시간'을 체크해서 제일 오래된 데이터가 start_date보다 작은지 체크하고 조건 만족하면 while문을 빠져나오도록 break를 걸었습니다.
소스 코드 공유
아래는 전체 코드입니다.
def get_API_minute_data(kiwoom, stock_code, start_date, end_date, tick_range=1):
tr = "opt10080"
code = stock_code
df_list = []
# First block request
df_firstblock = kiwoom.block_request(tr,
종목코드=code,
수정주가구분=1,
틱범위=tick_range,
output="주식분봉차트조회",
next=0)
df_list.append(df_firstblock)
# Continue requesting while there is more data
while kiwoom.tr_remained:
df_remainblock = kiwoom.block_request(tr,
종목코드=code,
수정주가구분=1,
틱범위=tick_range,
output="주식분봉차트조회",
next=2)
df_list.append(df_remainblock)
# print("df_remainblock['체결시간'].min()", df_remainblock['체결시간'].min())
oldest_date_in_block = pd.to_datetime(df_remainblock['체결시간'].min(), format='%Y%m%d%H%M%S')
if oldest_date_in_block < pd.to_datetime(start_date):
break
# Concatenate all data
df = pd.concat(df_list)
df.reset_index(drop=True, inplace=True)
# 한글 컬럼 이름을 영어로 변경
df.rename(columns={
'현재가': 'Close',
'거래량': 'Volume',
'시가': 'Open',
'고가': 'High',
'저가': 'Low',
'체결시간': 'DateTime'
}, inplace=True)
# Clean and preprocess the data
df['Close'] = df['Close'].apply(lambda x: x.lstrip('-')).astype('float')
df['Open'] = df['Open'].apply(lambda x: x.lstrip('-')).astype('float')
df['High'] = df['High'].apply(lambda x: x.lstrip('-')).astype('float')
df['Low'] = df['Low'].apply(lambda x: x.lstrip('-')).astype('float')
df['DateTime'] = pd.to_datetime(df['DateTime'], format='%Y%m%d%H%M%S', errors='raise')
df_all = df.drop(['수정주가구분', '수정비율', '대업종구분', '소업종구분', '종목정보', '수정주가이벤트', '전일종가'], axis=1)
# Filter by date range
df_all = df_all[(df_all['DateTime'] >= pd.to_datetime(start_date + ' 09:00:00')) & (
df_all['DateTime'] <= pd.to_datetime(end_date + ' 15:30:00'))]
df_all = df_all.sort_values(by='DateTime')
return df_all
아래는 해당 함수를 사용한 분봉 데이터를 가져와서 보조지표를 추가하는 전체 코드를 공개한 글이니 어떻게 활용을 하는지 확인해 보시면 좋을 것 같네요.
오늘도 제 글을 읽어주셔서 감사합니다.
키움API로 분봉 데이터 가져오기 (주식 데이터 수집 및 분석 , python 소스 코드 포함
안녕하세요. 주식 투자 관련 프로그램을 공유하는 인천고래입니다.금일은 일봉 차트가 아닌 분봉 차트 데이터를 키움 API를 이용해서 가져오는 소스 코드를 공유하고자 합니다. 퀀트 투자를 하
i-whale.com
자신만의 매매법을 자동매매 프로그램으로 만들거나
기법이 확률이 떨어진다면 백테스팅을 사용해서 확률을 높여야 합니다.
아래의 링크를 통해서 요청하시면 요청하신 이상(가격대비 성능의 최대치)의 결과물을 받아 보실 수 있습니다.
한 방에 주식 데이터 만들기 - 크몽
인천고래 전문가의 IT·프로그래밍 서비스를 만나보세요. <p>퀀트 매매, 수익률 높은 매매, 확률 높은 매매, 잃지 않는 매매 등<...
kmong.com
다른 보조지표에 대해서는 아래의 링크 글을 통해 자세히 알아 볼 수 있습니다.
보조지표 리스트 (추세, 모멘텀, 채널, 변동성, 거래량, 기타 지표)
안녕하세요. 주식을 통해 삶을 영위할 수 있는 방법을 찾으며 인생 후반을 준비하고 있는 인천고래입니다.이전부터 보조지표에 대해서 글을 작성해 왔지만 중요한 것 위주로 작성을 하다보니
i-whale.com
단기적인 스윙 및 세력 매집 분석에 용이한 기준봉에 대해서는 아래의 링크 글을 통해 자세히 알아 볼 수 있습니다.
'주식 기준봉' 카테고리의 글 목록
주식 투자에 필요한 교육 내용을 제공하고 시장 정보 및 통계 등 수록하고 기록함을 원칙으로 하되 데이터마이닝을 통해 객관적인 자료를 구축하여 보다 경제적 자유를 얻기 위하여 사이트를
i-whale.com
'Quant' 카테고리의 다른 글
키움 openAPI 한글 깨짐 문제 해결 (0) | 2024.06.27 |
---|---|
키움API로 분봉 데이터 가져오기 (주식 데이터 수집 및 분석 , python 소스 코드 포함 (0) | 2024.06.26 |
자동매매 프레임워크를 Flask서버에서 FastAPI로 변경할 예정입니다. (0) | 2024.06.16 |
텔레그램 봇 생성: Token 및 Chat ID 확인 방법 (0) | 2024.06.07 |
주식 목표 주가 알림(알람) 프로그램 - 소스 코드 공유 (3) | 2024.06.07 |
댓글