반응형

안녕하세요, 왕초보 코린이를 위한 코딩유치원에 오신 것을 환영합니다.

코딩유치원에서는 파이썬 기초부터 사무자동화, 웹크롤링, 데이터 분석 등의 다양한 패키지까지 초보자도 알기 쉽도록 내용을 정리해 놓았습니다.

업무는 물론 투자에도 도움이 될만한 전자공시시스템(DART)텔레그램(Telegram) 관련 패키지도 배울 수 있으니 많은 관심 부탁드립니다.


오늘은 어제 오늘 도전해봤던 코스피, 코스닥 상장기업 영업이익 성장세로 필터링 해보기 프로젝트를 중간 정리하는 시간을 가져보겠습니다.

모두 완료하고 포스팅을 해보려 했으나, 부족한 실력으로 인해서 시간이 조금 더 걸릴 듯해서 중간 정리 글을 써보려 합니다.

1. 프로젝트에 사용된 패키지


우선 사용한 패키지는 예전에 소개드렸던 dart-fss 패키지입니다.

<DART-FSS 관련 지난 글>

2021.06.10 - [파이썬 패키지/전자공시시스템(DART)] - [Python/Dart] 파이썬으로 공시 정보 가져오기 1편_ DART API와 DART-FSS 패키지 소개
2021.06.22 - [파이썬 패키지/전자공시시스템(DART)] - [Python/Dart] 파이썬으로 공시 정보 가져오기 2편_ 상장된 회사 재무제표 EXCEL로 저장하기
2021.06.25 - [파이썬 패키지/전자공시시스템(DART)] - [Python/Dart] 파이썬으로 공시 정보 가져오기 3편_특정회사 혹은 특정 공시유형 가져오기
2021.06.27 - [파이썬 패키지/전자공시시스템(DART)] - [Python/Dart] 파이썬으로 공시 정보 가져오기 4편_재무제표 4종 골라서 DataFrame으로 추출하기(ft. 재무상태표, 손익계산서, 포괄손익계산서, 현금흐름표)
2021.06.27 - [파이썬 패키지/전자공시시스템(DART)] - [Python/Dart] 파이썬으로 공시 정보 가져오기 5편_dart-fss 재무제표 다운로드 안될 때 해결법
2021.06.30 - [파이썬 패키지/주식투자] - [Python/Dart] 파이썬으로 공시 정보 가져오기 6편_XBRL 데이터 추출(ft. 제무재표, 감사 정보, 작성자 정보, 공시문서 정보 등등)


공부하면서 느꼈지만 해당 패키지는 하나의 목적을 이루기 위한 방법이 여러 루트가 있어서 조금 정리를 할 필요가 있다고 느꼈습니다.

2. 프로젝트의 목적


프로젝트의 목적은 다음과 같습니다.

주식 시장에 상장된 모든 기업들을 살펴보기엔 시간은 한정적입니다. 그래서 원하는 재무상태나 매출/영업이익의 증가세를 가진 기업들을 공시정보를 토대로 필터링하여 엑셀로 저장하고, 이 정보를 투자 판단에 활용하는 것이 프로젝트의 목적입니다.

참고로, 이번 프로젝트에서는 dart-fss 패키지만으로도 충분하지만, 추후에 회사의 현금 및 환금성 높은 자본과 현재의 시가총액을 비교하는 프로젝트를 해볼 때에는 FinanceDataReader 패키지도 함께 다루어 볼 예정입니다.

일단 이번 프로젝트는 모든 코스피 상장 기업의 가장 최근 사업보고서(연간)를 가져와서 3년간 영업이익을 비교하고, 3년간 계속 상승했다면 해당 기업의 이름을 저장하는 것을 목표로 할 것입니다.


3. 프로젝트의 컨셉 및 장애요소


프로젝트의 큰 그림을 그려보겠습니다. 대략적인 컨셉이며 추후에 조금 변경될 수도 있습니다.

1) 상장회사 리스트 불러오기

# DART 에 공시된 회사 리스트 불러오기 corp_list = dart.get_corp_list()


2) 코스피 상장사의 회사코드와 회사명 각각 리스트에 저장

# 전체 상장기업 리스트 중 코스피만 골라서 담기 kospi_list = corp_list.find_by_sector(sector='', market='Y')

여기서 kospi_list는 821개의 요소를 가지는데, 네이버 증권에서 코스피 탭을 들어가보면 1730개가 뜸.
(이건 정확히 무슨 차이인지 확인해볼 필요가 있음)

<네이버 증권_코스피 종목>
https://m.stock.naver.com/index.html#/domestic/capitalization/KOSPI

3) for문으로 회사코드를 모두 참조하며, xbrl 다운로드
- 기업이 아닌 펀드 종목의 경우엔 xbrl이 없으므로 예외처리(try, except)
- ex. 한국ANKOR유전, 베트남개발1 등등

4) 다운받은 xbrl에서 연결/개별 재무제표 여부 판단
- xbrl.exist_consolidated( )로 True/False 리턴 받아서 if/else문
- 쉽게 요약하면, 자회사가 있으면 연결 재무제표, 없으면 개별 재무제표

5) 연결/개별에 따라서 손익계산서를 데이터 프레임 형태로 가져오기
- 연결 재무제표라고 받아서, 손익계산서를 보면 연결/개별이 열을 번갈아가면서 함께 표현되어있음

연결 재무제표 모습

- 개별 재무제표는 당연히 연결에 대한 내용은 없음
- 참고로 손익계산서(is)와 포괄손익계산서(cis) 두 가지 개념이 있음 (is는 없고 cis만 있는 경우가 있음)
- 일반적으로 손익계산서는 매출(수익)에서 비용을 뺀 당기순이익까지를 나타내며, 기타포괄손익(미실현손익) 등을 포함한 손익계산서를 포괄손익계산서(국제회계기준, K-IFRS)라고 함

일단, 3, 4, 5번 컨셉을 지금까지 함수로 구현한 것은 아래와 같음 (추후 보완 예정)

def search_annual_report(corp_code, bgn_de): data_company = corp_list.find_by_corp_code(corp_code) try: # 사업보고서 검색 reports = data_company.search_filings(bgn_de= bgn_de, pblntf_detail_ty='a001') # 첫번째 리포트 선택 report = reports[0] # 리포트의 xbrl 데이터 받아오기 xbrl = report.xbrl # 연결/개별 재무제표 여부 판단 (True/False) boolean = xbrl.exist_consolidated() if boolean == True: print('연결 재무제표') # 0에는 전체, 1에는 당기순이익부터 계산한 손익계산서가 들어있음 income_statement = xbrl.get_income_statement()[0] df = income_statement.to_DataFrame(show_concept=False, show_class=False) print(df.info) else: print('개별 재무제표') # 여기서는 True가 개별 손익계산서임에 주의 income_statement = xbrl.get_income_statement(separate=True)[0] df = income_statement.to_DataFrame(show_concept=False, show_class=False) print(df.info) return(boolean, df) except: print(data_company.corp_name + ':' + 'xbrl 없음(상품, 펀드)') return(False, False)


6) 데이터 프레임에서 원하는 정보 추출 (영업이익)
- 기업마다 양식이 통일 되지 않아서, 규칙을 잡기가 쉽지 않음 (해결해야하는 문제)
- 재무제표의 column index가 멀티 index로 되어 있음 (해결해야하는 문제)

7) 추출한 정보로 원하는 규칙을 적용하여 기업을 필터링

8) 나중에 더 나아가면 FinanceDataReader를 이용해 과거 주가를 토대로 백테스트를 할 수도 있음


이번 글은 스스로 정리하는 시간을 갖기 위해서 작성했으며, 빠른 시일 내로 해당 프로젝트를 완성하도록 하겠습니다.

관심있으신 분들은 또 들려주세요.

감사합니다.

반응형
반응형

안녕하세요, 왕초보 코린이를 위한 코딩유치원에 오신 것을 환영합니다.

코딩유치원에서는 파이썬 기초부터 사무자동화, 웹크롤링, 데이터 분석 등의 다양한 패키지까지 초보자도 알기 쉽도록 내용을 정리해 놓았습니다.

업무는 물론 투자에도 도움이 될만한 전자공시시스템(DART) 텔레그램(Telegram), 주가/지표 차트(FinanceDataReader) 관련 패키지도 배울 수 있으니 많은 관심 부탁드립니다.

 

 

<FinanceDataReader 패키지 시리즈>

 

2021.08.10 - [파이썬 패키지/데이터분석] - [Python/FinanceDataReader] 1편. 파이썬으로 국내/해외 상장주식 가격데이터 가져오기 (ft. 환율, 코인가격도 가능)

2021.08.11 - [파이썬 패키지/주식투자] - [Python/FinanceDataReader] 2편. 파이썬으로 국내/해외 상장주식 차트 그리기

 

이번 시간에는 지난 시간에 배운 FinanceDataReader를 이용해서 FRED 주요 경기 선행 지표를 분석하는 방법에 대해 공부해보겠습니다.

 


 

경기 지표란?

 

경제 지표(혹은 지수)란 너무나도 복잡한 경제를 한 눈에 파악하기 위해서 만든 통계 데이터입니다.

 

당연히 경제란 하나의 변수 혹은 데이터로 설명할 수 없으므로 다양한 데이터를 지표가 활용되며, 주로 경제적 성과를 측정하거나, 미래 경제를 예측하기 위한 수단으로 활용됩니다.

 

ex) 실업률, 이직률, 주택 착공 건수, 소비자 물가지수, 산업 생산 지수, 국내 총생산, 주식 시장의 주가, 통화량의 변화

 

또한 이러한 경기지표는 경기와의 시간순서에 따라 아래의 3가지로 크게 나뉩니다.

 

1) 경기 선행 지수

2) 경기 동행 지수

3) 경기 후행 지수

 

경기 선행 지표만 잠시 설명드리면, 경기가 좋아질지 나빠질지를 앞서 보여주는 지표를 말합니다. 즉, 선행지표를 보면 앞으로의 경기가 어떻게 될지 조금이나마 예측할 수 있는 것이죠.

 

 

 

FRED 경기 지표란?

FinanceDataReader 라이브러리는 FRED 주요 경기 선행지표 데이터를 불러올 수 있는데 여기서 FRED란 Federal Reserve Economic Data의 줄임말로 직역하자면 '연방 준비 경제 데이터'를 뜻합니다.

 

수십만 개의 국가, 국제, 공공 및 민간 출처의 경제 데이터 시계열로 구성된 온라인 데이터베이스로 너무 다양한 데이터가 존재합니다.

저도 아직 FRED에 대해 완벽히 파악하지 못하여 자세한 내용이 궁금하신 분은 아래의 링크를 참고해주세요.

 

https://fredhelp.stlouisfed.org/fred/about/about-fred/what-is-fred/

 

What is FRED? | Getting To Know FRED

What is FRED? Short for Federal Reserve Economic Data, FRED is an online database consisting of hundreds of thousands of economic data time series from scores of national, international, public, and private sources. FRED, created and maintained by the Rese

fredhelp.stlouisfed.org

 

 

FRED에서 얻을 수 있는 지표는 너무 다양하기에, 가장 흔히 사용하는 대표적인 지수만 다루어보겠습니다.

 

그 전에 필요한 라이브러리와 설정을 좀 하고 넘어가도록 하겠습니다. 참고로 데이터 분석 환경은 VSCODE와 쥬피터 노트북을 활용하였습니다.

 

# FinanceDataReader 불러오기
import FinanceDataReader as fdr

# matplotlib 불로오기 및 그래프 설정
import matplotlib.pyplot as plt

plt.rcParams["axes.grid"] = True
plt.rcParams["figure.figsize"] = (12,6)
plt.rcParams['axes.unicode_minus'] = False
plt.rcParams["axes.formatter.limits"] = -10000, 10000

 

 

 

1. 주간 실업수당 청구 건수 (ICSA)

 

해당 지표는 미국의 주간 실업수당 청구 건수를 보여줍니다. 

 

작년 코로나19 사태가 한창이던 3월 넷째 주(3월 22일~28일) 687만건으로 정점을 찍었던 적이 있으며, 참고로 코로나19 이전에는 매주 21만~22만건에 불과했다고 합니다.

 

# 2020년~현재의 나스닥지수(NASDAQCOM)와 주간 실업수당 청구 건수(ICSA) 추이

df = fdr.DataReader(['NASDAQCOM', 'ICSA'], start='2020', data_source='fred')
ax = df.plot(secondary_y='NASDAQCOM')

 

<실행 결과>

참고로 ICSA 지수는 경기가 나빠질 때는 경기 후행 지표의 성격을 띄지만, 경기가 좋아지는 경우에는 선행지표로 활용가능하다고 하네요.

 

여러분들의 생각은 어떠신가요? 주황색 그래프의 추이를 보고 파란색 그래프(나스닥 지수)가 상승할 것이란 걸 예측해볼 수 있으시겠나요?

 

어제 기준으로 실업수당 청구건수가 37만건인데 코로나 이전인 22만건 정도의 수준으로는 아직 도달하지 않았으니, 주가 상승여력이 좀 더 남았다는 의미로 해석할 수 있을까요??

 

 

2. M2 통화량

 

통화량이란 시중에 풀린 돈의 양을 의미합니다. 그중 M2 통화량이 우리의 삶에 영향을 끼치는 지표라고 생각하시면 됩니다.

 

다들아시겠지만 통화량이 많아진다는 것은 나라에서 돈을 많이 찍어낸다는 것을 의미하고, 희소하고 가치가 있는 자산들은 그대로이므로 자연스럽게 자산들의 가격이 상승하게 됩니다. 우리는 이를 인플레이션이라고도 부릅니다.

 

아래는 통화량의 개념에 대해 정리된 글이니 M2가 정확히 무엇을 의미하는지 궁금하신분들만 참고해주세요.

 

■ 통화량 개념  (출처. e-나라지표)

 

  ° 본원통화:  화폐발행액 + 금융기관의 對한은 원화예치금

  ° M1(협의통화)

    -   현금통화 + 요구불예금.수시입출식 저축성예금 - 동 금융상품의 예금취급기관 간 상호거래분

  ° M2(광의통화)

     -   M1 + 기간물 정기예금,적금 및 부금 + 시장형금융상품(CD,RP,표지어음) + 실적 배당형금융상품(금전신탁,수익증권 등) + 금융채 + 기타(투신증권저축, 종금사 발행어음) - 동 금융상품 중 장기(만기 2년이상) 상품 - 동 금융상품의 예금취급기관 간 상호거래분

 

 

# 1991~2021년, 나스닥지수(NASDAQCOM)와 M2통화량(M2) 

df = fdr.DataReader(['NASDAQCOM', 'M2'], start='1991', data_source='fred')
ax = df.plot(secondary_y='NASDAQCOM')

 

<실행 결과>

개인적으로 이 그래프를 보니, 돈만 가지고 있으면 왜 안되는지 확연히 알겠습니다.

 

91년부터 약 30년이 지난 21년까지 M2 통화량은 약 3300에서 19400까지 커졌습니다.

 

단위는 잘 모르겠지만 약 5.9배 통화량이 늘었으니, 30년 전에 비해 돈의 가치가 1/6토막 났다고 생각할 수 있겠죠?

 

중간중간 나스닥 지수가 급등락하는 기간이 있지만 장기적으로 보면 인플레이션에 무조건 올라타야겠다는 생각이 듭니다.

 

 

3. 하이일드 채권 스프래드

: 하이일드 채권 수익률 - 미국 국채 수익률

 

앞서 언급한 지표들 보다 조금 생소할 수도 있는 개념입니다.

 

하이일드(High-Yeild) 채권이란 높은 수익률, 즉 채권의 가격 대비 이자를 많이 받을 수 있는 채권을 말합니다.

 

미국같이 신용이 엄청나게 좋은 나라에서 발행하는 국채와 낮은 신용등급 회사에서 발행하는 회사채는 그 수익률이 차이나는 것은 당연하겠죠?

 

신용이 좋으면 돈을 떼일 리스크가 낮으니 이자를 낮게 받고, 신용이 낮으면 돈을 떼일 리스크가 높으니 이자를 높게 받고 돈을 빌려주는 개념입니다.

 

여기서 스프래드란 차이를 의미하며, 하이일드 채권 스프래드는 하이일드 채권 수익률에서 미국국채 수익률을 뺀 값을 의미합니다.

 

# 2008년 금융위기, 나스닥지수(NASDAQCOM)와 하이일드 채권 스프레드 

df = fdr.DataReader(['NASDAQCOM', 'BAMLH0A0HYM2'], start='2005', end='2011', data_source='fred')
ax = df.plot(secondary_y='NASDAQCOM')

# 회색으로 중요한 부분을 표시하는 코드 (참고)
ax = ax.axvspan('2007-12-01', '2009-03-30', color='gray', alpha=0.2)

 

<실행 결과>

 

하이일드 채권 스프레드가 상승하면 거시 경제 상황이 악화되고 있다는 신호로 볼 수 있다고 합니다.

 

일반적으로 경기 전망이 좋을 때는 하이일드 채권에 대한 수익률이 상대적으로 낮아져 하이일드 채권 스프레드가 낮아지며, 반대로 경기 전망이 좋지 않을 때는 부도 가능성이 높은 하이일드 채권을 보유하려는 수요가 급감하여 수익률은 상대적으로 높아지고 안전자산에 자금이 몰리면서 국채 금리가 낮아집니다. 그래서 이 시기에는 하이일드 채권 스프레드가 높아지는 것입니다.

 

그렇다면 코로나 위기 때는 어땠을까요? 예측할 수 있었을까요? (코드는 생략)

 

결과론적으로, 억지로 예측을 해보자면 하이일드 스프래드가 올라가는 상황에서 4~5%를 넘었을 때는 조금 조심할 필요가 있지 않나 생각됩니다. 이런 추론이 다음에 큰 위기기 다시 왔을 때 큰 손실을 막아줄 수 있기를 바래봅니다.

 

오늘 준비한 내용은 여기까지입니다.

 

오늘도 코딩유치원을 찾아주신 여러분께 감사드립니다.

 


<참고 자료>

 

깃허브 FinanceDataReader Tutorial - FRED 경기 선행 지표.ipynb

 

https://github.com/FinanceData/FinanceDataReader

 

GitHub - FinanceData/FinanceDataReader: Financial data reader

Financial data reader. Contribute to FinanceData/FinanceDataReader development by creating an account on GitHub.

github.com

 

옐로우의 블로그 - 하이일드 채권 스프레드

 

http://yellow.kr/blog/?p=4249 

 

하이일드 채권 스프레드 – 옐로우의 블로그

고위험, 고수익을 대표하는 하이일드 채권(High-Yield Bond)은 투자 등급 채권보다 신용 등급이 낮은 회사가 발행한 채권으로 원리금 상환에 대한 불이행 위험이 높지만 그만큼 이자율도 높다. 세계

yellow.kr

 

 

 

반응형
반응형

안녕하세요, 왕초보 코린이를 위한 코딩유치원에 오신 것을 환영합니다.

코딩유치원에서는 파이썬 기초부터 사무자동화, 웹크롤링, 데이터 분석 등의 다양한 패키지까지 초보자도 알기 쉽도록 내용을 정리해 놓았습니다.

업무는 물론 투자에도 도움이 될만한 전자공시시스템(DART) 텔레그램(Telegram) 관련 패키지도 배울 수 있으니 많은 관심 부탁드립니다.

 

 

<FinanceDataReader 패키지 시리즈>

 

2021.08.10 - [파이썬 패키지/데이터분석] - [Python/FinanceDataReader] 1편. 파이썬으로 국내/해외 상장주식 가격데이터 가져오기 (ft. 환율, 코인가격도 가능)

 

 

이번 시간에는 지난 시간에 배운 FinanceDataReader와 데이터 시각화 라이브러리인 Bokeh를 이용해서 여러분들이 늘 보시는 캔들차트를 그려보는 시간을 가져보겠습니다.

 

또 한 번 느끼는 거지만 파이썬에는 너무나 다양한 라이브러리가 존재하네요.

 


 

Bokeh 라이브러리

 

Bokeh는 최신 웹 브라우저를 위한 대화형 시각화를 만들기 위한 Python 라이브러리입니다. 단순한 플롯에서 스트리밍 데이터 세트가 있는 복잡한 대시보드에 이르기까지 아름다운 그래픽을 구축하는 데 도움이 됩니다. Bokeh를 사용하면 JavaScript를 직접 작성하지 않고도 JavaScript 기반 시각화를 만들 수 있습니다.

 

https://docs.bokeh.org/en/latest/#

 

Bokeh documentation

Bokeh is a Python library for creating interactive visualizations for modern web browsers. It helps you build beautiful graphics, ranging from simple plots to complex dashboards with streaming data...

docs.bokeh.org

 

해당 라이브러리는 다음 기회에 더 깊게 배우기로 하고, FinanceDataReader로 캔들차트를 그릴 때 사용한다는 것만 알고 넘어가도록 하겠습니다.

 

Bokeh를 사용하려면 먼저 아래의 코드로 라이브러리를 설치해주어야합니다.

 

설치 방법은 아시다시피 파이썬 터미널 창이나 주피터 노트북의 코드 입력창에 아래의 코드를 넣고 실행해주시면 됩니다.

(저는 왠지 모르지만 이미 설치가 되어있다고 하네요. 어쩌면 아나콘다 패키지에 포함되어 있을 수도 있겠네요.)

 

pip install bokeh

 

 

캔들 차트 그리기

 

아까부터 언급드렸던 캔들 차트란 한글로 봉차트라고도 부르며, 일정기간 동안의 주가 움직임이 표현된 막대 모양의 봉들(양봉, 음봉)로 이루어진 주식 차트를 말합니다. 

 

파이썬을 이용하면 코드 몇 줄로 아래와 같은 차트를 우리가 직접 그릴 수가 있다니, 대단하지 않나요?

 

 

코드는 아래와 같이 단 세 줄이면 됩니다.

 

만약 FinanceDataReader 라이브러리가 설치 되지 않았으면 코드 실행 시 오류가 날 수 있습니다.

 

그럴 땐 지난 강의를 참고해주세요.

 

# FinanceDataReader 라이브러리 불러오기 (Bokeh는 따로 안불러와도 됨)
import FinanceDataReader as fdr

# 삼성전자 주가 데이터 가져오기 (2020년 1월 1일부터 현재까지)
df_samsung = fdr.DataReader('005930', '2020-01-01')

# 가져온 데이터로 캔들차트 그리기
fdr.chart.plot(df_samsung)

 

<실행 결과>

 

해당 코드를 실행하시면 우측 상단에 몇 개의 버튼이 있습니다. 좌측부터 차례대로 기능을 알려드리면 다음과 같습니다.

 

1) 이동: 좌클릭으로 차트 상하좌우로 이동 가능

2) 돋보기: 좌클릭으로 특정 영역을 드래그하면 해당 영역 확대

3) 돋보기+휠: 휠 버튼으로 확대 축소 가능

4) 저장: 현재 보이는 차트를 png 파일로 저장

5) 새로고침: 코드를 처음 실행했을 때의 상태로 돌아감

 

 

캔들 차트 그리기 옵션

 

마치 matpoltlib 라이브러리처럼 bokeh를 이용한 캔들차트도 다양한 옵션(파라미터) 설정이 가능합니다.

 

파라미터 설명 설정값 기본값
width 차트의 너비 정수 800
height 차트의 높이 정수 480
volume_height 거래량 막대 높이 실수 (height 기준 %) 0.3 (30%)
recent_high 이전 고점 표시 여부 True/False False
volume 거래량 막대 표시 여부 True/False True
title 그래프 제목 문자열 ('원하는 제목') '' (없음)
ylabel y축 레이블 지정 문자열 ('원하는 레이블') '' (없음)
moving_average_type 이동평균 타입 * 'SMA'(Simple Moving Average, 단순 이동평균)
* 'WMA'(Weighted Moving Average, 가중 이동평균)
* 'EMA'(Exponential Moving Average, 지수 이동평균)
* 'None'(표시하지 않음)
'SMA'
moving_average_lines 이동평균선 세부설정 튜플 (이동평균선의 데이터 개수, 캔들 개수)
ex) (5, 20, 60)은 5일, 20일, 60일을 의미
(5, 20, 60)
color_up 상승 캔들 색상 문자열 ('색상') / 기본값(설정하지 않는 것) 추천 'red'
color_down 하락 캔들 색상 문자열 ('색상') / 기본값(설정하지 않는 것) 추천 'blue'
color_volume_up 전일거래량 대비 상승 막대의 색상 문자열 ('색상') / 기본값(설정하지 않는 것) 추천 'red'
color_volume_down 전일거래량 대비 하락 막대의 색상 문자열 ('색상') / 기본값(설정하지 않는 것) 추천 'blue'

 

설정 가능한 파라미터들을 알아보았으니 실제로 어떻게 사용하는지 예시를 보여드리겠습니다.

 

fdr.chart.plot(df_samsung, title='삼성전자 주가', ylabel='단위:KRW', width=1000, height=600)

 

코드의 결과를 보시면 좌측상단에 '삼성전자 주가'라는 제목이 추가되었고, 좌측에 '단위:KRW'라는 레이블이 적용된 것을 확인 할 수 있습니다. 너비와 높이도 설정하여 기본값보다 그래프의 크기를 키워보았습니다.

 

 

 

차트 설정 기본값 변경

 

config 함수를 이용하면 기본설정을 변경하면, 번번이 파라미터들을 추가 설정하지 않아도 됩니다.

 

# config 변수에 원하는 파라미터 설정을 dict(딕셔너리) 형태로 저장
config = {'width': 1000, 
          'height': 600,
}

# config 함수를 이용해서 설정을 한 번에 적용
fdr.chart.config(config=config)

# 그래프 그리기
fdr.chart.plot(df_samsung)

 

결과는 생략하겠습니다.

 

만약 옵션을 가장 처음에 셋팅되어 있던 기본값으로 되돌리고 싶을 때는 아래와 같이 해주시면 됩니다.

 

fdr.chart.config(reset=True)

 

오늘 준비한 내용은 여기까지입니다.

 

오늘도 코딩유치원을 찾아주신 모든분들께 감사드립니다.

 


<참고 자료>

 

깃허브 FinanceDataReader Tutorial -차트 그리기와 활용하기

 

https://github.com/FinanceData/FinanceDataReader

 

GitHub - FinanceData/FinanceDataReader: Financial data reader

Financial data reader. Contribute to FinanceData/FinanceDataReader development by creating an account on GitHub.

github.com

 

반응형
반응형

안녕하세요, 왕초보 코린이를 위한 코딩유치원에 오신 것을 환영합니다.

코딩유치원에서는 파이썬 기초부터 사무자동화, 웹크롤링, 데이터 분석 등의 다양한 패키지까지 초보자도 알기 쉽도록 내용을 정리해 놓았습니다.

업무는 물론 투자에도 도움이 될만한 전자공시시스템(DART) 텔레그램(Telegram) 관련 패키지도 배울 수 있으니 많은 관심 부탁드립니다.

 

 

 

이번 시간에는 공시 정보를 다루는 DART-FSS 라이브러리에 이어서 상장된 주식의 가격 정보를 다루는 라이브러리인 FinanceDataReader라는 패키지에 대해 소개해드리겠습니다.

 

두 패키지를 잘 조합하면 정말 유용한 정보를 얻을 수 있을 것 같은 느낌이 듭니다.

 


 

FinanceDataReader란?

 

한국 주식 가격, 미국주식 가격, 지수, 환율, 암호화폐 가격, 종목 리스팅 등 금융 데이터 수집 라이브러리

 

<공식 문서 링크>

 

https://financedata.github.io/posts/finance-data-reader-users-guide.html

 

FinanceDataReader 사용자 안내서

FinanceDataReader 사용자 안내서

financedata.github.io

 

해당 패키지는 한국의 어느 천재분께서 pandas-datareader라는 시계열 데이터 수집 라이브러리의 몇가지 단점을 보완하는 목적으로 만드신 라이브러리입니다.

 

공식 문서에 따르면 해당 라이브러리를 통해 얻을 수 있는 주요한 데이터는 아래와 같습니다.

 

종목 코드

  • 거래소별 전체 종목코드: KRX (KOSPI, KODAQ, KONEX), NASDAQ, NYSE, AMEX, S&P 500

가격 데이터

  • 해외주식 가격 데이터: AAPL(애플), AMZN(아마존), GOOG(구글) 등
  • 국내주식 가격 데이터: 005930(삼성전자), 091990(셀트리온헬스케어) 등
  • 각종 지수: KS11(코스피지수), KQ11(코스닥지수), DJI(다우지수), IXIC(나스닥 지수), US500(S&P 5000)
  • 환율 데이터: USD/KRX (원달러 환율), USD/EUR(달러당 유로화 환율), CNY/KRW: 위엔화 원화 환율
  • 암호화폐 가격: BTC/USD (비트코인 달러 가격, Bitfinex), BTC/KRW (비트코인 원화 가격, 빗썸)

 

라이브러리 설치하기

 

설치 방법은 파이썬 터미널 창이나 주피터 노트북의 코드 입력창에 아래의 코드를 넣고 실행해주시면 됩니다.

 

pip install -U finance-datareader

 

 

라이브러리 불러오기

 

불러오는 방법은 아래와 같습니다.

 

import FinanceDataReader as fdr

 

참고로 아래의 코드는 FinanceDataReader라는 라이브러리를 불러오는데 fdr이란 이름으로 줄여서 부르겠다는 뜻입니다.

 

 

 

튜토리얼

 

StockListing( ) 함수  :  종목 정보

 

StockListing 함수는 종목들의 여러 정보를 판다스의 데이터 프레임 형태로 가져올 수 있는 함수입니다.

 

예시 코드는 아래와 같습니다.

 

# 한국거래소 상장종목 전체
df_krx = fdr.StockListing('KRX')
df_krx.head()

 

<실행 결과>

 

 

'KRX' 대신 들어갈 수 있는 옵션들을 살펴보겠습니다.

 

분류 옵션 설명
한국 시장 'KRX', 'KOSPI', 'KOSDAQ', 'KONEX' KRX는 한국거래소 상장 종목 전체를 의미
(KOSPI, KOSDAQ, KONEX, 기타 ETF를 모두 포함)
미국 시장 'S&P500', 'NASDAQ', 'NYSE', 'AMEX',
'SSE', 'SZSE', 'HKEX', 'TSE', 'HOSE'
미국 시장들의 정보
시가총액 'KRX-MARCAP' KRX에 상장된 종목들의 종목코드, 시가총액, 총주식수 등의 정보
상장폐지 'KRX-DELISTING' 상장폐지에 관한 정보
감사의견 'KRX-ADMINISTRATIVE' KRX 상장사 중, 감사의견을 받은 회사의 종목코드, 날짜, 이유
한국 ETF 'ETF/KR' KRX에 상장된 ETF의 종목코드와 이름

 

저는 개인적으로 시가총액 정보를 받아올 수 있는 'KRX-MARCAP'이 쓸모가 있어보이네요. 다음에 이 데이터와 재무제표 정보를 사용해서 데이터 분석을 해볼 예정입니다.

 

 

 

DataReader( ) 함수 :  개별 종목 가격 or 지수

 

해당 함수는 개별 종목, 혹은 지수의 가격을 시계열 데이터로 가져올 수 있는 함수입니다.

 

참고로 환율과 암호화폐(코인) 정보까지 가져올 수 있으니 활용도가 무궁무진 할 것 같네요!

 

함수 사용 설명

 

빠른 이해를 돕기 위해 네이버 주식의 가격을 불러오는 것을 예제로 다루어보겠습니다.

 

# 2021년~현재까지의 네이버 주가를 데이터 프레임으로 불러오기
df_naver = fdr.DataReader('035420', '2021')

# 가장 마지막(최신)의 10일치 주가 출력
df_naver.tail(10)

 

<실행 결과>

 

이 결과가 실제 데이터와 맞는지 확인해볼까요? 네이버에서 네이버 주가를 검색해보았습니다.

 

오늘이 8월 10일이니깐 종가(Close)가 446,500원으로 똑 같은 것을 확인 할 수 있습니다. 전일 가격도 447,500원이니깐 데이터가 실제와 동일하네요.

 

 

이런식으로 개별 종목을 조회할 수도 있고, 아래와 같이 지수를 확인할 수도 있답니다. 

 

# KOSPI200, 2015년~현재
df_kospi200 = fdr.DataReader('KS200', '2015')

# 가장 마지막(최신)의 10일치 지수 출력
df_naver.tail(10)

 

조회 가능한 지수들은 아래와 같으니 필요하신 것으로 바꾸어서 사용하시면 됩니다.


 

오늘 준비한 내용은 여기까지입니다.

 

참고로 해당 데이터를 이용해서 시각화(그래프)도 가능하며, 이에 대한 내용은 다음에 포스팅 해보도록 하겠습니다.

 

오늘도 코딩유치원을 찾아 주신 여러분들께 감사드립니다.

 

 

 

반응형
반응형

안녕하세요, 왕초보 코린이를 위한 코딩유치원에 오신 것을 환영합니다.

 

 

<DART-FSS 관련 지난 글>

 

2021.06.10 - [파이썬 패키지/전자공시시스템(DART)] - [Python/Dart] 파이썬으로 공시 정보 가져오기 1편_ DART API와 DART-FSS 패키지 소개

2021.06.22 - [파이썬 패키지/전자공시시스템(DART)] - [Python/Dart] 파이썬으로 공시 정보 가져오기 2편_ 상장된 회사 재무제표 EXCEL로 저장하기

2021.06.25 - [파이썬 패키지/전자공시시스템(DART)] - [Python/Dart] 파이썬으로 공시 정보 가져오기 3편_특정회사 혹은 특정 공시유형 가져오기

2021.06.27 - [파이썬 패키지/전자공시시스템(DART)] - [Python/Dart] 파이썬으로 공시 정보 가져오기 4편_재무제표 4종 골라서 DataFrame으로 추출하기(ft. 재무상태표, 손익계산서, 포괄손익계산서, 현금흐름표)

2021.06.27 - [파이썬 패키지/전자공시시스템(DART)] - [Python/Dart] 파이썬으로 공시 정보 가져오기 5편_dart-fss 재무제표 다운로드 안될 때 해결법


이번 시간에 배울 내용은 XBRL을 추출하는 방법입니다.

 

그런데 도대체 XBRL이 뭘까요? 궁금해서 찾아봤습니다.

 

XBRL이란?

 

XBRL(eXtensible Business Reporting Language)은 기업의 비즈니스 리포트에서 복잡한 기업 정보가 보다 더 효율적으로 생성, 교환, 비교될 수 있도록 하기 위하여 XML(eXtensible Markup Language)을 비즈니스 리포팅 영역에 응용한 표준입니다. 주로 재무제표와 같은 재무 정보를 정의하고 교환하는 일에 사용한다고 합니다.

 

자세한 내용은 아래의 글을 참고해주세요.

 

https://www.2e.co.kr/news/articleView.html?idxno=210265

 

기업 보고 데이터 표준, XBRL 소개 - 투이컨설팅

XBRL은 기업보고 데이터의 공급망을 바꾼다XBRL(eXtensibe Business Reporting Language)은 XML을 기반으로 복잡한 기업정보를 생성, 교환, 비교할 수 있도록 만들어진 국제 표준이다. 기업의 재무보고서를 데

www.2e.co.kr

 

 

 

그럼 지금부터 dart-fss 패키지에서 어떻게 XBRL 파일을 추출하고 사용할 수 있는지 알아보겠습니다.

 

XBRL 데이터 추출

 

XBRL 파일을 추출하는 방법은 아주 간단합니다. 복잡한 설명보다 코드로 설명드리겠습니다.

 

# 삼성전자 code
corp_code = '00126380'

reports = dart.filings.search(corp_code=corp_code, bgn_de='20210101', pblntf_detail_ty='a001')

# 가장 최신 보고서 선택
report = reports[0]

# report에서 xbrl 파일 추출
xbrl = report.xbrl

 

2021.06.25 - [파이썬 패키지/전자공시시스템(DART)] - [Python/Dart] 파이썬으로 공시 정보 가져오기 3편_특정회사 혹은 특정 공시유형 가져오기

 

지난 글에서 아직 report에 들어가있는 데이터를 어떻게 사용할지 모르겠다고 했던 것 기억하시나요?

 

report 출력 결과

 

바로 그 report에 .xbrl만 붙여주면 report의 데이터를 종류별로 꺼내어 쓸 수 있습니다. (모두 다는 아니고 특정 데이터들만 가능합니다)

 

어떻게 꺼내어 쓰는지는 아래에서 설명드리겠습니다.

 

 

XBRL 데이터 분석

 

방금 전 추출한 xbrl 안에는 수 많은 데이터들이 분류되어 있습니다. 각각의 데이터들을 아래의 함수들로 가져올 수가 있답니다.

 

메소드 기능 매개변수 반환 자료형
exist_consolidated( ) 연결 재무제표 존재 여부 확인 - True/False
get_cash_flows( ) 현금흐름표 separate = True or False
(True: 개별, False: 연결)

미입력 시, False가 기본값
list of Table

(여기서 Table은 DataFrame과 같은 말)
get_changes_in_equity( ) 자본변동표
get_financial_statement( ) 재무상태표
get_income_statement( ) 포괄손익계산서
get_audit_information( ) 감사 정보 lang = 'ko' or 'en'

미입력 시, 'ko'가 기본값
DataFrame
get_author_information( ) 작성자 정보
get_document_information( ) 공시 문서 정보
get_entity_address_information( ) 주소 정보
get_entity_information( ) 공시 대상 정보
get_financial_statement_information( ) 재무제표 정보
get_period_information( ) 공시 문서 기간 정보
get_table_by_code( ) Table 코드와 일치하는 Table 반환 code = 'Table 코드번호'

꼭 입력해주어야 함
Table
or None

 

<예시 코드>

 

연결재무제표 존재 여부 확인 (True / False)

xbrl.exist_consolidated()

>>> True

 

연결 현금흐름표 추출

# 연결 현금흐름표 추출 (리스트 반환)
list_cf = xbrl.get_cash_flows()

# 연결 현금프름표 출력
cf = list_cf[0]


>>> {'code': 'D520000', 'definition': '[D520000] Statement of cash flows, indirect method - Consolidated financial statements'}

해당 내용을 Pandas 패키지의 DataFrame 형태로 나타내는 방법은 아래에서 이어서 설명드리겠습니다.

 

공시 작성자 정보 출력

# 공시 작성자 정보
xbrl.get_author_information( )

 

 

재무제표 4종 DataFrame으로 가져오기

 

사실 재무제표를 가져오는 방법은 지난 글에서도 소개드린 적이 있습니다. 개인적으로 생각하기에 재무제표를 가져오는 것이 목적이라면 아래의 글에서 소개드린 방법을 추천드리지만, 그래도 이런 방법이 있다는 정도만 설명드리고 넘어가도록 하겠습니다.

 

2021.06.27 - [파이썬 패키지/전자공시시스템(DART)] - [Python/Dart] 파이썬으로 공시 정보 가져오기 4편_재무제표 4종 골라서 DataFrame으로 추출하기(ft. 재무상태표, 손익계산서, 포괄손익계산서, 현금흐름표)

 

(*여기까지 공부하고 보니 지난 시간에 배웠던 dart.fs.extract( ) 함수가 xbrl 문서를 다운로드 받는 것이었다는 것을 알 수 있었습니다.)

 

 

연결 현금흐름표 DataFrame 추출

# 연결 현금흐름표 추출 (리스트 반환)
list_cf = xbrl.get_cash_flows()

# 연결 현금흐름표 출력
cf = list_cf[0]

# 연결 현금흐름표 DataFrame 형태로 출력
cf.to_DataFrame()

 

출력 결과는 너무 길어서 5개만 잘라서 캡쳐했으니 직접 확인해보시면 좋을 것 같아요.

 

오늘 배운 내용은 아래의 참고자료를 참고하였으며, 필요하다고 생각되는 내용만 다루었습니다.

 

더 자세한 내용이 필요하신 분은 아래의 링크를 참고해주세요.

 

오늘을 마지막으로 dart-fss 사용법에 대한 내용은 모두 다루어보았습니다. 하지만 dart-fss라는 패키지를 공부해보니 함수는 다르나 중복되는 결과들이 많아서 총정리를 할 필요성을 느낍니다.

 

다음에는 지금까지 배운 dart-fss 패키지에서 목적별로 어떤 함수를 사용하는 것이 좋을지 정리하는 시간을 가지도록 하겠습니다.


https://dart-fss.readthedocs.io/en/latest/dart_xbrl.html#dart_fss.xbrl.dart_xbrl.DartXbrl.exist_consolidated

 

XBRL 데이터 추출 — dart-fss documentation v0.3.10 documentation

© Copyright 2021, Sungwoo Jo Revision 2a7bb3e6.

dart-fss.readthedocs.io

 

반응형
반응형

안녕하세요, 왕초보 코린이를 위한 코딩유치원에 오신 것을 환영합니다.

 

 

최근 제무재표를 가져오는 아래의 코드를 다른 컴퓨터에서 실행하려다가 알 수 없는 에러가 출력되어 애를 먹었습니다. 오늘은 이 에러를 해결한 방법에 대해서 공유해보려합니다.

 

# CASE 1

# DART 에 공시된 회사 리스트 불러오기
corp_list = dart.get_corp_list()

# 삼성전자 검색
samsung = corp_list.find_by_corp_name('삼성전자', exactly=True)[0]

# 2012년부터 연간 연결재무제표 불러오기
fs1 = samsung.extract_fs(bgn_de='20210101')



# CASE 2

fs2 = dart.fs.extract(corp_code='00126380', bgn_de='20210101')

 

출력된 에러

 

AttributeError: ("type object 'object' has no attribute 'dtype'", "An error occurred while fetching or analyzing"...

에러 출력 이미지

 

에러 원인

 

구글링을 통해 알아낸 원인은 Pandas와 Numpy 패키지의 버전이 구버전이기 때문이었습니다. (관련 자료는 글 마지막에 첨부해놓음)

 

에러는 두 패키지를 업그레이드 함으로써 해결되었습니다.

 

 

에러 해결 방법

 

터미널 창에서 아래와 같이 pip 명령어를 이용해 pandas와 numpy 패키지를 삭제 및 재설치 하면 됩니다.

 

1. pandas 버전 업그레이드

 

* (수정) 아래의 코드 한줄만 넣으면 됨

pip install pandas --upgrade

 

1) pandas 설치 삭제(pip uninstall pandas)

2) pandas 설치 (pip install pandas)

 

2. numpy 버전 업그레이드

 

* (수정) 아래의 코드 한줄만 넣으면 됨

pip install numpy --upgrade

 

1) numpy 설치 삭제(pip uninstall numpy)

 

2) numpy 설치 (pip install numpy)

 

 

(주의) Pandas와 Numpy를 모두 업그레이드 했다면, 쥬피터 노트북을 완전히 종료했다가 켜주셔야지 정상 작동합니다!

 

 

 

 


<참고자료>

 

https://github.com/pandas-dev/pandas/issues/39520

 

BUG: AttributeError: type object 'object' has no attribute 'dtype' with numpy 1.20.x and pandas versions 1.0.4 and earlier · Is

root@548977c7dc-62l72:/app# pip list | grep pandas pandas 1.0.3 In ipython ,i try initializing df ` In [1]: import pandas as pd In [2]: pd.DataFrame([],columns=['a','b','c']...

github.com

 

반응형
반응형

안녕하세요, 왕초보 코린이를 위한 코딩유치원에 오신 것을 환영합니다.

 

 

<DART-FSS 관련 지난 글>

 

2021.06.10 - [파이썬 패키지/전자공시시스템(DART)] - [Python/Dart] 파이썬으로 공시 정보 가져오기 1편_ DART API와 DART-FSS 패키지 소개

2021.06.22 - [파이썬 패키지/전자공시시스템(DART)] - [Python/Dart] 파이썬으로 공시 정보 가져오기 2편_ 상장된 회사 재무제표 EXCEL로 저장하기

2021.06.25 - [파이썬 패키지/전자공시시스템(DART)] - [Python/Dart] 파이썬으로 공시 정보 가져오기 3편_특정회사 혹은 특정 공시유형 가져오기


이번 시간에 배울 함수는 재무제표만을 추출해주는 함수입니다.

 

지금까지 배운 것이 워낙 비슷비슷한 느낌이라서 정리하면 다음과 같습니다.

 

2편: 상장 회사 전체 리스트 받고, 거기서 종목을 골라서 저장 후, 재무제표 혹은 공시정보를 꺼내어 쓰는 방법 (통합 버전)

3편: 공시정보에 특화된 방법(전체 or 특정 종목)

4편(이번 시간 배울 것): 재무제표에 특화된 방법 (특정 종목 재무제표 추출)

         --> 2편의 종목.extract_fs( )와 표현만 다르고 완전 같다고 보면 됨

 


그럼 지금부터 재무제표를 추출하는 방법에 대해서 알아보겠습니다.

 

특정회사 재무제표 일괄 추출

(함수) dart_fss.fs.extract( )

 

<매개변수>

옵션 기능 기본 값 자료형
corp_code 공시대상회사의 고유번호(8자리) 필수 입력 str
bgn_de 검색시작 접수일자('YYYYMMDD') 필수 입력 str
end_de 검색종료 접수일자('YYYYMMDD') 오늘 날짜 str
fs_tp 재무제표 종류 선택
(‘bs’:  재무상태표, ‘is’ : 손익계산서, ‘cis’ : 포괄손익계산서, ‘cf’ : 현금흐름표)
('bs', 'is', 'cis', 'cf) tuple,
str
separate 개별재무제표 여부 (True : 개별 재무제표 / False : 연결 재무제표) False str
report_tp 연간, 반기, 분기 보고서 선택 (중복 선택 가능)

사용 예시)
(str) ‘annual’ : 연간, ‘half’ : 연간 + 반기, ‘quarter’ : 연간 + 반기 + 분기
(list) [‘annual’] : 연간, [‘half’]: 반기, [‘quarter’] 분기, [‘annual’, ‘half’]: 연간+반기
None str,
list
lang 언어 선택 ('ko' : 한글, 'en' : 영어) 'ko' str
separator 숫자 1000 단위 구분자 표시 여부 (True / False) True str
dataset 'xbrl' : xbrl 파일 우선 데이터 추출
'web' : web page 우선 데이터 추출
'xbrl' str

 

<예시 코드_삼성전자 2020년 사업보고서(연간) 가져오기>

 

import dart_fss as dart

# Open DART API KEY 설정
api_key='xxxxxxxxxxxxxxxxxxxxxxxxxxxx'
dart.set_api_key(api_key=api_key)

# 삼성전자 기업코드로 2021년 1월 1일부터 현재날짜 사이에 나온 사업보고서 가져오기
corp_code_samsung = '00126380'
fs = dart.fs.extract(corp_code=corp_code_samsung, bgn_de='20210101')

 

<코드 실행 결과>

 

위의 코드를 실행하셨다면 위와 같이 재무제표 하나가 Dart API를 통해 다운로드 받아집니다. 변수 fs에 어떤 값이 저장되어 있는지 아래에서 확인해봅시다.

 

기본적으로 위에서 봤던 여러 파라미터들의 값이 저장되어 있고, 가장 핵심 정보인 financial statement에는 재무상태표, 손익계산서, 포괄손익계산서, 현금흐름표가 순서대로 들어가 있는 것을 보실 수 있습니다.

 

이제 이 결과를 3가지 메소드(클래스 안에 정의된 함수)로 활용한는 법에 대해서 알아보겠습니다.

 

 

재무제표 일괄 추출 결과

(클래스) dart_fss.fs.FinancialStatement( )

 

위에서 재무제표를 추출하셨다면 그 추출의 결과물(fs)를 활용하셔야겠죠? 이를 위해 아래의 3가지 메소드를 사용할텐데 하나씩 알아보겠습니다.

 

메소드 기능
save( ) 재무제표 정보를 모두 엑셀파일로 일괄저장
show( ) 재무제표 정보를 표시해주는 Method
to_dict( ) FinancialStatement의 요약 정보를 Dictionary 로 반환

 

to_dict( )

 

가장 먼저 위에서 예시 코드로 확인한 결과를 Dictionary로 반환해주는 메소드인 to_dict( ) 입니다. 아직은 어디에 사용할지 모르겠네요.

그냥 이런 것이 있다는 정도만 알아두시면 좋겠습니다. (아까 예제코드의 fs 출력 결과와 같죠?)

 

 

show( )

 

아마 가장 많이 사용할 것으로 생각하는 show( ) 메소드입니다. 방금 전 얻은 재무제표(재무상태표, 손익계산서, 포괄손익계산서, 현금흐름표)를 원하는대로 표 형태로 가져 올 수 있습니다. 이 표는 Pandas 패키지의 데이터프레임(DataFrame) 형식으로 Pandas로 데이터 분석이 가능 합니다.

 

옵션 기능 기본 값 자료형
tp 재무제표 종류 선택
(‘bs’:  재무상태표, ‘is’ : 손익계산서, ‘cis’ : 포괄손익계산서, ‘cf’ : 현금흐름표)
필수 입력 str
show_class class 표시 여부 (True/False) True bool
show_depth 표시할 class 열 갯수 10 int
show_concept concept_id 표시 여부 (True/False) True bool

 

여기서 tp는 무엇인지 감이 오실 것이고, 나머지 3개가 무엇인지 감이 안오실거예요. 한번 show( ) 메소드를 이용해서 값을 보면서 하나씩 설명 드려보겠습니다.

 

<코드>

# 재무제표에서 제무상태표만 출력하는 코드
# ‘bs’:  재무상태표, ‘is’ : 손익계산서, ‘cis’ : 포괄손익계산서, ‘cf’ : 현금흐름표
df = fs.show('bs')
df

 

<실행 결과>

 

show( ) 메소드를 이용해 제무상태표를 출력해보았습니다. 가장 왼쪽에 concept_id라는 열 이름을 보이시나요?

자산항목을 구분하는 id인데 아직은 어디 사용할 수 있을지 모르겠네요. 저는 한국인이니 label_ko를 이용해 자산항목을 구분할 예정입니다. concept_id를 표에서 보시기 싫으시면 show_concept = False로 설정해주시면 됩니다.

 

그리고 class0부터 class4로 분류를 해둔 것 보이시나요? 위에서 4가지 메소드 중 show_class( )와 show_depth( )와 관련있는 부분입니다. 위의 concept_id와 같이 class를 없애고 싶으면 show_class = False로 설정해주시고, 만약 class를 2번까지만 출력하고 싶다고 하면 show_depth = 2로 설정해주시며 되겠습니다.

 

 

save( )

 

첫 시간에도 다루어 보았던 save( ) 메소드입니다. Dart API에서 받은 fs를 엑셀로 저장하는 기능을 합니다.

 

# 재무제표 일괄저장

# 기본 저장경로: 현재경로/fsdata
# 기본 저장 파일명: corp_code_report_tp.xlsx

fs.save()

 

원하는 경로에 원하는 파일명으로 저장하시고 싶으면 아래와 같이 하시면 됩니다.

 

filename = '삼성전자_제무재표'
path = '/User/xxxxx/Desktop/'
fs.save(filename=filename, path=path)

 


 

지금까지 배운 지식을 이용해서 전체 상장기업의 재무제표를 다운받고 싶으면 아래와 같은 과정을 코드로 구현하면 될 것 같네요.

 

1) 전체 상장 기업 리스트 받기

 

2) for문을 이용해 corp_list에서 종목 코드만 추출

 

3) dart.fs.extract(corp_code='여기 for문으로 종목 코드 바꿔가며 입력', bgn_de='20210101')으로 제무재표 정보 변수에 담기

 

4) 변수에 담은 재무제표 정보를 save( )로 엑셀로 저장하거나, show( )로 데이터 프레임으로 가져와서 필요한 데이터만 추출

 

이 부분은 추후에 좀 더 자세히 다루어 보도록 하겠습니다.

 

실적 시즌에 이런 방식으로 기업을 스크리닝해본다면 투자에 정말 큰 무기가 될 것 같거든요!


<참고 자료>

 

DART-FSS 공식 문서 (*조금씩 틀린 부분이 있으니 주의할 것)

 

https://dart-fss.readthedocs.io/en/latest/dart_fs.html

 

재무제표 일괄 추출 — dart-fss documentation v0.3.10 documentation

[‘annual’, ‘quarter’]: 연간 + 분기, [‘half’, ‘quarter’]: 반기 + 분기, [‘annual’, ‘half’, ‘quarter’]: 연간 + 반기 + 분기

dart-fss.readthedocs.io

 

반응형
반응형

안녕하세요, 왕초보 코린이를 위한 코딩유치원에 오신 것을 환영합니다.

 

 

<DART-FSS 관련 지난 글>

 

2021.06.10 - [파이썬 패키지/전자공시시스템(DART)] - [Python / Dart] 파이썬으로 재무제표 정보 가져오기 1편_ DART API와 DART-FSS 패키지 소개

2021.06.22 - [파이썬 패키지/전자공시시스템(DART)] - [Python / Dart] 파이썬으로 재무제표 정보 가져오기 2편_ 상장된 모든 회사 재무제표 EXCEL로 저장하기

 


지난 시간에 배운 내용이 기업을 선택한 후, 해당 기업의 재무제표를 가져오거나 공시보고서를 검색하는 것이었다면, 이번 시간에 배울 함수는 특정 기간의 특정 공시 유형의 보고서들을 가져올 수 있습니다. 지금부터 어떤 매개변수들을 설정해줄 수 있는지 알아보겠습니다.

 

공시보고서 검색

(함수) dart_fss.filings.search( )

 

<매개변수>

옵션 기능 기본 값 자료형
corp_code 공시대상회사의 고유번호(8자리) 미입력 시, 모든 회사 검색
검색기간은 3개월로 제한
str
bgn_de 검색시작 접수일자(YYYYMMDD) 종료일(end_de) str
end_de 검색종료 접수일자(YYYYMMDD) 오늘 날짜 str
last_reprt_at 최종보고서만 검색여부(Y or N) N str
pblntf_ty 공시유형 및 공시상세유형 참고 None str
pblntf_detail_ty 공시유형 및 공시상세유형 참고 None str
corp_cls 법인구분 : Y(유가), K(코스닥), N(코넥스), E(기타) 전체 조회 str
sort 정렬, {접수일자: date, 회사명: crp, 고서명: rpt} ?? str
sort_mth 오름차순(asc), 내림차순(desc) 내림차순('desc') str
page_no 페이지 번호(1~n) 1 int
page_count 페이지당 건수(1~100) 10 int

 

<예시 코드>

import dart_fss as dart

# 오늘 나온 공시 검색
reports = dart.filings.search()

# 2021년 1월 1일부터 2021년 3월 31일까지 검색 (페이지당 표시 건수: 100)
reports = dart.filings.search(bgn_de='20190101', end_de='20190331', page_count=100)

# 2019년 5월 1일부터 2019년 7월 1일까지 연간보고서만 검색
reports = dart.filings.search(bgn_de='20190501', end_de='20190701', pblntf_detail_ty='a001')

# 2019년 5월 1일부터 2019년 7월 1일까지 연간보고서 및 반기보고서 검색
reports = dart.filings.search(bgn_de='20190501', end_de='20190701', pblntf_detail_ty=['a001', 'a002'])

 

 

공시보고서 검색 결과

(클래스) dart_fss.filings.search.SearchResults

 

위에서 dart_fss.filings.search( )로 얻은 결과, 즉 reports라는 변수 안에는 어떤 것이 들어있을까요?

 

아래와 같이 크게 5가지 요소를 가집니다.

요소 기능
page_no 표시된 페이지 번호
page_count 페이지당 표시할 리포트수
total_count 총 건수
total_page 총 페이지수
report_list 검색된 리포트 리스트

 

주피터 노트북으로 검색결과를 출력해보았습니다.

 

import dart_fss as dart

# 2021년 1월 1일부터 2021년 3월 31일까지 검색
reports = dart.filings.search(bgn_de='20210101', end_de='20210331')

reports

 

<출력 결과>

 

잘 보시면 page_no는 1, page_count는 10, total_count는 68908, total_page는 6891인 것을 확인 하실 수 있습니다.

 

이게 무슨의미인지 잠시 알아보겠습니다.

 

먼저 page_count의 10은 기본값입니다. 우리가 저기 위에서 함수를 사용할 때, 따로 인자를 넣어주지 않았기에 10이라는 기본 값이 들어갔고, 총 검색결과가 1페이지에 10개씩 나뉘어서 저장된 상태입니다.

 

즉, 2021년 1월 1일부터 2021년 3월 31일까지 나온 공시 보고서의 총 갯수가 68908개이며, 이걸 10개씩 나누어 총 6891개의 페이지를 가지는 것이죠.

 

마지막으로 page_no가 1이므로 1페이지의 공시 10개만 report_list에 들어가 있는 것을 확인할 수 있습니다.

 

 

실제 사용 예시

 

지금까지 배운 것을 가지고 실제로 삼성전자의 최신 공시보고서 하나를 가져와보겠습니다.

 

import dart_fss as dart

# 삼성전자 code
corp_code = '00126380'

reports = dart.filings.search(corp_code=corp_code, bgn_de='20210101', pblntf_detail_ty='a001')

# 가장 최신 보고서 선택
newest_report = reports[0]

# 참고
# 0-4번 보고서 선택
# zero_to_fourth_report = reports[0:5]

# 가장 오래된 보고서 선택
# oldest_report = reports[-1]

 

<주피터 노트북 실행 결과>

 

아직은 이 자료를 어떻게 사용할 수 있는지는 모르겠네요. 어떻게 활용하는지는 조금 더 공부한 후 포스팅 하도록 하겠습니다.

 

 

참고로, 지난 시간 배운 함수를 이용하면 같은 결과를 얻을 수 있습니다.

# 삼성전자 code
corp_code = '00126380'

# 모든 상장된 기업 리스트 불러오기
corp_list = get_corp_list()

# 삼성전자
samsung = corp_list.find_by_corp_code(corp_code=corp_code)

# 연간보고서 검색
reports = samsung.search_filings(bgn_de='20210101', pblntf_detail_ty='a001')

# 가장 최신 보고서 선택
newest_report = reports[0]

 


<참고 자료>

 

DART-FSS 공식 문서

https://dart-fss.readthedocs.io/en/latest/dart_search.html#dart_fss.filings.search.SearchResults.page_count

 

공시정보 검색 — dart-fss documentation v0.3.10 documentation

© Copyright 2021, Sungwoo Jo Revision 2a7bb3e6.

dart-fss.readthedocs.io

 

반응형
반응형

안녕하세요, 왕초보 코린이를 위한 코딩유치원에 오신 것을 환영합니다.

 

 

오늘은 지난 글에 이어서 DART-FSS 패키지로 원하는 회사 혹은 모든 회사의 재무제표를 엑셀 파일로 저장하는 것을 해보겠습니다.

향후 저장받은 데이터를 Pandas 모듈로 가공해서 유의미한 투자 정보를 얻고, 실제 투자에도 적용해 볼 계획입니다.

 

<DART-FSS 관련 지난 글>

 

2021.06.10 - [파이썬 패키지/전자공시시스템(DART)] - [Python / Dart] 파이썬으로 재무제표 정보 가져오기 1편_ DART API와 DART-FSS 패키지 소개

 


 

1. 공시된 기업 정보 불러오기

 

아래의 코드를 이용하면 DART에 공시된 모든 회사의 [회사 코드] + 회사 이름을 리스트 형태로 받을 수 있습니다. 

 

# DART에 공시된 모든 회사 리스트 불러오기

corp_list = dart.get_corp_list()

 

참고로 corp_list를 DART API로부터 받아오는데에 시간이 걸리는데 측정해보니 11.72초 정도로 나오네요.

주로 사용하는 IDE인 VS Code를 사용하니깐 매번 코드를 실행할 때마다 리스트를 불러와서 시간이 아까우므로, 다음부터 Jupyter Notebook을 이용한다면 매번 12초씩 아낄 수 있겠습니다.

 

 

corp_list의 요소가 어떤 데이터 형태를 가지고 있는지, 요소는 몇 개나 있는지 확인해보았습니다. 리스트의 길이를 측정하는 len( ) 함수를 이용해 확인해보니 상장된 기업수가 8만 7천개가 넘네요!

# 리스트의 첫번째 종목정보 출력

print(corp_list[0])

>>> [00434003]다코


# 리스트 종목 갯수 출력

print(len(corp_list))

>>> 87098


# corp_list 자료형 확인

print(type(corp_list))

>>> <class 'dart_fss.corp.corp_list.CorpList'>

 

혹시 종목 87098개가 궁금하신분들은 for문을 이용해서 터미널창에 모두 출력해보세요. 저는 처음으로 터미널 창 스크롤 범위가 오버돼서 이전 정보가 안보이는 것을 경험할 수 있었답니다!

# 모든 회사 [코드]회사명 출력

for i in corp_list:
    print(i,end="")

 

 

2. corp_list 활용 메소드

 

사실 우리가 위에서 얻게된 corp_list는 클래스이며, 따로 메소드를 가지고 있습니다. 즉, corp_list.함수의 형태로 몇 가지 함수를 사용할 수 있습니다.

 

역시 말보다는 코드죠. 가장 자주 사용할 함수 2가지를 예시로 가져와봤습니다.

 

# 삼성전자 회사명으로 검색

samsung = corp_list.find_by_corp_name('삼성전자', exactly=True)[0]


# 삼성전자 회사 코드로 검색

samsung = corp_list.find_by_corp_code('00126380')[0]

 

참고로 exactly 옵션을 설정하지 않으면 기본적으로 False로 설정되어 있습니다. 여기서 특별히 True로 설정해주었는데, 그 이유는 False일 때는 '삼성전자'가 들어간 '삼성전자서비스씨에스'를 출력해주기 때문입니다.

 

또한 corp_list.find_by_corp_name( ) 함수의 결과 데이터는 [[종목 코드]종목 이름]의 형태로 리스트 [ ]로 한겹 쌓여져있습니다. 이를 벗겨내기 위해서 corp_list.find_by_corp_name( )[0]으로 코딩한 점 유의해 주세요.

 

<관련 메소드>

메소드 기능
find_by_corp_code(self, corp_code) DART에서 사용하는 회사 코드를 이용한 찾기
find_by_corp_name(self, corp_name[, …]) 회사 명칭을 이용한 검색
find_by_product(self, product[, market]) 취급 상품으로 검색(코스피, 코스닥, 코넥스만 지원)
find_by_sector(self, sector[, market]) 산업 섹터로 검색(코스피, 코스닥, 코넥스만 지원)
find_by_stock_code(self, stock_code[, …]) 주식 종목 코드를 이용한 찾기
load(self[, profile]) 회사 정보가 없을시 회사 정보 로딩

 

<여기서 잠깐! corp_code와 stock_code의 차이점>

 

corp_code는 dart에서 사용하는 코드를 말하며 stock_code는 아래와 같이 검색포털에서 주식정보를 검색하면 나오는 코드입니다.

위에서 다루었던 삼성전자의 corp_code (00126380)와 다른 것을 확인 할 수 있습니다.

 

3.  회사 정보로 재무제표 다운받기

 

위에서 samsung이란 변수에 회사 정보([종목 코드]종목 이름)을 저장했습니다. 이 samsung이란 변수도 사실 클래스의 인스턴스(객체)로서 메소드를 사용할 수 있습니다.

 

주로 사용할 만한 메소드는 아래의 5개 중 extract_fs와 search_fillings이며, 이번 시간에는 목표로 했던 재무제표를 정보를 가져오는 extract_fs( ) 메소드를 사용해 보겠습니다.

메소드 기능
extract_fs(bgn_de[, end_de, fs_tp, …]) 재무제표 검색
load(self) 종목 정보 로딩
search_filings([bgn_de, end_de, …]) 공시보고서 검색
to_dict() 종목에 관한 모든 정보를 Dictionary 형태로 반환
update(info) Update information

 

코드는 아래와 같이 간단합니다. 다만 실행하시면 자료를 가져오는데에 시간이 꽤 걸릴거예요.

 

# 2020년부터 연간 연결재무제표 불러오기
fs = samsung.extract_fs(bgn_de='20200101')

# 재무제표 검색 결과를 엑셀파일로 저장 (기본저장위치: 실행폴더/fsdata)
fs.save()

 

<여기서 잠깐! extract_fs 메소드의 인자(옵션)>

 

꼭 입력이 필요한 검색시작 일자(bgn_de)를 제외하고는 모두 기본값이 들어가 있습니다.

 

옵션 기능 기본 값 자료형
bgn_de 검색시작 접수일자('YYYYMMDD') 필수 입력 str
end_de 검색종료 접수일자('YYYYMMDD') 오늘 날짜 str
fs_tp 재무제표 종류 선택
(‘bs’:  재무상태표, ‘is’ : 손익계산서, ‘cis’ : 포괄손익계산서, ‘cf’ : 현금흐름표)
('bs', 'is', 'cis', 'cf) tuple,
str
separate 개별재무제표 여부 (True : 개별 재무제표 / False : 연결 재무제표) False str
report_tp 연간, 반기, 분기 보고서 선택
(‘annual’ : 연간, ‘half’ : 반기, ‘quarter’ : 분기)
None str
lang 언어 선택 ('ko' : 한글, 'en' : 영어) 'ko' str
separator 숫자 1000 단위 구분자 표시 여부 (True / False) True str
dataset 'xbrl' : xbrl 파일 우선 데이터 추출
'web' : web page 우선 데이터 추출
'xbrl' str

 

 

코드 실행 결과 아래와 같은 이름의 엑셀 파일이 저장됩니다. 참고로 excel 파일이 있는 fsdata 폴더는 현재 작업 디렉토리에 존재합니다.

 

엑셀 파일을 열어보면 아래와 같이 데이터들이 있습니다. 데이터들이 의미하는 바는 추후 정리하는 시간을 갖겠습니다.

 

 

참고로 위에서 설정했던 (bgn_de='20200101')은 아래의 그림에서 시작 기간을 의미합니다.

 

아래는 dart에서 검색한 연결 재무상태표입니다.

 

 


<참고자료>

 

DART-FSS 공식문서

https://dart-fss.readthedocs.io/en/latest/dart_corp.html

 

기업정보검색 — dart-fss documentation v0.3.10 documentation

© Copyright 2021, Sungwoo Jo Revision 2a7bb3e6.

dart-fss.readthedocs.io

 

반응형
반응형

안녕하세요, 왕초보 코린이를 위한 코딩유치원에 오신 것을 환영합니다.

 

 

오늘은 투자에 도움이 될 수 있는 파이썬 패키지를 소개드리려 합니다.

 

아마 투자를 조금 하신다는 분들은 DART(전자공시시스템)을 아실텐데요. 오늘 소개드릴 dart-fss 패키지는 DART에서 제공하는 API(Application Programming Interface)를 저희같은 초보자도 쉽게 다룰 수 있도록 해줍니다.

 

한마디로 파이썬으로 공시정보를 내맘대로 조회하고 가공해서 유의미한 투자 정보를 얻어낼 수 있다는 것입니다.

만약 투자에 관심이 있으신분들은 이번 기회에 배우셔서 투자에 꼭 적용해보시길 추천드립니다.


오늘의 주인공인 dart-fss 패키지에 대해 알아보기 전에 잠시 DART와 DART API에 대해 알아보도록 하겠습니다.

 

DART란?

 

출처. DART 홈페이지

 

DART(Data Analysis, Retrieval and Transfer System)은 데이터 분석, 검색 및 전송 시스템이라는 뜻을 가진, 대한민국 금융감독원에서 운영하는 기업정보 전자공시시스템입니다.

 

코스피, 코스닥 시장에 상장된 주식회사부터 비상장 주식회사까지 다양한 회사들이 회사의 경영상태에 대한 공시를 하는 사이트입니다. 이 시스템으로 인해 투자자 누구나 기업에 관한 정보를 손쉽게 얻을 수 있습니다.

 

 

DART API란?

 

감사하게도 DART에서 다른 사람들이 프로그램을 만들 때 사용하라고 API를 만들어 주었습니다. 여기서 API란 Application Programming Interface의 약자로 프로그램들이 서로 상호작용하는 것을 도와주는 매개체라고 이해하시면 됩니다.

 

API에 대해 조금 더 자세한 내용이 궁금하신 분들은 아래의 링크에 아주 쉽게 설명되어 있으니 참고하세요.

 

 

API란? 비개발자가 알기 쉽게 설명해드립니다! - Wishket

여러분은 API가 무엇인지 알고 계신가요? 자주 듣게 되지만 그 개념이 무엇인지 정확하게 알기란 쉽지 않은데요. 이번 시간 위시켓이  API란 무엇인지 알기 쉽게 설명해드리고자 합니다. 위시켓

blog.wishket.com

 

DART API 인증키 신청

 

DART API를 사용하기 위해서는 API 인증키를 신청해주셔야 하는데요.

 

우선 DART 회원가입을 해주셔야 합니다.

 

https://opendart.fss.or.kr/intro/main.do

 

회원 가입이 완료되신 분들은 DART 홈페이지에서 우측 상단의 '오픈API'를 클릭하시거나 위의 링크로 접속해주신 후, 로그인 하지 않으신 상태로 '인증키 신청'을 해주시면 됩니다. 크게 어렵지 않으니 아래의 gif를 참고하셔서 만들어주세요.

 

신청이 완료되셨으면 로그인 후, 인증키 관리 탭에 들어가셔서 승인이 되셨는지 확인하신 후에 좌측의 오픈API 이용현황을 클릭해주세요.

그러면 API Key가 아주 복잡한 숫자와 영어의 조합으로 나오실 거예요. 코딩하실 때 필요하니 한 곳에 Ctrl+C, Ctrl+V 해놓아주세요.

 

 

DART-FSS란?

 

대한민국 금융감독원에서 운영하는 다트 사이트 크롤링 및 재무제표 추출을 위한 라이브러리라고 공식 문서에 쓰여 있습니다.

저의 개념으로는 패키지가 맞는 말인 것 같은데 이 문서를 보니 조금 헷갈리네요.

 

https://dart-fss.readthedocs.io/en/latest/index.html

 

DART-FSS — dart-fss documentation v0.3.10 documentation

© Copyright 2021, Sungwoo Jo Revision 2a7bb3e6.

dart-fss.readthedocs.io

 

<주의 사항>

Open DART 및 DART 홈페이지의 경우 분당 100회 이상 요청시 서비스가 제한될 수 있음

 

 

 

DART-FSS 설치 방법

 

터미널(cmd) 창에서 아래와 같이 입력해주시면 됩니다. 혹시나 오타가 날 수 있으니 그냥 복사 붙여넣기해서 엔터 눌러주세요.

pip install dart-fss

 

 

DART-FSS 맛보기

 

위에서 알려드린 dart-fss 공식 문서에 들어가보시면 Quick Starts라는 이름으로 아래의 코드를 써두었습니다.

코드에 대한 것은 다음 시간에 차차 알아보기로 하고 일단 아래의 코드를 그대로 복사 붙여넣기 해서 코드를 실행해봅시다.

 

실행하실 때는 api_key = '아까 발급받은 API Key'로 바꿔주세요! 그리고 중요한 건 아닌데, 설치할 때 dart-fss이고 import 할 때는 dart_fss라는 신기한 사실! 그냥 그렇다구요ㅎㅎ..

 

혹시나 저처럼 dart_fss.py로 파일 이름을 만들었다가는 아래와 같은 에러가 뜨면서 패키지가 제대로 작동하지 않으니 주의하세요!

 

AttributeError: partially initialized module 'dart_fss' has no attribute 'set_api_key' (most likely due to a circular import)

 

import dart_fss as dart

# Open DART API KEY 설정
api_key='xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx'
dart.set_api_key(api_key=api_key)

# DART 에 공시된 회사 리스트 불러오기
corp_list = dart.get_corp_list()

# 삼성전자 검색
samsung = corp_list.find_by_corp_name('삼성전자', exactly=True)[0]

# 2012년부터 연간 연결재무제표 불러오기
fs = samsung.extract_fs(bgn_de='20120101')

# 재무제표 검색 결과를 엑셀파일로 저장 ( 기본저장위치: 실행폴더/fsdata )
fs.save()

 

위의 코드를 실행하시면 시간이 꽤 걸려서 fsdata라는 폴더 안에 엑셀 파일이 하나 만들어집니다. 총 8개의 시트가 있는데 참고로 말씀드리면, 각각 bs’ 재무상태표, ‘is’ 손익계산서, ‘cis’ 포괄손익계산서, ‘cf’ 현금흐름표를 뜻하며 시트 이름에 Data가 들어가는 것만 보시면 됩니다.

 

 


 

오늘 준비한 내용은 여기까지고, 다음 시간부터 자주 사용할만한 함수들에 대해서 공부해보겠습니다.

 

감사합니다.

반응형

+ Recent posts