Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

1. xbrl 추출 안 됨 2. 부호가 바뀐 채 수집되는 재무 데이터 존재 #184

Open
ym1018 opened this issue Nov 17, 2024 · 4 comments

Comments

@ym1018
Copy link

ym1018 commented Nov 17, 2024

안녕하세요, 좋은 라이브러리를 만들어 주심에 감사드립니다. 항상 잘 사용하고 있습니다.

라이브러리 사용 도중 2가지 오류를 발견하여 보고 드립니다.

1. xbrl 추출 안 됨

아마 다른 분들과 동일한 오류인 것으로 보이나, 코드가 조금 달라 같이 공유드립니다.
해당 오류는 10월 18일부터 발견했습니다.
xbrl 추출 시 BadZipFile 오류, 또는 추출된 xbrl 파일이 없다고 뜹니다.
대상 보고서는 전부 사업보고서, 반기보고서, 분기보고서를 기준으로 했습니다.

# python 3.10
# dart-fss 0.4.10

import dart_fss
from zipfile import BadZipFile

dartfss_result = dart_fss.filings.search(corp_code=corp_code, bgn_de=bgn_de, end_de=end_de, pblntf_detail_ty=pblntf_detail_ty)

for report in dartfss_result:
    try:
        xbrl = report.xbrl

    except BadZipFile as e:
        logger.warning(f"msg:no xbrl on the report, err:{e}, params:{params}")  # 1번 오류
        continue

    if not xbrl:
        logger.warning(f'msg:no xbrl on the report, params:{params}')  # 2번 오류
        continue

예시 오류 로그는 다음과 같습니다.

# 1번 오류
msg:no xbrl on the report, err:File is not a zip file, params:{'corp_code': '00411048', 'pblntf_detail_ty': 'A003', 'bgn_de': '20241113', 'end_de': '20241115', 'report_type': '11014', 'rcp_no': '20241113000127'}
msg:no xbrl on the report, err:File is not a zip file, params:{'corp_code': '00167004', 'pblntf_detail_ty': 'A003', 'bgn_de': '20241113', 'end_de': '20241115', 'report_type': '11014', 'rcp_no': '20241113000124'}
# 2번 오류
msg:no xbrl on the report, params:{'corp_code': '00373650', 'pblntf_detail_ty': 'A003', 'bgn_de': '20241113', 'end_de': '20241115', 'report_type': '11014', 'rcp_no': '20241113000120'}
msg:no xbrl on the report, params:{'corp_code': '01324165', 'pblntf_detail_ty': 'A003', 'bgn_de': '20241113', 'end_de': '20241115', 'report_type': '11014', 'rcp_no': '20241113000111'}

특히 'bgn_de': '20241113', 'end_de': '20241115' 로 수집을 시도한 보고서 2476 건 중에서는 2468 건의 보고서에서 위와 같은 오류가 나타났습니다.

2. 부호가 바뀐 채 수집되는 재무 데이터 존재

일부 데이터에서 원본 보고서와 부호가 반대로 수집되는 데이터들이 확인됐습니다.
하나의 보고서 내에서 모든 데이터가 그런 게 아니라, 일부분만 그런 것으로 보입니다.
재무제표 조회 후 dataframe으로 변경한 뒤 확인한 사항이며, 예시 보고서는 아래와 같습니다.

감사합니다.

@josw123
Copy link
Owner

josw123 commented Nov 18, 2024

안녕하세요.
버그리포트 감사합니다.

첫번째 오류의 경우 제가 동일한 코드로 테스트를 진행해 보았으나, 재현이 불가능하여 추가적인 정보가 필요합니다.
사용환경이나 추가적인 오류 코드등을 올려주시면 감사하겠습니다.

  1. 부호 반대의 문제의 경우 제가 ESR켄달스퀘어리츠 제출한 xbrl 파일을 뜯어보았으나 XBRL 파일 내부에 부호가 +로 처리되어 있어 추가적인 확인이 필요하것 같습니다. 확인 후 추가적인 답변드리도록 하겠습니다.

@ym1018
Copy link
Author

ym1018 commented Nov 21, 2024

추가로 확인한 내용 공유 드립니다.

위에서 보고 드린 'File is not a zip file' 오류가 뜬 보고서들에 대해 어제 수집을 재시도 해봤고,
2000개 이상의 보고서에 대해 재무 데이터 수집이 성공한 것을 보아
dart 쪽에서 xbrl 데이터를 늦게 제공한 건 아닐까 추측하고 있습니다.

구체적인 수집 재시도 사항은 참고 용으로 공유합니다.

  • python 3.10 / dart-fss 0.4.10
  • bgn_de: 20241017 / end_de: 20241121
  • 접수 일자 기준, 2024-10-17 ~ 2024-11-20 동안 접수된 보고서 3154 건에 대해 수집 시도
    • 1분기/반기/3분기/사업 보고서 한정
  • 수집 성공 보고서 2928 건
  • 수집 실패 보고서 226 건
    • 13 건은 'File is not a zip file' 오류 보고, 며칠 뒤 다시 수집해야 수집될 것으로 추측
    • 나머지 213 건은 아래 코드 참고
import dart_fss
from zipfile import BadZipFile

bgn_de = '20241017'
end_de = '20241121'

set_xbrl_api_key(...)  # 개인적으로 구현한, dart api 키 설정 함수입니다

params_list = [
    {'corp_code': '01381799', 'pblntf_detail_ty': 'A003', 'bgn_de': '20241017', 'end_de': '20241121', 'report_type': '11014', 'rcp_no': '20241114000167'},
    {'corp_code': '01714997', 'pblntf_detail_ty': 'A001', 'bgn_de': '20241017', 'end_de': '20241121', 'report_type': '11011', 'rcp_no': '20241118000337'},
    {'corp_code': '00145598', 'pblntf_detail_ty': 'A003', 'bgn_de': '20241017', 'end_de': '20241121', 'report_type': '11014', 'rcp_no': '20241118000196'},
    {'corp_code': '00762377', 'pblntf_detail_ty': 'A001', 'bgn_de': '20241017', 'end_de': '20241121', 'report_type': '11011', 'rcp_no': '20241119000067'},
    {'corp_code': '00121543', 'pblntf_detail_ty': 'A003', 'bgn_de': '20241017', 'end_de': '20241121', 'report_type': '11014', 'rcp_no': '20241119000117'}
]

for params in params_list:
    try:
        dartfss_result = dart_fss.filings.search(corp_code=params['corp_code'], bgn_de=params['bgn_de'], end_de=params['end_de'], pblntf_detail_ty=params['pblntf_detail_ty'])
    except Exception as e:
        print(f"fetch data error")
        continue
        
    if len(dartfss_result) == 0:
        continue

    # xbrl 입력 인자 형태상, 조회 결과에 보고서 여러 개가 들어 있을 수 있음
    # 현재 조회 대상 보고서에 대한 데이터만 추출
    for report in dartfss_result:
        if report.rcept_no == params['rcp_no']:
            financial_list.append(report)

    for fstmt in financial_list:
        try:
            xbrl = fstmt.xbrl
        except BadZipFile as e:
            print(f"file is not a zip file - {e}: {params}")  # 수집 실패한 13 건에 대한 로그
            continue
        except Exception as e:
            print(f"fail to get xbrl")
            continue

        if not xbrl:
            print(f'no xbrl on the report: {params}')  # 수집 실패한 213 건에 대한 로그
            continue

케이스가 더 필요하시다면 params 에 쓰인 보고서들 추가로 알려드리곘습니다.
dart 사이트에서 실제 보고서를 확인하면 재무정보 데이터도 있고, xbrl 뷰어도 제공되고 있는데
213건의 수집 실패 케이스는 앞으로 재수집을 시도하더라도 xbrl이 수집될 수 없는 것인지 궁금합니다.

감사합니다.

@josw123
Copy link
Owner

josw123 commented Nov 21, 2024

안녕하세요.

올려주신 코드를 테스트해본 결과 XBRL 뷰어는 존재하고, XBRL ZIP 파일도 다운받을 수 있으나,
OPENDART API에서 제공하는 XBRL 다운로드 API에서 파일이 없다고 하는 경우가 있는것 같습니다.

image

dart-fss 에서는 기본적으로 OPENDART에서 제공하는 XBRL 다운로드 API를 이용하여 XBRL 데이터를 요청하고 있습니다.
만약 API에서 오류가 발생하는 추가적인 첨부파일 검색을 진행하게 되는데 기존과는 다르게 아래와 같이 XBRL 미리보기 파일이 첨부되어 이로 인해 XBRL ZIP 파일이 아닌 html 파일을 압축해제 하려고 하여 오류가 발생하는것으로 생각됩니다.

{'attached_files': [{'filename': '[신한글로벌액티브리츠]사업보고서_XBRL(미리보기)(2024.11.18).html'}],
 'xbrlviewer': [{'filename': '[신한글로벌액티브위탁관리부동산투자회사]사업보고서_IFRS(원문XBRL)(2024.11.18).zip'}]}

관련 문제는 다음버전에서 수정할 예정이며,
필요하신 경우 dart_fss/filings/reports.py 파일의 425 라인을 아래와 같이 수정하셔서 일단 사용하시면 되겠습니다.

 def _get_xbrl(self):
        """ XBRL 첨부파일 검색"""
        query = {
            'includes': 'IFRS OR XBRL AND zip', #기존  'includes':  'IFRS OR XBRL'
            'scope': ['attached_files', 'xbrlviewer']
        }
        attached_files = self.find_all(**query)
        if len(attached_files['attached_files']) > 0:
            return attached_files['attached_files'][0]
        elif len(attached_files['xbrlviewer']) > 0:
            return attached_files['xbrlviewer'][0]
        return None

@ym1018
Copy link
Author

ym1018 commented Nov 26, 2024

내용 확인했습니다. 답변 감사합니다.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants