josw123 / dart-fss

한국 금융감독원에서 운영하는 다트(Dart) 시스템 크롤링을 위한 라이브러리
https://github.com/josw123/dart-fss
MIT License
321 stars 110 forks source link

분기보고서 추출문제 #118

Closed 0x68756d8616e6f69664 closed 2 years ago

0x68756d8616e6f69664 commented 2 years ago

안녕하세요? 너무 어려운 문제를 간단히 모듈화 해주셔 먼저 감사드립니다.

다름이 아니오라 프로그래밍 하던 중 동일한 조건으로 다음 두개의 회사를 추출하는 경우 1. AJ네트웍스 2. 스카이이앤엠 에서 다음과 같은 차이가 발생합니다. 1. 2019.01.01 부터 보고서 추출 됨 2. cis, is, cf의 경우 2019.07.01 부터 보고서 추출 됨 반면 bs 는 그대로 2019.01.01부터 적용

디버그를 해보던 중 차이점을 찾기 어려워 문의드립니다. extract함수를 사용하였으며 bgn_date를 2019.01.01로 수정하였습니다. 유달리 전반기 보고서가 특정연도부터 누락 되는 것이 궁금하여 글 남깁니다.

처음에는 적용하는데 어려웠는데 쓰다보니 제가 한 실수도 보이고 재밌습니다. 감사합니다. 혹여나 실례가 되지 않는다면 모듈의 원리가 보고서가 모여있는 곳에 접속하여 하나씩 데이터를 가져오는 건가요? 신기하네요 ㅎㅎ

0x68756d8616e6f69664 commented 2 years ago

cumulative 값이 True 일 때는 추출이 안되고 False 일 때 추출되는 것 같습니다

josw123 commented 2 years ago

안녕하세요,

올려주신 문제의 실제 실행 코드를 알려주시면 감사하겠습니다. 아래의 코드로 테스트한 결과 첨부된 엑셀파일과 같이 2019년부터의 2022년 3월까지의 데이터까지 추출되는 것을 확인하였습니다.

import dart_fss as dart

corp_list = dart.get_corp_list()
corp = corp_list.find_by_corp_name('AJ네트웍스')[0]
fs1 = corp.extract_fs(bgn_de='20190101', report_tp='quarter', cumulative=True)
fs1.save('00365387_quarter(cumulative=true).xlsx')
fs2 = corp.extract_fs(bgn_de='20190101', report_tp='quarter', cumulative=False)
fs2.save('00365387_quarter(cumulative=false).xlsx')

00365387_quarter(cumulative=true).xlsx 00365387_quarter(cumulative=false).xlsx

올려주신 내용만으로는 제가 문제점을 파악하기 힘들기 때문에, 어떤 코드로 어떤 결과가 이상한지 코드 및 그림을 첨부해주시면 감사하겠습니다.

0x68756d8616e6f69664 commented 2 years ago

코드는 동일하게 extract 함수를 사용했고 데이터와 함수를 분석해보니 cumulative 처리가 다음과 같습니다 연결손익계산서 누적 시작 날짜 ex) 0101 로 filtering 해서 처리

그런데 제가 말씀드린 AJ네트웍스가 아닌 스카이이앤엠의 경우 연결손익계산서 날짜가 도중에2019.01.01에서 2019.07.01 로 바뀌어서 함수 조건을 동일하게 추출하면 바뀌지 않은 경우에는 bs와 cis의 column수가 동일하지만 그렇지 않은 경우에는 수가 다르게 됩니다.

혹시 이런 경우 처리할 수 있는 함수가 있을까요? 전달이 잘 될지 걱정이네요. 미리 감사드립니다.

green7411 commented 2 years ago

samsung = corp_list.find_by_stock_code(131100)

fs = dart.fs.extract(corp_code=re.sub(r'[^0-9]', '', str(samsung)[:9]), bgn_de='20190101', end_de='20220331', fs_tp=('bs', 'is', 'cis', 'cf'), report_tp='quarter', cumulative=True, progressbar=False, separate=False)

코드 첨부합니다. 감사합니다.

josw123 commented 2 years ago

감사합니다.

확인해보고 답변 드리도록 하겠습니다.

josw123 commented 2 years ago

그리고 corp_code는 regular expression으로 추출하실 필요 없이 아래와 같이 접근이 가능합니다.

corp = corp_list.find_by_stock_code('131100')
# corp_code 변수로 접근 가능
corp_code = corp.corp_code

# 위의 올려주신 코드는 아래와 같이 처리 가능합니다.
fs = dart.fs.extract(corp_code=corp.corp_code,
bgn_de='20190101', end_de='20220331',
fs_tp=('bs', 'is', 'cis', 'cf'),
report_tp='quarter', cumulative=True,
progressbar=False, separate=False)
0x68756d8616e6f69664 commented 2 years ago

늦은시간에도 답변 주셔서 감사합니다. 막무가내로 검색해보면서 해보는 중인데 코드가 훨씬 깔끔 해져서 보기 좋아졌습니다. 다시 한 번 감사합니다 ^^.

josw123 commented 2 years ago

안녕하세요.

올려주신 스카이이앤엠의 경우 2018년에서 2019년으로 넘어가면서 주주총회소집공고를 통해 회계분기 구분 기준이 변경되었습니다.

image

그로 인해 회계분기 구분 기준들이 아래와 같이 뒤죽박죽이 된 상태로 생각됩니다.

image

image

image

즉, 2019년 및 2020년 공시 내용을 보면 동일한 3분기라도 회계분기 시작 날짜와 종료 날짜가 일치하지 않게 됩니다.

이 문제는 본 라이브러리에서 따로 구분 처리하기 힘들 것으로 생각되며 [2020년 - 2022년], [2019년], [2018년 이전]으로 데이터를 구분하여 추출하신 다음 수기로 합쳐주셔야 될 것 같습니다.

특히 데이터의 정확도를 위해 공시 내부에 첨부된 XBRL 파일을 이용하고 있는데, 이 경우 분기 구분이 일정하지 않은 경우 분기를 구분하기 쉽지 않기 때문에 dart-fss 라이브러리에서 자동화 처리가 불가능할 것으로 생각됩니다.

다시 한번 본 라이브러리를 사용해주셔서 감사합니다.