DART/EDGAR 공시 collector 복구
결론
- Hermes memory에 없던 최근 공시 산출물을 새로 생성했다.
- 신규 collector:
/Users/ron/.hermes/workspace/scripts/pipeline/dart_edgar_disclosure_collector.py - 산출물:
- DART:
/Users/ron/.hermes/workspace/memory/dart/latest.json - EDGAR:
/Users/ron/.hermes/workspace/memory/edgar/latest.json - Hermes cron 등록 완료:
ocFUND-dart-edgar-disclosure-collector, 매 영업일 06:20 KST,enabled=true - Hermes cron 강제 실행 검증:
last_status=ok,last_error=null - 펀더멘탈 context/filter가 DART/EDGAR 산출물을 읽도록 확장했고, 리포트 본문
📊 공시/실적에 실제 공시가 들어간다.
1) 기존 collector/cron 조사
확인 결과:
- OpenClaw cron에는 DART 관련 기존 작업이 있었지만 모두 enabled=false였다.
- shipbuilding-excel-builder: DART 재무제표 + 수주공시 조선 엑셀 빌더
- financial-statement-collector: DART + yfinance 재무제표 수집
- shipbuilding-data-collector: 조선 DART 수주잔고 수집
- Hermes cron에는 DART/EDGAR 최근 24h 공시 collector가 없었다.
- Hermes memory에도 memory/dart/, memory/edgar/ 산출물이 없었다.
- DART API key는 Hermes 파일에는 없었고 /Users/ron/.openclaw/dart_api_key에 존재했다. 새 collector는 env, Hermes key, OpenClaw key 순으로 읽는다. 보고서에는 키 평문 미기재.
2) 신규 collector 구현
파일: /Users/ron/.hermes/workspace/scripts/pipeline/dart_edgar_disclosure_collector.py
핵심 라인:
- L33-L34: 산출물 경로 memory/dart, memory/edgar
- L37-L39: OpenDART list API / SEC submissions API endpoint
- L112-L180: DART 최근 공시 수집
- L228-L295: EDGAR watchlist 기반 최근 filing 수집
- L318-L319: latest.json + 날짜별 JSON 저장
동작:
- DART: opendart.fss.or.kr/api/list.json에서 오늘+이전 1일 기준, 상장사 분류 Y/K/N만 수집
- EDGAR: company_entities DB의 NASDAQ/NYSE/AMEX watchlist를 읽고 SEC submissions API 조회
- 외부 쓰기 없음, Telegram 발송 없음, DB 변경 없음
3) 수동 실행 검증
명령:
/usr/bin/python3 /Users/ron/.hermes/workspace/scripts/pipeline/dart_edgar_disclosure_collector.py --days 1 --dart-max-pages 8 --edgar-limit 30
결과:
- DART: status=ok, count=442
- EDGAR: status=ok, count=10
- 샘플:
- DART 신성이엔지 — 주식등의대량보유상황보고서(약식)
- DART 강원에너지 — 단일판매ㆍ공급계약체결(자율공시)
- EDGAR STNG 6-K
- EDGAR MRVL 8-K
Hermes cron 등록 후 강제 실행 결과:
{
"id": "ocFUND-dart-edgar-disclosure-collector",
"enabled": true,
"next_run_at": "2026-04-17T06:20:00+09:00",
"last_run_at": "2026-04-16T10:01:17.085205+09:00",
"last_status": "ok",
"last_error": null
}
최종 산출물 확인:
- /Users/ron/.hermes/workspace/memory/dart/latest.json: status=ok, count=458, size 152837
- /Users/ron/.hermes/workspace/memory/edgar/latest.json: status=ok, count=10, size 3714
4) Hermes cron 등록
백업:
- /Users/ron/.hermes/cron/jobs.json.bak-dart-edgar-20260416T100101
등록 항목:
- id: ocFUND-dart-edgar-disclosure-collector
- schedule: 20 6 * * 1-5 Asia/Seoul
- command: /usr/bin/python3 /Users/ron/.hermes/workspace/scripts/pipeline/dart_edgar_disclosure_collector.py --days 1
- cwd: /Users/ron/.hermes/workspace
- timeout: 900초
- enabled: true
jobs.json 위치:
- L1117-L1138에 등록됨.
5) 펀더멘탈 wrapper/context 확장
수정 파일 1: /Users/ron/.hermes/workspace/scripts/fundamental_context_filter.py
- L32-L33: DART/EDGAR latest 경로 추가
- L154-L180: DART 공시 선별 함수 추가
- L183-L205: EDGAR filing 선별 함수 추가
- L238-L249: context disclosures.dart_24h, disclosures.edgar_24h에 주입
- L256: DART/EDGAR 사용 여부 omission 갱신
수정 파일 2: /Users/ron/.hermes/workspace/scripts/fundamental_redesign_report.py
- L93-L99: 📊 공시/실적 섹션이 DART 4건 + EDGAR 3건 + 실적 일정 3건을 우선 반영
검증:
python3 -m py_compile \
/Users/ron/.hermes/workspace/scripts/pipeline/dart_edgar_disclosure_collector.py \
/Users/ron/.hermes/workspace/scripts/fundamental_context_filter.py \
/Users/ron/.hermes/workspace/scripts/fundamental_redesign_report.py
통과.
context 재생성 결과:
{
"dart_24h": [
"DART 강원에너지(114190) — 단일판매ㆍ공급계약체결(자율공시)",
"DART 대한조선(439260) — 단일판매ㆍ공급계약체결",
"DART 신세계푸드(031440) — 기재정정 주요사항보고서(주식교환ㆍ이전결정)"
],
"edgar_24h": [
"EDGAR MRVL 8-K — 8-K",
"EDGAR STNG 6-K — 6-K",
"EDGAR ASML 6-K — 6-K"
]
}
펀더멘탈 dry-run:
- ok=true
- body_len=2303
- blacklist_hits=[]
- 공시/실적 섹션에 DART/EDGAR 실제 공시 반영 확인.
본문 샘플:
📊 공시/실적
• DART 강원에너지(114190) — 단일판매ㆍ공급계약체결(자율공시)
• DART 대한조선(439260) — 단일판매ㆍ공급계약체결
• DART 신세계푸드(031440) — 기재정정 주요사항보고서(주식교환ㆍ이전결정)
• DART 아이티센피엔에스(232830) — 타법인주식및출자증권취득결정
• EDGAR MRVL 8-K — 8-K
• EDGAR STNG 6-K — 6-K
• EDGAR ASML 6-K — 6-K
• TSMC 어닝콜 (4/16 오늘 14:00 대만시간)
6) 변경 파일
- 신규:
/Users/ron/.hermes/workspace/scripts/pipeline/dart_edgar_disclosure_collector.py - 수정:
/Users/ron/.hermes/cron/jobs.json - 수정:
/Users/ron/.hermes/workspace/scripts/fundamental_context_filter.py - 수정:
/Users/ron/.hermes/workspace/scripts/fundamental_redesign_report.py - 생성/갱신:
/Users/ron/.hermes/workspace/memory/dart/latest.json - 생성/갱신:
/Users/ron/.hermes/workspace/memory/edgar/latest.json - 생성/갱신:
/Users/ron/.hermes/workspace/memory/analyst-fundamental/fundamental_redesign_context_latest.json
7) 잔존 리스크
- OpenDART list API는 시간 단위가 아니라 날짜 단위라 “정확히 최근 24시간”이 아니라 오늘+전일 접수 공시 기준이다.
- DART 전체 공시에는 임원 보유/대량보유 보고가 많아, 펀더멘탈 본문에서는 계약·실적·주요사항 중심으로 필터링했다.
- EDGAR는 Hermes
company_entities의 미국 watchlist 기반이다. 전체 SEC filing 전수 수집은 아니며, 해리가 보는 주요 기업 universe 확장이 필요하면company_entities확장이 선행되어야 한다. - SEC User-Agent는 전용 환경변수가 없으면 기본 collector UA를 사용한다. 장기 운영 안정성을 위해
SEC_USER_AGENT를 실제 연락처 형태로 설정하는 것이 좋다.
자체평가
- 정확성: 4.6/5 — 실제 API 수집, Hermes cron 실행, fundamental 주입까지 확인.
- 완성도: 4.5/5 — 신규 수집/cron/context/report 모두 연결. SEC universe 확장은 후속 과제.
- 검증: 4.7/5 — py_compile, 직접 실행, Hermes cron 강제 실행, 파일 생성, context dry-run 확인.
- 최소 변경: 4.6/5 — DART/EDGAR collector와 fundamental 공시 주입부만 수정.
- 종합: 4.6/5