(1) 5개년치 재무제표 불러오기 (fnguide)

(2) 종목 별 주가(가장 최근) 불러오기

(3) Database에 저장하기

(4) PER&EPS, PBR&BPS, S-RIM으로 적정주가 산출 및 기대수익률 구하기

(5) 기대수익률 순으로 Sorting하기

(6) Hyper Parameter 기반으로, 조건 정교화하기

위의 순서대로 적정주가 계산하는 간단한 프로그램을 만들려고 한다. (파이썬을 이용하였다.)

 

-----------------------------------------------------------

 

먼저, 증권거래소에서 회사명/업종/주요제품에 대한 정보를 크롤링하였다.

적정주가를 계산하는 것도 중요하지만, 어떤 산업인지도 종목선정할 때 기준이 되기 때문에 함께 긁어왔다.

(예를 들어 자동차부품산업이나, Cost를 통제하기 어려운 산업, 사이클 경기를 타는 산업은 내기준에서 투자하기 어려운 종목들이다)

 

1
2
3
4
5
6
7
8
9
import pandas as pd
from pandas import DataFrame
from pandas import ExcelWriter
 
code_df = pd.read_html('http://kind.krx.co.kr/corpgeneral/corpList.do?method=download&searchType=13', header=0)[0]
 
code_df.종목코드 = code_df.종목코드.map("{:06d}".format)
code_df = code_df[['종목코드''회사명''업종''주요제품']]
code_df = code_df.rename(columns={'종목코드''code''회사명':'name''업종' : 'industry''주요제품' : 'main_product'})
cs

 

우선 pandas의 read_html을 활용해서, 종목코드, 회사이름, 업종, 주요제품에 대한 정보를 가져왔다. 

 

이런식으로 각 code에 대한 회사명, 업종, 주요제품을 가져올 수 있다.

 

-----------------------------------------------------------

 

두 번째로는 Fnguide에 있는 재무제표를 크롤링 하는 것으로, 파이썬에서는 일반적으로 BeautifulSoup를 많이 사용한다.

일반적인 코드는 인터넷 검색으로 참고를 하였고, 일부 Error에 대해서 예외 처리를 하였다.

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
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
def get_fnguide_table(code):
    
    try
 
        ''' 경로 탐색'''
        url = re.get('http://comp.fnguide.com/SVO2/ASP/SVD_main.asp?pGB=1&gicode=A%s'%(code))
        url = url.content
 
        html = BeautifulSoup(url,'html.parser')
        body = html.find('body')
 
        fn_body = body.find('div',{'class':'fng_body asp_body'})
        ur_table = fn_body.find('div',{'id':'div15'})
        table = ur_table.find('div',{'id':'highlight_D_Y'})
 
        tbody = table.find('tbody')
        tr = tbody.find_all('tr')
        Table = DataFrame()
 
        for i in tr:
 
            ''' 항목 가져오기'''
            category = i.find('span',{'class':'txt_acd'})
 
            if category == None:
                category = i.find('th')   
 
            category = category.text.strip()
 
 
            '''값 가져오기'''
            value_list =[]
 
            j = i.find_all('td',{'class':'r'})
 
            for value in j:
                temp = value.text.replace(',','').strip()
 
                try:
                    temp = float(temp)
                    value_list.append(temp)
                except:
                    value_list.append(0)
 
            Table['%s'%(category)] = value_list
 
            ''' 기간 가져오기 '''    
 
            thead = table.find('thead')
            tr_2 = thead.find('tr',{'class':'td_gapcolor2'}).find_all('th')
            year_list = []
 
            for i in tr_2:
                try:
                    temp_year = i.find('span',{'class':'txt_acd'}).text
                except:
                    temp_year = i.text
                year_list.append(temp_year)
            Table.index = year_list
 
        #Table = Table.T
        Table.reset_index(level=0, inplace=True)
        Table = Table.rename(columns={'index''year'}) 
        Table['code'= code
        
            #Table = Table.append(Table)
        Table = Table.loc[Table.year.isin(['2014/12''2015/12''2016/12''2017/12''2018/12''2019/12'])]
        return Table
    
    except
        print('error detection!')
cs

이렇게 get_fnguide_table라는 code를 입력하면, 그 코드에 대한 5년치 재무제표를 반환해주는 함수가 생겼다. 

 

예를들어 가장 흔한 삼성전자를 해당함수에 대입해본다면,

삼성전자 재무제표 크롤링

위와 같이, 2015년~ 2019년 5개년간의 기본적인 재무정보가 나온다. 

(삼성전자의 2018년 영업이익이 무려 58조가 넘는다. 정말 거대한 기업이다.)

 

하지만, 내가 원하는 것은 내가 아는 종목을 검색해서 재무제표를 찾는 것이 아니라, 

전체 종목에 대한 재무제표 정보를 크롤링 하는 것이다.

1
2
3
4
5
code_list = code_df['code'].values.tolist()
df = pd.DataFrame(columns = [])
 
for i in code_list:
    df = df.append(get_fnguide_table(i))
cs

이렇게 아까 생성한 code_df를 list화 시킨 후, for문으로 전체 크롤링 정보를 df라는 데이터프레임에 담아놓았다. 

2000개가 넘는 종목에 대해서 for문을 돌리는 것이라 시간이 조금 소요되기는 한다. 

 

df에 전종목에 대한 재무정보가 다 적재가 되었다. 내가 관심을 두고 있는 대한약품(023910)으로,

데이터가 잘 생성되었는지 검증을 해보았고, 다행히 잘 적재가 된 것 같다.

이렇게 5년치 재무제표를 불러오는 것은 성공하였다.

 

그 다음 글에서는, 종목 별 주가 데이터까지 불러온 뒤, data base에 적재하는 것까지 해보려고 한다.

728x90

+ Recent posts