정정공시가 나오면 재무데이터는 어떻게 바꿔야 할까?

같은 사업연도와 보고서 이름으로 공시가 두 번 들어오면 최신 파일만 덮어쓰고 끝내기 쉽습니다. 하지만 정정 전 분석 결과가 왜 달라졌는지 설명하려면 원 공시와 정정공시를 모두 보존해야 합니다.

이 글의 핵심

  • 접수번호는 버전 식별자이므로 삭제하지 않습니다.
  • [기재정정]·[첨부정정]을 같은 수정으로 취급하지 않습니다.
  • 최신 정정본을 분석용 현재값으로 쓰되 원본 이력을 별도 보존합니다.
  • 숫자가 바뀌면 누적 분기와 파생 지표도 다시 계산합니다.
원 공시와 정정공시를 함께 보존하는 구조

보고서 이름만으로 덮어쓰면 안 됩니다

OpenDART 공시검색 응답에는 접수번호 rcept_no, 접수일 rcept_dt, 보고서명 report_nm이 들어 있습니다. 보고서명 앞의 정정 표기를 제거한 base_report_nm으로 같은 보고서 묶음을 만들고, 접수일과 접수번호 순서로 버전을 관리할 수 있습니다.

보존 열 역할
rcept_no 공시 버전을 구분하는 변경 불가능한 키
report_nm 정정 유형이 포함된 원래 보고서명
base_report_nm 정정 접두어를 뺀 비교용 이름
rcept_dt 공시가 시장에 알려진 시점
revision_order 같은 보고서 묶음 안의 순서
is_current 현재 분석에 사용할 최신 버전 여부

실행 코드

PYTHON
#!/usr/bin/env python3
"""정정공시를 구분해 원 공시와 함께 이력으로 보존한다."""

from __future__ import annotations

import os
import re

from dotenv import load_dotenv
import pandas as pd
import requests


ENDPOINT = "https://opendart.fss.or.kr/api/list.json"
CORRECTION_PREFIX = re.compile(r"^\[(기재정정|첨부정정|정정명령부과)\]")


def main() -> None:
    load_dotenv()
    api_key = os.getenv("DART_KEY")
    if not api_key:
        raise SystemExit(".env에 DART_KEY를 입력해야 합니다.")

    response = requests.get(
        ENDPOINT,
        params={
            "crtfc_key": api_key,
            "bgn_de": "20250901",
            "end_de": "20251031",
            "pblntf_ty": "A",
            "page_count": 100,
        },
        timeout=30,
    )
    payload = response.json()
    if response.status_code != 200 or payload.get("status") != "000":
        raise RuntimeError(f"OpenDART 조회 실패: {payload.get('status', response.status_code)}")

    rows = pd.DataFrame(payload["list"])
    rows["is_correction"] = rows["report_nm"].str.match(CORRECTION_PREFIX)
    rows["base_report_nm"] = rows["report_nm"].str.replace(CORRECTION_PREFIX, "", regex=True)
    rows = rows.sort_values(["corp_code", "base_report_nm", "rcept_dt", "rcept_no"])
    rows["revision_order"] = rows.groupby(["corp_code", "base_report_nm"]).cumcount() + 1
    print(rows.loc[rows["is_correction"], ["corp_name", "report_nm", "rcept_dt", "rcept_no"]].head(10).to_string(index=False))


if __name__ == "__main__":
    main()

검증 구간의 정기공시 검색에서는 현대건설의 2024년 사업보고서 등 실제 [기재정정] 보고서가 확인됐습니다. 이 코드는 정정본만 골라 버리는 것이 아니라 전체 응답에 기준 보고서명과 버전 순서를 추가합니다.

분석용 현재값과 감사용 이력을 나눕니다

현재 재무비율을 계산할 때는 가장 나중에 접수된 유효 정정본을 사용합니다. 반면 과거 시점 백테스트에서는 그 당시 공개돼 있던 버전만 사용해야 합니다. 최신 정정 숫자를 과거 전체에 소급하면 미래 정보를 사용한 결과가 됩니다.

정정공시가 항상 재무 숫자를 바꾸는 것도 아닙니다. 단순 문구, 첨부파일, 재무 항목 중 무엇이 바뀌었는지 공시 원문의 정정 전·후 표를 확인해야 합니다.

갱신 순서

  1. 새 접수번호를 원본 테이블에 추가합니다.
  2. 같은 회사·사업연도·보고서 묶음의 버전을 정렬합니다.
  3. 정정 내용과 재무 숫자의 변경 여부를 비교합니다.
  4. 현재값 테이블만 최신 유효 버전으로 교체합니다.
  5. 누적 분기, 비율, 백테스트 파생값을 다시 계산합니다.

OpenDART 공시검색 개발가이드를 기준으로 작성했습니다. 정정 여부는 접두어만으로 최종 판단하지 않고 공시 원문을 함께 확인해야 합니다.