본 자료는 '평생 필요한 데이터 분석'의 오프라인 강의 자료의 일부입니다.
오늘은 DART의 2021년 1분기 재무제표 데이터를 다운로드해서 데이터베이스화하는 작업을 진행하겠습니다.
이후에는 데이터베이스화된 재무제표 데이터를 이용해 다양한 분석도 시도해볼 예정입니다.
1. DART 접속 및 사업보고서 확보
2021년 1분기보고서의 손익계산서를 다운로드하자. 2021년 1분기보고서에는 2021년 1월 1일부터 2021년 3월 31일까지의 재무 현황이 담겨 있다. 안타깝게도 해당 보고서는 1분기가 끝난 한참 후에나 DART에서 확인할 수 있다. DART의 접속 URL은 아래와 같다.
DART의 접속해 아래와 같은 과정으로 2021년 1분기보고서의 손익계산서를 다운로드한다. [그림 1-1]을 참고한다.
1. DART 메뉴 상단의 '공시정보활용'마당 메뉴에 접속
2. '공시정보활용마당'의 좌측 메뉴에서 '재무정보 일괄다운로드'를 선택
3. 2021년을 선택한다.
4. 2021년 데이터 중에, '1분기보고서'의 '손익계산서'를 다운로드 한다.
다운로드한 파일(2020_4Q_PL_20210422040118)의 압축을 풀어보면 아래와 같은 파일이 들어있다. (2021년 6월 18일 기준이다.)
- 2021_1분기보고서_02_손익계산서_20210618.txt
- 2021_1분기보고서_02_손익계산서_연결_20210618.txt
- 2021_1분기보고서_03_포괄손익계산서_20210618.txt
- 2021_1분기보고서_03_포괄손익계산서_연결_20210618.txt
위 파일들 중에, 2021_1분기보고서_03_포괄손익계산서_연결_20210618'만 데이터베이스에 올려볼 예정이다.
2. UPLOAD할 파일을 UTF-8로 변환하기
현재 DART에서 받은 파일은 ANSI 형태로 저장되어 있다. ANSI 형태 파일을 MySQL로 업로드하면 한글이 깨지는 문제가 있다. (환경에 따라 문제없을 수도 있다.) ANSI 형태의 파일을 UTF-8로 변환해 저장해야 한다. 여기서는 손익계산서 파일을 윈도우의 메모장(notepad)으로 열어서 인코딩을 UTF-8로 변환해 저장한다.
'2021_1분기보고서_03_포괄손익계산서_연결_20210618' 파일을 메모장으로 열어서 UTF-8로 변환해 저장한다. 저장할 때 업로드 하기 편하도록 파일명도 변경한다. ([그림 2-1]을 같이 참고한다.)
- 2021_1분기보고서_03_포괄손익계산서_연결_20210618.txt
1. 'UP_손익계산서_20111'로 파일명을 변경한다.
2. 인코딩을 UTF-8로 변경한다.
3. 확인을 눌러 저장한다.
3. SQL Tool(DBeaver) 다운로드 및 접속하기
확보한 데이터 파일을 데이터베이스로 올리기 위해서는 DBMS와 SQL Tool이 필요하다. DBMS는 MySQL을 사용하고 SQL Tool은 DBeaver를 사용한다.
먼저 자신의 PC에 MySQL을 설치해야 한다. MySQL 설치는 아래 글을 참고하기 바란다.
- https://blog.naver.com/ryu1hwan/222384349575
MySQL을 설치한 후에는 데이터베이스를 생성하고, 만들어진 데이터베이스에 테이블이라는 데이터 저장 공간을 만들어야 한다. 그리고, 테이블에 앞에서 UTF8로 변환해 저장한 파일을 올리게 된다.
데이터베이스와 테이블, 데이터에 대해 궁금하다면 아래 글을 참고하기 바란다.
- https://blog.naver.com/ryu1hwan/222384222486
MySQL에 데이터베이스와 테이블을 생성하려면 SQL 툴을 사용해 명령을 내려야 한다. 이를 위해 DBeaver를 설치하도록 하자. DBeaver를 사용하는 이유는, 엑셀이나 CSV(콤마로 구분된 문서 파일) 파일을 데이터베이스로 올릴 때 유용하기 때문이다. 또한 DBeaver는 무료 버전이 있으며 다향한 DBMS에 접속하는 것도 가능하다. DBeaver는 아래 사이트에서 다운로드할 수 있다.
DBeaver를 설치했다면 DBeaver로 MySQL에 접속하도록 하자. DBeaver를 설치했다면 DBeaver로 MySQL에 접속하도록 하자. DBeaver에 접속한 후에, SQL을 실행하기 위해서는 F3을 눌러 SQL Script 창을 열면 된다.
4. UPLOAD용 테이블 만들기
데이터를 업로드 할 때는, 업로드 전용 테이블을 만들어서 처리하는 것이 좋다. 실제 시스템에서 사용하는 테이블에 직접 업로드를 하면, 시스템 장애의 위험성도 있으며, 클린징되지 않은 데이터가 입력되어서 혼선을 일으킬 수 있다. 실제 운영 시스템에서 데이터 업로드를 해야 한다면 반드시 아래와 같은 과정으로 진행하기 바란다.
1. 업로드용 임시 테이블 생성
2. 파일을 업로드용 임시 테이블로 업로드 처리
3. 업로드용 임시 테이블을 이용해, 잘 못된 데이터가 있는지 검토
4. 검토가 완료되어 문제가 없다면, 임시 테이블의 데이터를 실제 테이블로 INSERT 처리한다.
테이블을 만들기 위해서는, 테이블을 생성할 데이터베이스를 먼저 생성해야 한다. DB_DTECH라는 데이터베이스를 생성한다. 데이터베이스를 만들기 위해서는 아래와 같이 CREATE DATABASE SQL을 사용하면 된다. DBeaver로 MySQL에 접속해 아래 SQL을 실행하면 된다.
CREATE DATABASE DB_DTECH;
SQL과 데이터 및 주식 분석에 대해 공부할 수 있는 '평생 필요한 데이터 분석' 책에서는 DB_SQLSTK 데이터베이스를 사용한다. DB_SQLSTK 데이터베이스를 이미 생성했다면 DB_SQLSTK 데이터베이스를 사용해도 된다. 하지만 DB_SQLSTK은 책의 실습을 위해 그대로 남겨두고 별도의 데이터베이스(DB_DTECH)를 만드는 것을 권장한다.
DB_DTECH 데이터베이스를 생성했으면 업로드용 임시 테이블을 만들 차례다. 업로드용 임시 테이블을 만들기 위해서는 다운로드한 파일을 열어서 어떤 컬럼들이 필요한지 살펴보아야 한다. '2021_1분기보고서_03_포괄손익계산서_연결_20210618' 파일을 엑셀로 열어 보자. 엑셀에서 첫 번째 로우의 필드명을 업로드용 임시 테이블의 컬럼으로 사용하면 된다. 결과적으로 아래의 SQL을 이용해 UP_손익계산서_2011Q 테이블을 생성하면 된다.
CREATE TABLE DB_DTECH.UP_손익계산서_20211Q
(
재무제표종류 VARCHAR(100) NOT NULL
,종목코드 VARCHAR(40) NOT NULL
,회사명 VARCHAR(100)
,시장구분 VARCHAR(40)
,업종 VARCHAR(100)
,업종명 VARCHAR(100)
,결산월 VARCHAR(40)
,결산기준일 VARCHAR(40) NOT NULL
,보고서종류 VARCHAR(100)
,통화 VARCHAR(40)
,항목코드 VARCHAR(500) NOT NULL
,항목명 VARCHAR(500)
,당기1분기3개월 NUMERIC(18,2)
,당기1분기누적 NUMERIC(18,2)
,전기1분기3개월 NUMERIC(18,2)
,전기1분기누적 NUMERIC(18,2)
,전기 NUMERIC(18,2)
,전전기 NUMERIC(18,2)
,PRIMARY KEY(재무제표종류,종목코드,결산기준일,항목코드)
);
5. UPLOAD하기
이제 드디어 업로드 할 차례다. DBeaver의 DATA IMPORT(데이터 가져오기) 기능을 사용해 앞에서 만든 임시 테이블(UP_손익계산서_20211Q)에 'UP_손익계산서_20111'로 저장한 파일의 데이터를 가져올 예정이다.
[그림 5-1]과 같이 DBeaver의 좌측에 있는 Database Navigator에서 DB_DTECH의 Tables 폴더를 확장해보자. 새로 만든 UP_손익계산서_20211Q 테이블이 보일 것이다. 만약에 보이지 않는다면, DBeaver를 다시 접속하거나, Navigator 창에서 F5 키를 눌러 새로고침 해보기 바란다.
UP_손익계산서_20211Q 테이블에 마우스 우클릭을 하게 되면 팝업 메뉴가 나온다. 팝업 메뉴 중에 데이터 가져오기(DATA IMPORT)를 선택한다.
[그림 5-2]와 같은 Data Transfer 창이 나오면, 'CSV에서 가져오기'를 선택하고 '다음' 버튼을 눌러 넘어가도록 한다.
[그림 5-3]과 같이 테이블에 업로드할 파일을 선택하는 창이 나오면 앞에서 UTF로 저장한 'UP_손익계산서_20111'파일을 선택하도록 한다. 이때, DART에서 받은 파일의 확장자가 TXT로 되어 있어, 확장자를 CSV로 변경하지 않는다면 파일이 보이지 않는다. 그림과 같이 확장자를 TXT로 변경한 후에 UP_손익계산서_20111 파일을 선택하다.
아래 [그림 5-4]와 같이 'Input File(s)' 창에서, 컬럼 구분자(Column Delimiter)에 '\t'(Tab)를 입력한다. DART에서 받은 파일이 컬럼(필드)을 탭(Tab)으로 구분하기 때문이다. 만약에 자신이 가지고 있는 파일의 컬럼 구분자가 콤마(,)라면 콤마를 입력해주면 된다. 컬럼 구분자를 탭으로 설정한 후에 다음을 누르도록 하자.
[그림 5-5]와 같은 Tables Mapping 화면은 Source와 Target간에 컬럼을 매핑하는 화면이다. Source 테이블 쪽에 '>' 표시를 클릭해보면 컬럼간 매핑을 확인할 수 있다.
[그림 5-5]에서 Source 쪽의 '>' 부분을 클릭한 후에 스크롤을 내려보면, 아래 [그림 5-6]의 좌측과 같이 일부 컬럼(당기 1분기 3개월~전기 1분기 누적까지)의 Mapping이 create로 되어 있는 것을 확인할 수 있다. DBeaver는 기본적으로 Source 파일의 필드명과 Target 테이블의 컬럼명을 비교해 같은 필드(컬럼)간에 매핑을 처리한다. 앞에서 테이블을 생성할 때, 파일의 "당기 1분기 3개월" 필드명은 "당기1분기3개월"과 같이 빈 칸(Space)을 제거해 테이블의 컬럼으로 만들어 놓은 상태다.
해당 매핑 화면에서 Mapping이 create로 된 항목은, Target쪽의 항목을 하나씩 클릭해 그림의 오른쪽과 같이 create가 existing이 되도록 테이블에 이미 있는 컬럼을 선택하기 바란다.
여기까지 완료한 후, 나머지 화면에서는 '다음'과 'Start'를 선택해 업로드를 실행하면 된다.
업로드가 완료된 후에는 SELECT SQL을 통해 업로드한 데이터를 확인해보자.
SELECT *
FROM UP_손익계산서_20211Q;
※ 책 소개: https://sweetquant.tistory.com/243
※ 책 미리보기: https://sweetquant.tistory.com/257
※ 완전판 E-Book
▶ 유페이퍼: https://www.upaper.net/ryu1hwan/1142997
▶ 알라딘: https://www.aladin.co.kr/shop/wproduct.aspx?ItemId=273701425
▶ Yes24: http://www.yes24.com/Product/Goods/102264444?OzSrank=1
'데이터분석 > D-Tech 데이터로 하는 재테크' 카테고리의 다른 글
월별 주가 DB화하기(2019~2021.06) (0) | 2021.07.06 |
---|---|
상따의 확률은? (1) | 2021.07.01 |
2021년 1분기 영업이익률 Top종목 (0) | 2021.06.28 |
2021년 1분기 영업이익 증가 종목 찾기 (0) | 2021.06.25 |
주식시장에서 살아남는 심리 투자 법칙 (0) | 2021.06.10 |
2차 전지 ETF 들여다보기 (0) | 2021.01.17 |
체크! 건설주 (0) | 2021.01.16 |
증권주를 들여다 보자(Feat. 팍스넷) (0) | 2021.01.12 |