경제적 독립하기/[투자] Project tatabox

네이버 금융 사이트에서 코스피 코스닥 전 종목 재무제표를 가져오자 (계량투자의 시작)

Bright_Ocean 2020. 6. 29. 19:07
반응형

 

 

안녕하세요!

 

Bright_Ocean 입니다.

지난 포스팅에서 말씀드린대로

코스닥 코스피 전 종목에 대한 재무제표를 긁어오는 과정을

어제와 오늘 파이썬 코드를 이용하여 마무리를 하였습니다.

 

 

이번 포스팅은 이 과정에 대해서 정리하여 보도록 하겠습니다.

일정한 금액 (한 1억정도...?) 의 자본금이 모일 때 까지는 단타매매만을 

진행 하려고 해 보았지만, 학업과 현식적인 문제를 고려하여 

그동안 관심있었던 계량 투자에 관해서도 실험적으로 진행해 보기로 하였습니다.

 

 

우선적으로 종목들을 스크리닝 하기 위해서는 데이터가 있어야 겠죠?

네이버 금융 페이지에 들어가보면 재무데이터를 찾을 수 있습니다.

 

 

 

 

 

위 스크린샷은 네이버 금융에 올라온 삼성전자의 데이터 입니다. 코스피와 코스닥에 존재하는 모든 종목들의 

모든 재무 표 데이터들을 긁어 올 생각입니다.

 

 

 

자주 쓰는 프로그래밍 언어가 파이썬 이므로

파이썬으로 진행해 보았습니다.

코드를 함께 보실까요? 코드에 익숙하시지 않으시다면 밑으로 더 내리시면

결과물인 엑셀 화면을 보시면 좋겠습니다.

우선은 코스피 부터 시작하겠습니다.

 

#KOSPI Version
import pandas as pd
import numpy as np
import requests
import re
from bs4 import BeautifulSoup

req = requests.get('https://finance.naver.com/sise/sise_market_sum.nhn?sosok=0')
html = req.text
soup = BeautifulSoup(html)

#finding the last page
last_page = soup.find('td', {'class': 'pgRR'})
last_number = re.findall(r'\d+',last_page.a.get('href'))[1]

db = pd.DataFrame()
#page iteration
for i in range(1,int(last_number) + 1):    
    #KOSPI
    req = requests.get('https://finance.naver.com/sise/sise_market_sum.nhn?&page='+str(i))
    html = req.text
    soup = BeautifulSoup(html)
    
    #find company list for each page
    company_list = soup.find_all('a', {'class': 'tltle'})
    
    #company iteration for each page
    for company in company_list:
        company_code = re.search('\d+',company.get('href')).group()
        company_name = company.text
        
        #extracting fianacial statement 
        company_url = 'https://finance.naver.com/item/main.nhn?code=' + str(company_code)
        df = pd.read_html(company_url, encoding ='euc-kr')[3]
        
        #ETF exception
        if df.columns[0] == '구성종목(구성자산)' or df.columns[0] == 0 or df.iloc[:,1:].isnull().all(axis = None):
            continue
        
        #dataframe arrange
        df.columns = df.columns.droplevel([0,2])
        df.index = df['주요재무정보']
        df_arrange = df.iloc[:,1:]
        
        data = pd.DataFrame(df_arrange.stack(dropna = False))
        if company_name == company_list[0]:
            index = data.index.to_flat_index()
        data.index = index
        
        df2 = pd.DataFrame([company_code, company_name], index = ['code', 'name'])
        df2 = df2.append(data).T
        
        print(company_name)
        db = db.append(df2, ignore_index= True)
        
#save to csv file
db.to_csv("KOSPI.csv", index = False, encoding='utf-8-sig')

 

 

 

코드에 대한 설명은 지루해질 수 있으니

그냥 이 친구가 멀 만들었구만 하고 

생각하고 넘어가도록 합시다.

 

 

 

 

다음은 코스닥 입니다.

사실 두 코드가 매우 유사해서 합쳐서 만들 수도 있지만 그냥 저는 가끔 한번씩 돌려서

데이터만 얻어올 예정이기도 하고 코스닥 종목들만 투자하는 경향이 있어서

두개를 따로 만들었습니다.

 

 

#KOSDAQ Version
import pandas as pd
import numpy as np
import requests
import re
from bs4 import BeautifulSoup

req = requests.get('https://finance.naver.com/sise/sise_market_sum.nhn?sosok=1')
html = req.text
soup = BeautifulSoup(html)

#finding the last page
last_page = soup.find('td', {'class': 'pgRR'})
last_number = re.findall(r'\d+',last_page.a.get('href'))[1]

db = pd.DataFrame()
#page iteration
for i in range(1,int(last_number) + 1):    
    #KOSDAQ
    req = requests.get('https://finance.naver.com/sise/sise_market_sum.nhn?sosok=1&page='+str(i))
    html = req.text
    soup = BeautifulSoup(html)
    
    #find company list for each page
    company_list = soup.find_all('a', {'class': 'tltle'})
    
    #company iteration for each page
    for company in company_list:
        company_code = re.search('\d+',company.get('href')).group()
        company_name = company.text
        
        #extracting fianacial statement 
        company_url = 'https://finance.naver.com/item/main.nhn?code=' + str(company_code)
        df = pd.read_html(company_url, encoding ='euc-kr')[3]
        
        #ETF exception
        if df.columns[0] == '구성종목(구성자산)' or df.columns[0] == 0 or df.iloc[:,1:].isnull().all(axis = None) or df.columns[5] == 'Unnamed: 5_level_1':
            continue
        
        #dataframe arrange
        df.columns = df.columns.droplevel([0,2])
        df.index = df['주요재무정보']
        df_arrange = df.iloc[:,1:]
        
        data = pd.DataFrame(df_arrange.stack(dropna = False))
        
        if company_name == company_list[0].text:
            index = data.index.to_flat_index()
        data.index = index
        
        df2 = pd.DataFrame([company_code, company_name], index = ['code', 'name'])
        df2 = df2.append(data).T
        
        print(company_name)
        try:
            db = db.append(df2, ignore_index= True)
        except:
            continue

#save as csv file
db.to_csv("KOSDAQ.csv", index = False, encoding='utf-8-sig')

 

 

 

코드가 뭐 중요하겠습니까

결과물이 중요하겠지요

한번 같이 살펴볼까요?

 

 

 

 

 

 

우선적으로 앞부분에는 종목코드와 종목명을 붙여서 종목에 대한 확인이 쉽게 만들어 주었습니다.

컬럼이 많아서 뒤쪽은 가려졌지만

 

 

 

 

PBR, PBR, ROE, 부채비율 등의 기본적인 지표들도 포함하고 있기 때문에 요 컬럼들을 요리조리 만져주면서

스크리닝을 해보도록 하겠습니다. 

 

 

 

 

 

그럼 모두들 성투하세요~

 

 

 

 

 

혹시나 코드에 문제가 있거나 질문이 있으시면

블로그에 적혀있는 주소로 메일을 부탁드립니다.

 

 

 

반응형