주식 데이터 가져오기 (종목 코드와 주가)

주가 데이터를 가져오는 법을 알았으니 가져오려는 주식의 코드 정보를 알아야 겠죠 ? 

그 방법을 알아보도록 하겠습니다. 

 

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’) 를 호출 하시면됩니다. 

getStockCode(‘kosdaq’) 결과

 

3. 가져온 데이터 처리하기 

Yahoo 에서 주가 데이터를 가져오려면 종목코드가 필요합니다. 참고로 Yahoo 에 주가를 요청할 때 쓰이는 인자 형식은 아래와 같습니다. 

  1. Kospi: {종목코드}.KS
  2. 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 파일을 참조하시면 됩니다. 

 

 

You may also like...

댓글 남기기

이메일은 공개되지 않습니다.