[FinDA] 금융감독원 전자공시(DART) 데이터 기초 분석. 공시정보 확인. 보고서 조회.


import pandas as pd
from datetime import date, timedelta
%matplotlib inline
import matplotlib.pyplot as plt
plt.rcParams['figure.figsize'] = (12, 6)
plt.rcParams["font.family"] = 'NanumBarunGothic'
import getpass
import mysql.connector
from sqlalchemy import create_engine
pwd = getpass.getpass()
engine = create_engine('mysql+mysqlconnector://woosa7:'+pwd+'@localhost/findb', echo=False)
········

전자공시 전체 갯수 (2004년 1월 1일부터)

sql = "SELECT count(*) FROM stock_dart"
df = pd.read_sql(sql, con=engine)
df
count(*)
0 1630472
# 공시 테이블 구조 확인
sql = "DESC stock_dart"
df = pd.read_sql(sql, con=engine)
df
Field Type Null Key Default Extra
0 doc_id varchar(25) NO PRI None
1 date datetime YES None
2 corp_name varchar(50) YES None
3 market varchar(50) YES None
4 title varchar(255) YES None
5 link varchar(128) YES None
6 reporter varchar(50) YES None
7 postdate datetime YES None

특정 기업에 대한 공시 정보 확인

company_name = 'NAVER'
# 최근 공시 10개
sql = "SELECT date, title, link FROM stock_dart WHERE corp_name = '%s' ORDER BY date DESC limit %d" % (company_name, 10)
df = pd.read_sql(sql, con=engine)
df
date title link
0 2017-04-13 16:05:00 기업설명회(IR)개최(안내공시) http://dart.fss.or.kr/dsaf001/main.do?rcpNo=20...
1 2017-04-07 16:03:00 최대주주등소유주식변동신고서 http://dart.fss.or.kr/dsaf001/main.do?rcpNo=20...
2 2017-03-31 17:13:00 사업보고서 (2016.12) http://dart.fss.or.kr/dsaf001/main.do?rcpNo=20...
3 2017-03-24 16:49:00 기업설명회(IR)개최(안내공시) http://dart.fss.or.kr/dsaf001/main.do?rcpNo=20...
4 2017-03-17 18:18:00 대표이사(대표집행임원)변경(안내공시) http://dart.fss.or.kr/dsaf001/main.do?rcpNo=20...
5 2017-03-17 18:16:00 정기주주총회결과 http://dart.fss.or.kr/dsaf001/main.do?rcpNo=20...
6 2017-03-10 17:13:00 [기재정정]주주총회소집공고 http://dart.fss.or.kr/dsaf001/main.do?rcpNo=20...
7 2017-03-09 16:25:00 감사보고서제출 http://dart.fss.or.kr/dsaf001/main.do?rcpNo=20...
8 2017-03-08 16:43:00 기업설명회(IR)개최(안내공시) http://dart.fss.or.kr/dsaf001/main.do?rcpNo=20...
9 2017-03-02 16:50:00 [기재정정]주요사항보고서(회사분할결정) http://dart.fss.or.kr/dsaf001/main.do?rcpNo=20...
# 특정 월의 보고서
sql = "SELECT date, title, link FROM stock_dart WHERE corp_name='%s' and date like '%s%%'" % (company_name, "2017-01")
df = pd.read_sql(sql, con=engine)
df
date title link
0 2017-01-06 17:53:00 최대주주등소유주식변동신고서 http://dart.fss.or.kr/dsaf001/main.do?rcpNo=20...
1 2017-01-11 16:03:00 결산실적공시예고(안내공시) http://dart.fss.or.kr/dsaf001/main.do?rcpNo=20...
2 2017-01-11 16:03:00 기업설명회(IR)개최(안내공시) http://dart.fss.or.kr/dsaf001/main.do?rcpNo=20...
3 2017-01-20 16:26:00 기타경영사항(종속회사의주요경영사항) http://dart.fss.or.kr/dsaf001/main.do?rcpNo=20...
4 2017-01-26 11:21:00 [첨부추가]주요사항보고서(회사분할결정) http://dart.fss.or.kr/dsaf001/main.do?rcpNo=20...
5 2017-01-26 07:11:00 현금ㆍ현물배당결정 http://dart.fss.or.kr/dsaf001/main.do?rcpNo=20...
6 2017-01-26 07:12:00 매출액또는손익구조30%(대규모법인은15%)이상변경 http://dart.fss.or.kr/dsaf001/main.do?rcpNo=20...
7 2017-01-26 07:19:00 연결재무제표기준영업(잠정)실적(공정공시) http://dart.fss.or.kr/dsaf001/main.do?rcpNo=20...
8 2017-01-26 07:20:00 영업(잠정)실적(공정공시) http://dart.fss.or.kr/dsaf001/main.do?rcpNo=20...
9 2017-01-26 07:09:00 주주총회소집결의 http://dart.fss.or.kr/dsaf001/main.do?rcpNo=20...
# 2012년 이후 사업보고서
sql = "SELECT date, title, link FROM stock_dart WHERE corp_name='%s' and title like '%%%s%%' and date > '%s'"\
      % (company_name, "사업보고서", "2012")
df = pd.read_sql(sql, con=engine)
df
date title link
0 2012-03-29 17:12:00 사업보고서 (2011.12) http://dart.fss.or.kr/dsaf001/main.do?rcpNo=20...
1 2013-04-01 16:18:00 사업보고서 (2012.12) http://dart.fss.or.kr/dsaf001/main.do?rcpNo=20...
2 2014-03-31 15:55:00 사업보고서 (2013.12) http://dart.fss.or.kr/dsaf001/main.do?rcpNo=20...
3 2014-05-14 17:38:00 [기재정정]사업보고서 (2013.12) http://dart.fss.or.kr/dsaf001/main.do?rcpNo=20...
4 2015-03-31 16:34:00 사업보고서 (2014.12) http://dart.fss.or.kr/dsaf001/main.do?rcpNo=20...
5 2015-05-15 16:23:00 [기재정정]사업보고서 (2014.12) http://dart.fss.or.kr/dsaf001/main.do?rcpNo=20...
6 2016-03-30 16:59:00 사업보고서 (2015.12) http://dart.fss.or.kr/dsaf001/main.do?rcpNo=20...
7 2017-03-31 17:13:00 사업보고서 (2016.12) http://dart.fss.or.kr/dsaf001/main.do?rcpNo=20...
# 사업보고서 확인 - 링크 클릭하면 보고서 페이지로 이동
for ix, r in df.iterrows():
    print(r['title'])
    print(r['link'])
사업보고서 (2011.12)
http://dart.fss.or.kr/dsaf001/main.do?rcpNo=20120329001010
사업보고서 (2012.12)
http://dart.fss.or.kr/dsaf001/main.do?rcpNo=20130401002241
사업보고서 (2013.12)
http://dart.fss.or.kr/dsaf001/main.do?rcpNo=20140331002244
[기재정정]사업보고서 (2013.12)
http://dart.fss.or.kr/dsaf001/main.do?rcpNo=20140514005181
사업보고서 (2014.12)
http://dart.fss.or.kr/dsaf001/main.do?rcpNo=20150331003278
[기재정정]사업보고서 (2014.12)
http://dart.fss.or.kr/dsaf001/main.do?rcpNo=20150515001856
사업보고서 (2015.12)
http://dart.fss.or.kr/dsaf001/main.do?rcpNo=20160330003610
사업보고서 (2016.12)
http://dart.fss.or.kr/dsaf001/main.do?rcpNo=20170331004699
# 년도별 공시 추세
# 전체 공시
sql = "SELECT date, title FROM stock_dart WHERE corp_name = '%s'" % (company_name)
df = pd.read_sql(sql, con=engine)
df.shape
(959, 2)
df.set_index(pd.to_datetime(df['date']), inplace=True)
df['n'] = 1   # 갯수 카운트 하기 위한 값 설정.
df.head()
date title n
date
2004-01-06 16:28:00 2004-01-06 16:28:00 계열회사의추가 1
2004-01-16 19:09:00 2004-01-16 19:09:00 소속부변경 1
2004-01-27 08:40:00 2004-01-27 08:40:00 공정공시 1
2004-02-05 12:05:00 2004-02-05 12:05:00 조회공시요구 1
2004-02-05 16:39:00 2004-02-05 16:39:00 조회공시 1
df_m_sum = df['n'].resample('A').sum().dropna()
df_m_sum.head()
date
2004-12-31    73
2005-12-31    44
2006-12-31    52
2007-12-31    61
2008-12-31    72
Freq: A-DEC, Name: n, dtype: int64
# 보고서 공시
sql = "SELECT date, title FROM stock_dart WHERE corp_name = '%s' and title like '%%%s%%'" % (company_name, "보고서")
df2 = pd.read_sql(sql, con=engine)
df2.shape
(166, 2)
df2.set_index(pd.to_datetime(df2['date']), inplace=True)
df2['n'] = 1
df_r_sum = df2['n'].resample('A').sum().dropna()
df_r_sum.head()
date
2004-12-31    17
2005-12-31     9
2006-12-31     9
2007-12-31    11
2008-12-31    11
Freq: A-DEC, Name: n, dtype: int64
# plotting
df_m_sum.plot()
df_r_sum.plot()
plt.legend(["전체 공시","보고서"])
<matplotlib.legend.Legend at 0x1ae679f35f8>

png