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

  • 관련 카테고리 : Python, 스터디LAB

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

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

     

    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...