2020년 5월 25일 월요일

[주식과 파이썬]웹에서 전체 주식코드 조회하고 파이썬으로 활용하기 쉽게 구분하기


[주식과 파이썬]전체 주식코드 조회하고 파이썬으로 활용하기 쉽게 구분하기

이전 포스트에서 주식시장에서 개인투자자들이 활용하기 좋은 퀀트투자기법에 대해서 소개하였습니다.


퀀트전략의 시작은 종목선택이라고 할 수 있습니다.
종목선택을 하기위해서 주식시장에 상장되어 있는 수백개의 회사를 하나하나 분석해서 투자하기 적합한 종목을 선정하는 것은 여건 힘든 일이 아닙니다.

자신이 종사하고 있는 업종이나, 평소 관심이 있는 분야에 대한 투자라면 직접 몇개 회사를 선택해서 분석이 가능하겠지만, 한쪽에 쏠린 투자로는 균형에 잡힌 수익을 얻기 힘듭니다.

그래서 요즘은 프로그래밍을 모르는 사람도 쉽게 접근할 수 있는 '파이썬(python)'을 이용해서 주식종목을 분석하는 개인투자자들이 많습니다.

파이썬으로 주식종목을 분석하기 위해서 가장 먼저 해야되는 것이 '종목코드'를 구하는 것입니다.

'종목코드'를 구해야 되는 이유

주식을 수작업으로 분석할 때는 종목코드를 알 필요가 없습니다. 그냥 회사명을 보면 되기 때문입니다. 그러나, 수백개의 회사를 파이썬이든 엑셀이든 컴퓨터를 이용해서 분석할 때는 종목코드가 반드시 필요합니다.

특히 주식종목을 분석할 때, 필요한 정보(주가, 재무정보 등)를 여러군데의 소스를 통해서 얻게 되는데, 그런 정보를 하나로 모을 때 바로 종목코드를 기준이 되기 때문입니다.

가장 쉽게 종목코드를 구하는 방법

주식시장 전체 종목에 대해서 종목코드를 가장 쉽게 구하는 방법은 '한국거래소 전자공시 홈페이지' 또는 '한국거래소'를 통해서 엑셀파일로 다운로드 받는 방법입니다.


종목코드 조회
종목코드 조회

시장구분에서 [전체], [유가증권(코스피)], [코스닥], [코넥스] 중 조회하고 싶은 시장을 선택해서 조회하면 됩니다.

종목조회 엑셀
엑셀파일 내용(종목조회)

한가지 아쉬운 점은 엑셀파일에 시장구분이 없습니다. 그래서 시장구분을 [전체]로 다운 받으면, 엑셀파일만 보고서는 [코스피], [코스닥]을 구분할 수 없습니다.


파이썬으로 종목코드를 구하는 방법

한국거래소 등의 사이트를 통해서 종목코드를 구하는 방법도 유용하지만, 시장구분이 안되는 점과 매번 조회에서 파일을 다운로드 받아야 된다는 점이 불편합니다.

그래서 구글검색을 해보니, KTB투자증권의 '종목코드조회'가 나옵니다.
갓구글에 의해서 해당 페이지가 나오는데는 이유가 있을 것이라 생각하고, 소스를 보니.. 역시나 갓구글님..

KTB투자증권 종목코드 조회
KTB투자증권 종목코드 조회와 코드

KTB의 종목코드조회 페이지는 조회되는 기업의 모든 종목코드를 담고 있었습니다.

1
2
3
<a href="javascript:fnOnClick('2','000040','KR모터스
','100','100','1','KOSPI','015','KR7000040006')">KR모터스
</a>
cs

위에 보면 자바스크립트를 실행시키면서 우리가 원하는 종목코드(단축코드)와 종목명 그리고 시장 구분에 대한 정보까지 모두 가지고 있는 걸 볼 수 있습니다.

종목코드라는게 한달에 한번정도 조회해도 충분하기 때문에 개인이 쓰기에는 서버 부담이 없을 것이라는 판단과 파이썬에 대해서 공부한다는 목적으로 이용하겠습니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
from bs4 import BeautifulSoup
import requests
import pandas as pd
 
headers = {"User-Agent""Mozilla/5.0 (Macintosh; Intel Mac OS X 10.9; rv:50.0) Gecko/20100101 Firefox/50.0"}
 
url = "https://www.ktb.co.kr/trading/popup/itemPop.jspx"
 
    
res = requests.get(url, headers = headers)
bsObj = BeautifulSoup(res.content, "html.parser")
 
oing = bsObj.find_all('a', href = True)
 
codelist = pd.DataFrame(columns = ['종목코드','종목명','시장구분'])
 
for a in oing:
    href = a.attrs['href']
    b = str(href).split("\'")
    
    if b[0== 'javascript:fnOnClick(':
        c = str(b[3])
        d = b[5].strip()
        e = b[13]
        f = [c, d, e]
        codelist.loc[len(codelist)] = f
    else:
        print('어?')
 
codelist.drop_duplicates(['종목코드'])
codelist.sort_values(by = ['종목코드'])
 
#우선, 파생 제거
con_codelist2 = codelist['종목코드'].str.get(i = -1)=='0'
codelist2 = codelist[con_codelist2]
 
codelist.to_excel("Jusic_Code.xlsx", index = False)
codelist2.to_excel("Jusic_Code2.xlsx", index = False)
 
cs

전문적으로 코딩을 하는 사람이 아니라서 코드가 어지럽지만.. 그래도 잘 돌아가네요.


먼저 인터넷의 자료를 가져오기 위해서 뷰티풀스프4와 리퀘스트를 가지고 오고, 자료를 정리하기 위해서 판다스를 가지고 입니다.

from bs4 import BeautifulSoup
import requests
import pandas as pd

그리고 Requests를 이용해서 소스를 가지고 와서 BeautifulSoup4를 이용해서 HTML을 파서(parser)하고 필요한 정보가 있는 곳을 찾습니다.

판다스(pd)를 이용해서 미리 데이터프레임(DataFrame)을 만들어두고, 미리 찾은 종목코드와 종목명, 시장구분을 데이터프레임에 넣어줍니다. 이때 약간 주의할 점은 종목코드는 6자리 정수로 되어 있는데, 앞에 '0'이 붙어 있습니다. 이 '0'을 살려주기 위해서 데이터를 문자열(string)으로 변환해서 가지고 오면 나중에 따로 '0'을 붙이는 작업 줄일 수 있습니다.

데이터프레임을 사용하기 편하게 엑셀파일로 저장을 하면 끝입니다.
나중에 이 엑셀파일을 불러와서 다른 자료를 찾는데 이용하거나, 찾은 자료의 값을 매칭시키는데 활용할 수 있습니다.

종목 선정을 하기 위한 종목코드이기에 우선주나 파생상품을 제외했습니다.

con_codelist2 = codelist['종목코드'].str.get(i = -1)=='0'
codelist2 = codelist[con_codelist2]

종목코드의 마지막 자리수가 '0'이 아닌 종목은 우선주나 파생상품이더군요. 그래서 마지막 자리수가 '0'인 코드만 조건문을 이용해서 구분해서 따로 저장합니다.

종목코드 파이썬 결과
종목코드 파이썬 결과

새로운 종목코드가 필요할 때마다 실행해서 바로 종목코드를 받아볼 수 있는 간단한 파이썬 코드입니다.


댓글 없음:

댓글 쓰기