Sponsored By
















출처 : https://minjejeon.github.io/learningstock/2017/09/07/download-krx-ticker-symbols-at-once.html

 

파이썬 코드 한줄로 종목코드 한번에 다운받기

야후 파이낸스 API를 이용하여 주가정보 수집하기에서는 종목코드(주식코드)를 하나씩 입력해야 주가정보를 다운로드 할 수 있습니다. 코스피나, 코스닥 전체의 정보를 받고 싶으면 시장에 속해 있는 기업들의 종목코드 리스트를 알아야겠죠?

http://financialfreedom.kr/834-2/에 종목코드를 한번에 받을 수 있는 쉬운 방법이 올라와 있어서 파이썬으로 리스트를 바로 받을 수 있게 만들어 봤어요. 파이썬을 안 쓰고 엑셀로 받으시려면 링크의 글을 참고하세요.

pandas 한줄로 종목코드 다운받기

pandas의 read_html 기능을 이용하여 인터넷에 있는 테이블을 한줄로 불러옵니다. pandas에서 파일을 읽어들이는 함수들은 인터넷 주소를 줘도 알아서 잘 받아와요.

import pandas as pd

df = pd.read_html('http://kind.krx.co.kr/corpgeneral/corpList.do?method=download&searchType=13', header=0)[0]
df.head()

인터넷 브라우저에서 엑셀 파일 다운로드 버튼을 누를 때에는 엑셀 파일이 다운로드 되는데, 다운로드 된 파일의 실제 내용은 html 테이블이기 때문에 read_excel 대신 read_html 함수로 불러옵니다.

Out:
     회사명  종목코드                                         업종  \
0       BYC      1460                              봉제의복 제조업
1    CJ CGV     79160  영화, 비디오물, 방송프로그램 제작 및 배급업
2  CJ씨푸드     11150                             기타 식품 제조업
3   DSR제강     69730                              1차 철강 제조업
4    KB금융    105560                                  기타 금융업
주요제품
0 메리야스,란제리 제조,도매/건축공사/부동산 임대,분양,공급......
1 영화상영,영화관 운영
2 수산물(어묵,맛살)가공품 도매,원양수산업,수출입
3 와이어로프,각종 경강선,철선제품,PC강선,아연도 강연선 제조......
상장일 결산월 대표자명 홈페이지
0 1975-06-02 12월 유 중 화 http://www.byc.co.kr
1 2004-12-24 12월 서 정 http://www.cgv.co.kr
2 1988-11-26 12월 유병철, 강신호(각자대표) http://www.cjseafood.net
3 2003-01-28 12월 홍하종 http://www.dsrcorp.com
4 2008-10-10 12월 윤종규 http://www.kbfg.com
지역
0 서울특별시 
1 서울특별시 
2 경기도 
3 전라남도 
4 서울특별시

 

종목코드 부분이 6자리 숫자로 나오지 않기 때문에 앞자리를 0으로 채워줍니다.

df.종목코드 = df.종목코드.map('{:06d}'.format) 
df.종목코드.head()

Out: 
0 001460 
1 079160 
2 011150 
3 069730 
4 105560 
Name: 종목코드, dtype: object

위에 잘 보면… 시장구분이 빠져 있어요. 엑셀 양식에 시장구분이 빠져 있어서 그런데, 시장을 구분하려면 다운받을 URL의 파라미터를 조정하면 됩니다. 하지만 일일이 하려면 귀찮잖아요? 그래서 코드를 만들어 놨어요. 아래 코드를 실행시키세요. 위 내용의 종합판입니다.

import urllib.parse
import pandas as pd

MARKET_CODE_DICT = {
    'kospi': 'stockMkt',
    'kosdaq': 'kosdaqMkt',
    'konex': 'konexMkt'
}

DOWNLOAD_URL = 'kind.krx.co.kr/corpgeneral/corpList.do'

def download_stock_codes(market=None, delisted=False):
    params = {'method': 'download'}

    if market.lower() in MARKET_CODE_DICT:
        params['marketType'] = MARKET_CODE_DICT[market]

    if not delisted:
        params['searchType'] = 13

    params_string = urllib.parse.urlencode(params)
    request_url = urllib.parse.urlunsplit(['http', DOWNLOAD_URL, '', params_string, ''])

    df = pd.read_html(request_url, header=0)[0]
    df.종목코드 = df.종목코드.map('{:06d}'.format)

    return df

이제 코스닥 시장의 종목코드를 한꺼번에 받아볼까요?

kosdaq_stocks = download_stock_codes('kosdaq')
kosdaq_stocks.head()
Out:
           회사명 종목코드                       업종               주요제품  \
0          CJ E&M   130960            텔레비전 방송업       방송게임영화음악
1    CJ프레시웨이   051500   음·식료품 및 담배 도매업   식자재유통, 단체급식
2  GMR 머티리얼즈   032860  해체, 선별 및 원료 재생업               철스크랩
3   IBKS제5호스팩   254120         금융 지원 서비스업           기업인수합병
4          KD건설   044180                건물 건설업  몰드베이스(Mold Base)

       상장일 결산월 대표자명                     홈페이지        지역
0  2010-10-15   12월   김성수         http://www.cjenm.com  서울특별시
1  2001-07-26   12월   문종석    http://www.cjfreshway.com      경기도
2  1997-07-04   12월   김동은  http://www.gmrmaterials.com    충청남도
3  2016-12-02   12월   김형준                          NaN  서울특별시
4  2000-11-16   12월   구정회      http://dymoldtech.co.kr      경기도

야후 파이낸스 API를 이용하여 주가정보 수집하기에서 나온 방법대로 위에 나와있는 5개 종목의 최근 수정주가를 출력해보자.

from pandas_datareader import data

results = {}
for code in kosdaq_stocks.종목코드.head():
    results[code] = data.DataReader(code + '.KQ', 'yahoo', '2017-01-01', None)

df = pd.concat(results, axis=1)
df.loc[:, pd.IndexSlice[:, 'Adj Close']].tail()
Out:
              032860    044180    051500    130960    254120
           Adj Close Adj Close Adj Close Adj Close Adj Close
Date
2017-09-01     635.0     213.0   41550.0   75600.0    2070.0
2017-09-04     624.0     207.0   40400.0   75000.0    2070.0
2017-09-05     625.0     207.0   40750.0   75100.0    2040.0
2017-09-06     619.0     211.0   38250.0   76900.0    2055.0
2017-09-07     620.0     211.0   39000.0   77000.0    2060.0

 

※. 전체 코드 정리

from pandas_datareader import data
import urllib.parse
import pandas as pd

# 마켓 지정 (딕셔너리)
MARKET_CODE_DICT = {
    'kospi': 'stockMkt',
    'kosdaq': 'kosdaqMkt',
    'konex': 'konexMkt'
}

# 전체 주소 : http://kind.krx.co.kr/corpgeneral/corpList.do?method=download&searchType=13
DOWNLOAD_URL = 'kind.krx.co.kr/corpgeneral/corpList.do'


def download_stock_codes(market=None, delisted=False):
    params = {'method': 'download'}

    if market.lower() in MARKET_CODE_DICT:
        params['marketType'] = MARKET_CODE_DICT[market]

    if not delisted:
        params['searchType'] = 13

    params_string = urllib.parse.urlencode(params)
    request_url = urllib.parse.urlunsplit(['http', DOWNLOAD_URL, '', params_string, ''])

    df = pd.read_html(request_url, header=0)[0]
    # 종목코드 6자리 맞추기
    df.종목코드 = df.종목코드.map('{:06d}'.format)

    return df

# 원하는 마켓 정보 불러오기
kosdaq_stocks = download_stock_codes('kosdaq')
#kosdaq_stocks = download_stock_codes('kospi')
# 불러온 데이터에서 헤드만 선택
kosdaq_stocks.head()

# 결과를 담을 리스트 생성
results = {}

# 종목코드 헤드 갯수만큼 코드 및 날자 results에 저장
for code in kosdaq_stocks.종목코드.head():
    results[code] = data.DataReader(code + '.KQ', 'yahoo', '2017-01-01', None)
    #results[code] = data.DataReader(code + '.KS', 'yahoo', '2017-01-01', None)

# 결과값중 최근 수정값만 선택(axis=1)
df = pd.concat(results, axis=1)
# Adj Close만 선택
df.loc[:, pd.IndexSlice[:, 'Adj Close']]
#print(results)

결과 :

Out:
              032860    044180    051500    130960    254120
           Adj Close Adj Close Adj Close Adj Close Adj Close
Date
2017-09-01     635.0     213.0   41550.0   75600.0    2070.0
2017-09-04     624.0     207.0   40400.0   75000.0    2070.0
2017-09-05     625.0     207.0   40750.0   75100.0    2040.0
2017-09-06     619.0     211.0   38250.0   76900.0    2055.0
2017-09-07     620.0     211.0   39000.0   77000.0    2060.0


Sponsored By















+ Recent posts