본문 바로가기
Project/Predict Stock price Project

1. Finance Data Reader로 주식 데이터 불러오기 ( 주가 예측 프로젝트 )

by inhovation97 2022. 3. 7.

학부 연구생으로서 진행한 주가 예측 프로그램의 일련의 과정을 차례로 포스팅합니다. 

위 그림처럼 어떤 종목이든 10일간의 데이터로

다음날 종가 상승 여부를 예측하는 머신러닝 프로젝트입니다.

 

주식 데이터는 여기저기 예제들도 굉장히 많이 있고,

비교적 얻기 쉬운 빅데이터이기 때문에 여러가지 프로젝트를 하시는 분들은 굉장히 많을 거라고 생각합니다. 

 

하지만 어려운 도메인인만큼 유의미한 모델링을 한 사례는 굉장히 적습니다. 

특히 주식을 잘 모르시는 분들에게는 정말 어려운 데이터죠...

제가 얻은 인사이트를 기록합니다.

데이터 수집 - EDA - 전처리 - 모델링 - 성능 개선 

이번 포스팅은 Finance Data Reader라는 라이브러리를 이용하여 종목 코드를 얻는 과정

해당 라이브러리의 특징에 대해서 포스팅하려합니다.

 

1. FinanceDataReader로 주식 데이터 불러오기
2. FinanceDataReader 특징

 

1. FinanceDataReader로 주식 데이터 불러오기

 

https://financedata.github.io/posts/finance-data-reader-users-guide.html

해당 라이브러리는 너무 정리도 잘 돼있고 유명한 라이브러리입니다. 

 

종목 코드 얻기

import pandas as pd
def make_code(x):
    x = str(x)
    return '0'*(6-len(x)) + x

code_data = pd.read_html('http://kind.krx.co.kr/corpgeneral/corpList.do?method=download',header=0)[0]
code_data['종목코드'] = code_data['종목코드'].apply(make_code)
code_list = code_data[code_data['상장일'] < '2017-01-01']['종목코드']
code_data.head()

우선 해당 라이브러리를 통해서 특정 기업의 주식 데이터를 불러오려면 기업의 종목 코드가 필요합니다. 

저는 한국 거래소에서 크롤링해온 엑셀 파일을 이용하여 종목 코드들을 가져왔습니다.

위 코드가 아마 데이콘에서 이미 제공했던? 베이스라인으로 알고있습니다. 

하지만 이 방식으로 불러오는 주식 종목들에는 단점이 있더군요. 그건 저도 EDA를 통해 얻은 결과이기 때문에 종목 코드 선정 방식은 EDA 포스팅에서 다룹니다.

 

trainset : 18년 ~ 20년 데이터 ( 3년치 )

testset : 21년 데이터

위 처럼 train/test를 split할 것이기 때문에 넉넉히 17년 이전 상장사들을 기준으로 종목들을 1차 선별하였습니다.

(혹시 위 방법으로 크롤링하여 종목 코드를 얻을 생각이시면, 해당 데이터 프레임을 csv로 저장하여 코딩을 하시는 걸 추천드립니다. 크롤링해오는 한국 거래소는 매일매일 업데이트되기 때문에 위 데이터 프레임이 날마다 바뀔 수도 있습니다!)

 

어쨋든 위 코드로 종목 코드를 얻었습니다. make_code 함수는 6숫자를 갖는 종목 코드의 특성을 위한 함수입니다. 

(해당 함수를 쓰지 않으면, 위 DL기업의 종목코드는 210이 되어 고유 번호로 인식이 안됨.)

 

특정 종목 불러오기

import FinanceDataReader as fdr
fdr.DataReader('000210', start = '2015', end = '2017')

DL 종목 15~17년 데이터

위에서 DL이라는 회사의 종목코드 '000210'을 얻었습니다. 

특정 종목의 데이터를 불러오는 일은 굉장히 쉽습니다. 

fdr.DataReader( symbol = 종목명, start = 시작 날짜, end = 종료 날짜)로 불러옵니다.

 

2. FinanceDataReader 특징

fdr.DataReader('000210', start = '2015' ).reset_index()

결과

주식 종목은 날짜컬럼이 굉장히 중요합니다. 

주식시장은 빨간날, 주말은 쉬기 때문에 날짜 계산하기가 굉장히 어렵기때문입니다.

제 연구가 10일치의 데이터를 갖고 다음날을 예측하는 데이터를 설계했기 때문에 날짜 계산에 대해서 고민을 많이했었는데, 위처럼 start 데이터만 설정하면 그 날로부터 오늘까지의 개장일을 전부 가져오더군요. 

따라서 start date나 end date만 정해준 뒤 인덱싱으로 데이터를 잘라서 사용했습니다. 

 

위 데이터 프레임을 설명하자면, '000210' DL이라는 회사의 15년부터 현재까지의 데이터입니다.

Date 주식시장 개장 날짜

Open은 해당 개장일의 시가

High는 해당 개장일의 고가

Low는 해당 개장일의 저가

Close는 해당 개장일의 종가

Volume은 해당 개장일의 거래량

Change는 해당 개장일의 전날 대비 종가 상승률 입니다. (음수면 하락 양수면 상승)

 

해당 라이브러리는 기간 보다는 fdr함수를 쓰는 것에 대해 시간이 많이 들었습니다.

즉, 한 종목에 대해 2년의 데이터를 불러오는 것과 1년의 데이터를 불러오는 것은 시간 차이가 없음.

2종목을 각각 1년기간의 데이터를 불러오는게 시간이 오래걸림.

fdr 함수의 호출 횟수가 시간 복잡도를 많이 잡아 먹습니다.

 

주식 종목코드 리스트를 얻었고, 데이터를 불러오는 방법을 알았습니다. 

머신러닝 trainset을 만드려면 다양하고 많은 기업들의 데이터가 필요합니다. 

2,000개 가량 종목의 데이터를 얻으려면 fdr함수를 2,000번 호출해야하는데 이게 시간이 굉장히 오래걸립니다.

다음 포스팅은 멀티프로세싱을 이용하여 2000개 가량의 종목을 매우 빠르게 불러오는 방식에 대해 설명합니다. 

댓글