주식 데이터 가져오기 (종목 코드와 주가)
주가 데이터를 가져오는 법을 알았으니 가져오려는 주식의 코드 정보를 알아야 겠죠 ?
그 방법을 알아보도록 하겠습니다.
1. KRX 에서 수동으로 다운받기
아래 링크에서 수동으로 코드를 받아 올 수 있습니다.
https://kind.krx.co.kr/corpgeneral/corpList.do?method=loadInitPage
시장 구분에서 원하는 거래소를 선택한뒤 EXCEL 버튼을 눌러 다운로드 하면 됩니다.
2. Pandas 를 이용해 웹 크롤링
이 과정은 1의 과정은 자동으로 하는 것과 같습니다.
크롬 개발자도구를 켜고 네트워크 탭을 선택합니다.
시장구분은 유가증권으로 선택한뒤 EXCEL 버튼을 눌러보세요
위 화면에서 corpList.do 를 Click 해서 Headers 를 보면 Request URL 이 아래와 같이 되어 있을 것입니다.
http://kind.krx.co.kr/corpgeneral/corpList.do
그리고 화면을 내려서 Form Data 칸을 보면 아래와 같이 되어 있습니다.
즉 사용자가 EXCEL 버튼을 누르면 web 브라우저가 Request URL 에 Form Data를 포함하여 데이터를 요청합니다. 그럼 KRX 서버는 요청에 맞게 데이터를 돌려주는 것이지요
이 요청을 파이썬에서 하면 우리는 바로 데이터를 바로 얻어 올 수 있습니다.
해당 기능을 하는 함수를 만들어 봅시다. getStockCodeAndPrice.py 파일을 autoTradeLesson 폴더 및에 만든 후 아래 코드를 입력합니다.
import pandas as pd
def getStockCode(market): if market == 'kosdaq': url_market = 'kosdaqMkt' elif market == 'kospi': url_market = 'stockMkt' else: print('invalid market ') return url = 'http://kind.krx.co.kr/corpgeneral/corpList.do?method=download&searchType=13&marketType=%s' % url_market df = pd.read_html(url, header=0)[0] return df if __name__ == '__main__': result_df = getStockCode('kosdaq') print(result_df)
위 코드에서 pandas 라는 라이브러리를 사용했는데 해당 라이브러리는 pandas-datareader 를 설치하면 같이 설치되는 라이브러리 입니다. 앞으로의 개발에 pandas 가 정말 많이 사용될 텐데요 pandas에 대해서는 나중에 시간이 나면 한번 포스팅 해보겠습니다.
(일단은 여기서 한번 보시는걸로.. — pandas 라이브러리 도큐먼트)
getStockCode 함수는 마켓이름을 인자로 받아 Kospi 혹은 Kosdaq 에 상장된 회사 정보를 받아 옵니다. kospi 데이터 를 받아 오고 싶으면 getStockCode(‘kospi’) 를 호출 하시면됩니다.
3. 가져온 데이터 처리하기
Yahoo 에서 주가 데이터를 가져오려면 종목코드가 필요합니다. 참고로 Yahoo 에 주가를 요청할 때 쓰이는 인자 형식은 아래와 같습니다.
- Kospi: {종목코드}.KS
- Kosdaq: {종목코드}.KQ
즉 우리는 getStockCode 로 받아온 결과물 중 일단은 회사명과 종목코드만 필요 합니다. 그럼 받아온 데이터를 저장하고 그 중 원하는 데이터만 추출하는 코드를 만들어 보겠습니다.
if __name__ == '__main__': result_df = getStockCode('kospi') result_df.to_csv('kospi.csv') print(result_df[['회사명', '종목코드']])
위 코드를 실행하면 코드가 실행되는 폴더인 autoTradeLesson 폴더에 kospi.csv 파일이 저장되고 Pycharm 결과 부분에 아래와 같이 출력되는 것을 확인 하실 수 있습니다.
4. Yahoo에 모든/선택 종목의 주가 데이터 요청하기
위 작업에서 웹에서 받아온 종목코드 관련 데이터를 kospi.csv 파일에 저장 했습니다.
이제 이 파일을 읽어서 회사이름과 종목코드를 추출 한 뒤 특정 회사 혹은 거래소 전체의 주가를 받아오는 코드를 작성해 보겠습니다.
from pandas_datareader import data import os def getStockPrice(market, companyNameList = []): dirName = "stockPriceData" # -------------- dirName을 가진 폴더가 없으면 폴더를 만듬 ----------- try: if not (os.path.isdir(dirName)): os.makedirs(os.path.join(dirName)) except OSError as e: print("Failed to create directory!!!!!", e) return # -------------- 저장한 종목 코드가 담겨있는 CSV 파일을 Open ----------- csv_file_name = market + '.csv' try: df = pd.read_csv(csv_file_name) except: print ('No file ') return # -------------- 종목코드를 Yahoo 가 이해할 수 있는 코드로 변환 ----------- suffix = '.KS' if market == 'kospi' else '.KQ' df_nameAndCode = df[['회사명', '종목코드']] df_nameAndCode['종목코드'] = df_nameAndCode['종목코드'].astype(str) df_nameAndCode['종목코드'] = df_nameAndCode['종목코드'].str.zfill(6) + suffix # -------------- 전체종목 가져오기 ----------- if companyNameList == []: for idx, dat in df_nameAndCode.iterrows(): try: df_stockPrice = data.get_data_yahoo(dat['종목코드']) fileName = os.path.join(dirName, dat['회사명'] + '.csv') df_stockPrice.to_csv(fileName) print(dat['회사명'], ' Saved') except Exception as e: print(dat['회사명'], e) # -------------- companyNameList 에 정의된 종목만 가져오기 ----------- else: for companyName in companyNameList: try: idx = df_nameAndCode['회사명'].tolist().index(companyName) df_stockPrice = data.get_data_yahoo(df_nameAndCode['종목코드'][idx]) fileName = os.path.join(dirName, df_nameAndCode['회사명'][idx] + '.csv') df_stockPrice.to_csv(fileName) print(df_nameAndCode['회사명'][idx], ' Saved') except Exception as e: print(e)
작업 파일에 위 함수를 작성한 뒤 파일 하단에서 함수를 불러줌으로써 원하는 데이터를 얻을 수 있습니다.
if __name__ == '__main__': #result_df = getStockCode('kospi') #result_df.to_csv('kospi.csv') #print(result_df[['회사명', '종목코드']]) #getStockPrice('kospi') # 전체 kospi 주가를 가져옴 getStockPrice('kospi', ['신세계', '삼성전자'])# List 안의 종목만 가져옴
아래 빨간색 내용은 Warning 이니 일단 무시하셔도 됩니다.
아래와 같이 삼성전자와 신세계의 주가 데이터 값이 csv 형식으로 저장되어 있는 것을 확인 하실 수 있습니다.
5. 결과
Yahoo 에서 주가를 얻어 오는것 은 간편하지만 전체 코드에 대해서 주가 가져오기를 실행하면 매우 오래 걸리더군요.. 그리고 빈번한 Request로 인해서 요청이 실패하는 경우도 간간히 있었구요..
Yahoo 요청은 과거 데이터를 기반으로 백테스팅 할 때 쓰면 좋을 것 같습니다.
Yahoo는 이제 그만 괴롭히고 다음 포스트에서는 키움증권 API 를 다뤄 보도록 하겠습니다.
♦ 결과 코드는 아래 Github를 참조해 주세요
https://github.com/hog225/autoTradeLesson
getStockCodeAndPrice.py 파일을 참조하시면 됩니다.