전자공시(DART) 데이터 기초분석
[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>