open-dart
0.1.0OpenDART
금융감독원 전자공시시스템에서 읽는 한국 기업의 공시와 재무제표.
한국 단일 종목 리서치에는 가격 피드가 답할 수 없는 조건이 하나 있다: 어떤 사실이 언제 공개됐는가. opendart.fss.or.kr이 그 순간을 기록하는 곳이고, 이 소스는 그 엔드포인트를 읽지 않은 채 중계한다.
무엇을 주는가
| 서빙 | OpenDART 자신의 엔드포인트를 읽지 않고 중계 |
| 닿는 곳 | opendart.fss.or.kr |
| 충실도 | 공시된 그대로 |
| 범위 | KRX 상장사 및 DART 등록 법인의 공시와 XBRL 재무제표 |
| 비용 | 무료. FSS가 등록 시 API key를 발급하고 key 단위로 호출을 제한한다 |
| 엔드포인트 | 무엇에 답하나 |
|---|---|
/api/corpCode.xml | 고유번호 표 — 나머지 모든 호출이 필요로 하는 매핑 |
/api/company.json | 한 법인의 개황(종목코드·시장 포함) |
/api/list.json | 기간 내 공시 목록. 접수번호·접수일자·공시유형 |
/api/fnlttSinglAcntAll.json | 단일회사 전체 재무제표 |
/api/fnlttSinglAcnt.json | 같은 법인의 주요계정 |
시점은 결산기말이 아니라 접수다
fnlttSinglAcntAll은 사업연도와 보고서 코드로 답한다. 둘 다 공시일이 아니다. 매니저가 기준으로 삼아야 하는 것은 접수다 — rcept_no가 YYYYMMDD로 시작하고 rcept_dt가 그것을 되풀이하며, 이 소스가 돌려주는 모든 행이 그것을 들고 있다. 결산기말로 거른 백테스트는 다음 분기의 숫자를 지난 분기의 판단에 넣어 읽은 것이다.
한 분기를 서술하는 공시는 대개 여럿이다. 영업(잠정)실적은 분기 종료 며칠 뒤에 접수되고, 정기보고서(분기·반기·사업보고서)가 몇 주 뒤에 그것을 다시 쓰며, 정정이 그 뒤에 붙을 수 있다. 한 사건이 아니라 세 개의 접수이고, 그것을 가르는 것은 report_nm과 pblntf_ty다. 정기보고서 접수일을 발표일로 대신 쓰면 뉴스가 실제보다 늦게 일어난 것이 되고, 전략이 미래를 알았던 것처럼 보이는 오류가 바로 그것이다.
Aumos는 이 중 무엇도 적용하지 않는다. 벤더가 보낸 것을 그대로 중계하며, 접수 필드를 읽고 판단 시점 이후의 행을 버리는 것은 매니저의 몫이다.
무엇이 필요한가
<https://opendart.fss.or.kr>에서 무료로 발급하는 API key 하나. 설정 → 데이터 소스에 입력하면 Aumos가 시스템 키체인에 보관하고 매 요청의 crtfc_key 쿼리 파라미터로 붙인다. 매니저는 그 값을 볼 수 없고, 그 파라미터를 직접 지정할 수도 없다 — 시도하면 거절된다.
의존하기 전에 알아야 할 벤더의 성질 둘
**corpCode.xml은 ZIP으로 답한다.** Aumos는 보낸 그대로 중계하므로, 바이트를 풀 수 없는 매니저는 그것을 읽을 수 없다. 대안은 list.json이고, 그 행이 corp_code와 stock_code를 함께 들고 있다.
오류가 HTTP 200으로 온다. OpenDART는 자기 상태를 status 필드로 보고한다 — 000 성공, 013 데이터 없음, 020 호출 한도 초과, 100 파라미터 오류, 800/900 서비스 중단이나 잘못된 key. HTTP 상태만 보는 매니저는 한도 초과를 빈 결과로 읽는다. 아무것도 공시되지 않았다와 우리가 볼 수 없었다의 차이가 그것이다.
신선도
공시는 접수 시각에 list.json에 나타난다. fnlttSinglAcntAll의 XBRL 재무제표는 정기보고서를 따라오므로, 잠정실적만 발표된 분기에는 없다 — 응답 누락이 아니라 실제 공백이고, 매니저는 잠정 수치로 대체하지 않고 그렇게 기록해야 한다.