회사는 스토리가 있다. 재무제표를 그 스토리의 구조화된 데이터로 변환한다. 숫자의 나열이 아니라, 인과로 연결된 서사가 분석의 목표다.
import dartlab
c = dartlab.Company("005930")
c.analysis() # 가이드 — 사용 가능한 분석 축
c.analysis("financial", "수익성") # 그룹 + 축
c.analysis("수익성") # 단축형 (그룹 자동 추론)| 항목 | 내용 |
|---|---|
| 레이어 | L2 |
| 진입점 | c.analysis(), c.analysis("financial", "수익성"), c.analysis("수익성") |
| 소비 | Company(finance, docs, report), gather(price, macro) |
| 생산 | review, ai가 analysis 결과를 소비 |
| 축 | 재무분석 + forecast + valuation, 6막 인과 구조 |
Company → Analysis → Review → AI 순서로 계층이 쌓인다. analysis 품질이 올라가면 review와 AI 품질이 동시에 올라간다.
c = dartlab.Company("005930")
# 1. 무인자 → 가이드 DataFrame (axis | label | description | example | partId | items)
print(c.analysis())
# 2. 그룹 + 축 (full 형태)
c.analysis("financial", "수익성")
c.analysis("forecast", "매출전망")
c.analysis("valuation", "가치평가")
# 3. 단축형 — 그룹 자동 추론
c.analysis("수익성") # → financial 그룹 자동
c.analysis("성장성") # → financial 자동
c.analysis("가치평가") # → valuation 자동다른 분석 엔진(macro/quant/credit/scan)도 동일 패턴: 무인자 → 가이드, "축이름" → 분석.
- analysis ↛ credit, credit ↛ analysis — 같은 L2지만 상호 import 금지
- macro ↛ analysis, analysis ↛ macro — 같은 L2지만 상호 import 금지. 시장 레벨 매크로 해석은
dartlab.macro()엔진이 담당 (→ ops/macro.md) - 각 엔진이 데이터 필요하면 Company/core(L0/L1)에서 직접 가져온다
- review가 조합한다. review에서 analysis 블록과 credit 블록을 성격별로 블록식으로 조합하여 보고서를 구성한다.
- import 방향: Company(L0/L1) → analysis(L2), Company(L0/L1) → credit(L2), gather(L1) → macro(L2).
review 보고서는 이 6막 순서를 따른다. 앞 막이 뒷 막의 원인. 6개 프레임워크(Damodaran/McKinsey/Buffett/Lynch/애널리스트/HBS) 조사 결과의 공통 구조.
제1막: "이 회사는 뭘 하는가" (사업 이해)
→ 한 문장 정의 + 매출 구성 + 시장 위치 + 성장 추세
→ Damodaran: "Every valuation starts with a story"
→ 축: 수익구조, 성장성
제2막: "얼마나 잘 하는가" (수익성 + 원천)
→ 마진 계단(매출총이익→영업이익→순이익) + ROIC Tree + 비용구조
→ McKinsey: "가치 창출은 ROIC와 Growth 두 축"
→ 인과: 1막의 사업 특성이 2막의 마진 수준을 결정
→ 축: 수익성, 비용구조
제3막: "현금이 실제로 도는가" (현금 전환)
→ OCF 분해(NI+감가상각+운전자본) + FCF + CCC + 이익품질
→ Buffett: "영업CF > 순이익이면 이익이 진짜"
→ 인과: 2막의 이익이 3막에서 현금으로 전환되는가?
→ 축: 현금흐름, 이익품질
제4막: "자본 구조는 안전한가" (안정성)
→ 부채/이자/유동성 + 1년 내 상환 부담
→ 인과: 3막의 FCF가 부채 상환을 감당할 수 있는가?
→ 축: 자금조달, 안정성, **신용평가**
제5막: "번 돈을 어떻게 쓰는가" (자본배분)
→ 배당/자사주/재투자 + ROIC vs WACC + 자산 효율
→ Buffett: "유보이익 $1당 시가총액 $1 이상 증가해야"
→ 인과: 4막의 안전한 자본 안에서 가치를 창출하는 배분인가?
→ 축: 자산구조, 효율성, 투자효율, 자본배분, 재무정합성, 종합평가
제6막: "앞으로 어떻게 될 것인가" (전망 + 가치)
→ 매출 예측 + DCF/상대가치 + 리스크 + 지배구조
→ Damodaran: narrative → numbers → value
→ 인과: 1~5막 전체가 6막의 가치 판단을 뒷받침
→ 축: 가치평가, 지배구조, 공시변화, 비교분석, 매출전망
| 연결 | 문장 예시 |
|---|---|
| 1막→2막 | "DX(51%)가 마진 21%의 주 원인" |
| 2막→3막 | "이익 19.6조 중 현금 28.8조 전환 (감가상각 21.5조 덕)" |
| 3막→4막 | "FCF 15조로 부채 상환 충분, 이자보상 88배" |
| 4막→5막 | "순현금이므로 배당 확대 여력 충분" |
| 5막→6막 | "ROIC > WACC이므로 재투자가 가치 창출" |
이 연결은 review/narrative.py의 buildActTransition()이 자동 생성.
비율 대시보드는 숫자를 보여주지만 "왜"를 말하지 않는다. ROE 12%가 좋은지 나쁜지는 그 회사의 사업 구조(1막), 마진 원천(2막), 현금 전환(3막)을 모르면 판단할 수 없다. 6막 구조는 이 맥락을 제공한다 — 각 막이 다음 막의 원인이므로, 어디서 문제가 시작됐는지 역추적할 수 있다. 분석이 스토리텔링이어야 하는 이유: 사람은 숫자가 아니라 이야기를 기억한다.
| 프레임워크 | 핵심 기여 | 6막 대응 |
|---|---|---|
| Damodaran | narrative → numbers → value | 전체 구조 |
| McKinsey | ROIC = Margin × Turnover, ROIC Tree | 2막 |
| Buffett/Munger | Moat 판별, OCF > NI | 2막+3막 |
| Peter Lynch | 종목 분류(성장/가치/턴어라운드), PEG | 1막+6막 |
| 애널리스트 | what → how well → why → forecast → value | 전체 흐름 |
| HBS 케이스 | Common-size → Trend → Ratio → DuPont → CF → Synthesis | 전체 방법론 |
모든 기업에는 고유한 스토리가 있다. 모든 기업을 같은 방식으로 분석할 수 없다.
- analysis는 도구다 — calc 함수는 재무제표에서 숫자를 뽑는 도구
- review는 스토리를 조합한다 — 기업의 스토리에 맞는 도구를 골라서 조립
- 같은 도구라도 기업에 따라 순서, 강조, 해석이 달라야 한다
기업의 스토리 유형에 따라 review가 다른 템플릿을 적용한다. 템플릿은 6막 구조를 기반으로 하되, 각 막에서 어떤 축을 강조하고 어떤 인과를 부각하는지가 달라진다.
| 템플릿 | 대표 기업 | 핵심 스토리 | 강조 축 |
|---|---|---|---|
| 사이클 | 삼성전자, SK하이닉스 | 업황 사이클이 전부 | 부문별 마진 변동, CAPEX 사이클, 재고 |
| 프랜차이즈 | BGF리테일, 코웨이 | 안정 수익 + 현금 기계 | 마진 안정성, OCF/NI, 배당 지속성 |
| 턴어라운드 | 현대건설, 두산에너빌 | 적자→흑자 전환 | 이자보상, 부채 추이, 영업이익 전환점 |
| 성장 | 삼양식품, 코스맥스 | 고성장 + 마진 확대 | 매출 CAGR, 마진 추세, ROIC Tree |
| 자본집약 | 대한항공, 한국전력 | 설비 의존 + 감가상각 | CAPEX/감가상각, 자산회전, FCF |
| 지주 | CJ, 한화, GS | 자회사 포트폴리오 | 지분법손익, 영업외 분해, 자본배분 |
| 현금부자 | 삼성전자(BS), 크래프톤 | 현금 쌓임 + 배분 이슈 | FLEV, 순현금, 배당성향, 자사주 |
기업 데이터에서 자동 판별:
- 사이클: 이익 변동계수 > 0.5 + 업종(반도체/화학/조선)
- 프랜차이즈: 마진 변동계수 < 0.1 + CCC 마이너스 또는 안정
- 턴어라운드: 최근 3년 내 적자→흑자 전환
- 성장: 매출 3Y CAGR > 15%
- 자본집약: 유형자산/총자산 > 40%
- 지주: 비영업자산 > 40% 또는 지분법손익/순이익 > 30%
- 현금부자: 순현금 + 현금/자산 > 20%
하나의 기업이 여러 템플릿에 해당할 수 있다 (예: 삼성전자 = 사이클 + 자본집약 + 현금부자).
audit의 목적이 확장된다:
- 기존: 엔진 오류 찾기 (오탐 수정)
- 추가: 기업의 스토리 발견 → 어떤 템플릿이 맞는지 판단
- 추가: 템플릿 개선 → audit에서 발견한 패턴으로 템플릿 보강
- 추가: 인과 연결 검증 → 막 전환 문장이 실제 데이터와 맞는지
audit 파일 구조도 확장:
1. review 전문: c.review().toMarkdown() 그대로
2. AI 분석: 이 기업의 스토리는 무엇인가. 어떤 템플릿이 맞는가.
3. 엔진 개선: 이 스토리를 더 잘 전달하려면 뭐가 빠졌는가.
4. 템플릿 피드백: 현재 템플릿이 이 기업에 맞는가. 뭘 바꿔야 하는가.
- 템플릿/체계 변경 시 반드시 실제 기업 audit으로 검증 — 최소 3개 기업
- 검증 없이 템플릿을 만들지 않는다
- "좋아 보이니까" 추가하지 않는다. "실제로 분석력이 올라가는가?"를 audit으로 확인 후 반영
- 실효성 없는 함수는 제거한다. 학술적으로 맞지만 실무 임팩트가 불분명한 것은 audit 판단 후 유지/제거
- 6막 구조, 막 전환 문장, ROIC Tree 등 변경 시 삼성전자 + 대우건설 + 1개 이상에서 검증
dartlab.analysis()/c.analysis()하나로 모든 축에 접근한다- analysis()가 가이드하고 라우팅 — 개별 calc 함수는 내부 구현
- insight는 등급 카드(보조 요약) — analysis와 역할이 다르다
신용평가는 독립 엔진
c.credit()— analysis 축이 아님. 상세:ops/credit.md
| Part | 축 | 설명 | 항목 | calc 파일 |
|---|---|---|---|---|
| 1-1 | 수익구조 | 매출 구성 | 8 | revenueStructure.py |
| 1-2 | 자금조달 | 자금 출처 | 9 | fundingStructure.py |
| 1-3 | 자산구조 | 자산 구성 | 4 | assetStructure.py |
| 1-4 | 현금흐름 | 현금 흐름 | 3 | cashFlowStructure.py |
| 2-1 | 수익성 | 이익률 | 4 | profitability.py |
| 2-2 | 성장성 | 성장률 | 3 | growthAnalysis.py |
| 2-3 | 안정성 | 재무건전성 | 4 | stability.py |
| 2-4 | 효율성 | 자산 효율 | 3 | efficiency.py |
| 2-5 | 종합평가 | 재무건강 | 3 | scorecard.py |
| 3-1 | 이익품질 | 발생액/현금 | 4 | earningsQuality.py |
| 3-2 | 비용구조 | 비용 행태 | 4 | costStructure.py |
| 3-3 | 자본배분 | 현금 배분 | 5 | capitalAllocation.py |
| 3-4 | 투자효율 | 투자 가치 | 4 | investmentEfficiency.py |
| 3-5 | 재무정합성 | 재무제표 일치 | 5 | financialConsistency.py |
기업에 종속된 매크로 분석. 시장 레벨 매크로 해석(사이클, 자산신호)은 독립 macro 엔진(dartlab.macro())으로 이동했다. → ops/macro.md
| Part | 축 | 설명 | calc 파일 |
|---|---|---|---|
| 6-2 | 매크로민감도 | 외생변수 6축 회귀 + 매출 방향 | macroExposure.py |
| 6-4 | 밸류에이션밴드 | PER/PBR 정규분포 밴드 현재 위치 | macroExposure.py |
바텀업 경로: Company → exogenousAxes → 매출 x 외생변수 회귀 → 현재 매크로에서 이 기업 방향
analysis는 DART/EDGAR 양쪽에서 동일하게 동작한다.
company.currency에서 KRW/USD 자동 감지- analysis 금액 포맷: KRW → 조/억, USD → $B/$M
contextvars기반 — 스레드 안전, 자동 복원
_bridgeKoreanSnakeId():c.select("IS", ["매출액"])→ EDGAR에서salesrow 반환toDict(): EDGAR snakeId 키를 한국어 키로 변환 →data.get("매출액")DART/EDGAR 양쪽 동작- analysis calc 함수 내부에서 한국어 계정명 사용 → EDGAR에서도 자동 변환
| 영역 | 지원 | 비고 |
|---|---|---|
| financial 전축 | ✅ 대부분 동일 | 일부 축에 DART report 전용 서브키 None (허용) |
| forecast (매출 방향) | ✅ | 업종 매핑은 KR 특화 (US fallback 있음) |
| valuation (DCF/DDM) | ✅ | Yahoo price 연동 |
| notes enrichment | ✅ | XBRL 수치 태그 기반 |
| 축 | None 서브키 | 원인 |
|---|---|---|
| 수익구조 | segment 4개 | DART docs productService 전용 |
| 비용구조 | rawMaterialBreakdown | DART report rawMaterial 전용 |
| 자본배분 | treasuryStockStatus | DART report treasuryStock 전용 |
| 투자효율 | investmentInOther | DART report investedCompany 전용 |
이 4건은 SEC 공시 구조의 근본적 차이. 상세: ops/edgar.md "구조적 한계" 섹션.
- 각 calc 함수는 독립적 — 다른 calc 함수를 호출하지 않는다
- 각 단계는 자기 범위만 담당 — 단계 간 의존 없음
- 속도가 생명 — 외부 API 호출 최소화
- 시계열 테이블 필수 — 최소 5개 기간
- basePeriod 기준점 — 모든 calc에 basePeriod 파라미터
- 기본 도구 = select() — finance(IS/BS/CF) + docs + report 동일 패턴
- calc 함수는 3개 섹터 이상에서 검증 후 배치
- fallback이 가치 없으면 제거 (None 반환이 나음)
- 금융업(은행/증권/보험) IS/BS 구조 미지원 — 장기 과제
9개 학술/실무 방법론 조사 결과. 현재 구현 수준과 빠진 것.
| 방법론 | 구현율 | 핵심 갭 |
|---|---|---|
| Penman Reformulated FS | 60% | RNOA, FLEV/SPREAD 분해 없음 |
| Richardson 발생액 3계층 | 30% | BS 기반 WCACC/LTOACC/FINACC 분리 없음 |
| Mohanram G-Score | 0% | 성장주 전용 스코어 부재 |
| DuPont 확장 | 50% | RNOA 기반 분해, 업종 조정 없음 |
| CF 품질 분석 | 40% | Core OCF 조정, Maintenance CAPEX 분리 없음 |
| BS 자산 재분류 | 70% | NFO, 이연법인세 분류, 초과현금 분리 없음 |
| SCE 활용 | 20% | OCI 분해, Dirty Surplus 없음 |
| 세그먼트 심화 | 50% | 부문별 마진/ROIC, SOTP 밸류에이션 없음 |
| 3표 교차 검증 | 50% | BS-CF 연결, Articulation Check 없음 |
| 영역 | 빠진 분석 | 데이터 위치 |
|---|---|---|
| IS | 판관비 하위 분해 (인건비/광고/R&D/임차료) | sections 주석 |
| IS | 영업외손익 분해 (이자/환차/지분법/처분) | IS finance_income/cost, 지분법손익 |
| IS | 매출원가 분해 (원재료/노무/경비) | sections 제조원가명세서 |
| CF | 영업CF 내부 분해 (비현금+운전자본 항목별) | CF 개별 조정항목 |
| CF | 투자CF 상세 (금융자산/관계기업 개별) | CF |
| BS | 부채 상세 (선수금/충당부채/리스부채 개별) | BS |
| BS | 자본 항목 분해 (자본금/잉여금/OCI 개별) | BS + SCE |
| 전체 | 계정별 CAGR 비교 (절대값 장기 추세) | IS/BS/CF 전체 |
| 전체 | BS-CF 정합성 (PPE/현금/자본 Articulation) | BS + CF |
Phase 1 — 즉시 (데이터 있음, 나누기만 추가):
- Penman RNOA + FLEV/SPREAD →
profitability.py - Richardson 3계층 발생액 →
earningsQuality.py - BS-CF Articulation Check →
crossStatement.py
Phase 2 — 재무제표 직접 읽기 (select()로 접근 가능):
4. 영업CF 내부 분해 → cashflow.py
5. 영업외손익 분해 → earningsQuality.py
6. 부채 상세 분해 → stability.py
7. 절대값 CAGR 비교 → growthAnalysis.py
Phase 3 — 데이터 확장 (sections 파싱 연동 필요): 8. 판관비/매출원가 하위 분해 9. SCE 기반 OCI 분해 10. 부문별 영업이익/마진 11. Mohanram G-Score
- Penman: Nissim & Penman (2001), Penman FSA&SV 5e
- Richardson: Richardson et al. (2005) — Accrual Reliability, Earnings Persistence
- Mohanram: Mohanram (2005) — G-Score for Growth Stocks
- Soliman: Soliman (2008) — Industry-Adjusted DuPont
- CF 품질: Mulford & Comiskey (2005) — Creative Cash Flow Reporting
모든 것은 예측 가능하다. 매출, 이익, 현금흐름, 배당 — 완벽한 정확도는 불가능하지만 방향과 범위는 추정할 수 있다. 예측하지 않으면 가치평가도 없고, 투자 판단도 없다. forecast 엔진은 이 전제에서 출발한다.
현재 구현: 매출 방향 예측 (72~78% 정확도). 향후 확장: 이익 예측, 현금흐름 예측, 배당 예측.
방법론: 모멘텀 + 업종별 베이즈 사후확률 갱신
1. 사전확률: 업종별 모멘텀 지속률 (40개 업종, 4800건+ 실측)
- 식품/유지: 88.6% (안정 성장, 모멘텀 매우 강)
- 철강/건설: 74~76% (경기 민감 사이클)
- 반도체: 66.5% (사이클 급변)
- 통신장비/영화: 59~61% (모멘텀 약)
- 미등록 업종: 72.1% (전체 평균 fallback)
2. 갱신1: 2연속 같은 방향 → 확률 상승
3. 갱신2: 영업이익률 수준에 따라 연속적 갱신 (마진 21%와 1%를 차등)
4. 갱신3: OLS 외생변수 일치/불일치 → 갱신
5. 감쇠: 신호 간 독립성 위반 보정 (damping=0.3)
6. 보정: 원시 확률을 실측 기반 재보정 (shrinkage=0.6)
→ probability: 0.0~1.0 연속 확률값 반환
핵심: confirms 이진 카운트 → 베이즈 연속 확률
- 이전: 마진 21%와 마진 0.5%를 같은 "marginAgree=True"로 처리
- 지금: 마진 21% → 강한 갱신(P↑), 마진 0.5% → 거의 갱신 없음
- 이전: 모든 기업 prior 72.1% 동일
- 지금: 식품 기업 prior 88.6%, 반도체 prior 66.5% — 업종 특성 반영
검증 수치 (walk-forward, 과적합 불가):
| 조건 | 정확도 | 관측치 | 커버리지 |
|---|---|---|---|
| 모멘텀 단독 | 72.1% | 4825건 | 100% |
| 2연속 모멘텀 | 74.7% | 360건 | 69% |
| 모멘텀+영업이익률 일치 | 76.1% | 3660건 | 76% |
| 모멘텀+OLS 일치 | 77.7% | 355건 | 68% |
확률 출력 예시:
| 기업 | 방향 | 확률 | 신뢰도 | streak | 마진 | OLS |
|---|---|---|---|---|---|---|
| 삼성전자 | up | 82.2% | very_high | 3 | 21% | 일치 |
| 현대제철 | down | 74.3% | high | 1 | 1% | 불일치 |
확률의 의미: 방향 정확도 자체를 올리지는 않는다 (72%는 72%). 하지만:
- AI가 "82% 확률로 매출 상승 예상"이라고 구체적으로 말할 수 있다
- P < 65%이면 "예측 불확실"로 명시 → 사용자가 추가 조사
- 기업 간 비교 시 확률 순위 정렬 가능
- 연속 값이라 임계값 조정으로 정밀도/재현율 트레이드오프 가능
학술 근거:
- 나이브 베이즈 + 감쇠: van Calster et al. (2021) — 소표본 과적합 방지
- M4/M5 Competition: 단순 방법 > 복잡한 ML (100,000 시계열)
- Sloan 1996: 이익 지속성 → 모멘텀의 이론적 기반
- PEAD: 실적 방향 지속 효과
시도했지만 효과 없던 것:
- Logistic Regression (+0.8%p) — 모델 구조 변경 무의미
- 한국 PPI 13개 추가 — 하락 (가격 < 생산량)
- 11신호 다수결 앙상블 (61%) — static 신호 = 상수 바이어스
- 후보 풀 확대 — 과적합 변수 선택
- 재고/매출 비율 — 전환점 예측에 1%p 차이 (무효)
- GDP — 영구 제외 (기업 매출의 직접 외생변수가 아님)
정확도를 올리려면 새 데이터가 필요:
- 네이버 데이터랩 검색량 (API 키 필요, B2C 20~30%)
- 관세청 품목별 수출 (API 키 필요, 수출 업종 40~50%)
- 컨센서스 리비전 시계열 (네이버 미제공, FnGuide 유료)
| 축 | 지표 예시 |
|---|---|
| 원자재 가격 | 구리, 알루미늄, 유가, 금속PPI, 밀, 면화 |
| 산업생산 | 반도체, 자동차, 화학, 식품, INDPRO, 배터리PPI |
| 실물수요 | 자동차판매, 내구재, 화물운송, 설비가동률, BSI |
| 금융조건 | 금리, 하이일드 스프레드, 회사채 |
| 내수경기 | IPI, 서비스업, BSI 내수/수출, 아파트가격 |
| 환율 | 원/달러, 원/엔, 원/위안 |
- 143개 업종 매핑, 95.5% 커버리지,
exogenousAxes.py - 적응형 변수 선택: 매핑 후보 + 범용 후보에서 상관도 상위 3개
productIndex.parquet: 2444종목 공시 제품 텍스트 (0.3MB)- OLS 단독은 62~66% 천장 — "확인자" 역할만 (독립 예측자 아님)
| 방향 | 결과 | 상태 |
|---|---|---|
| 횡단면 ML (Chen 2022) | 모멘텀+마진이 이미 76% → ML 추가 이득 불분명 | 장기 검토 |
| 관세청 수출입 HS코드 | API 키 필요 | 보류 |
| 공시 tone (키워드) | preview 200자 한계 | 보류 |
| Google Trends | 한국 점유율 낮음 | 제외 |
| 피어 선행 | Frankel 2025: spillover 약함 | 제외 |
- DCF, DDM, 상대가치
- CAPM WACC, DPS, PEG, NAV, Forward PBR, Normalized DCF
grading.py AREAS dict ← 로직 + 메타데이터 공존 (label, description, metrics, grade_fn)
↓
insight/spec.py ← AREAS에서 추출·가공
↓
ai/spec.py ← 각 엔진 spec 수집 (summary / detail depth)
↓
test_spec_integrity.py ← 누락/불일치 검증 (CI 강제)
audit 파일(data/dart/auditAnalysis/{종목코드}.md)은 반드시 아래 3섹션 구조를 따른다:
- review 전문:
c.review().toMarkdown()출력을 그대로 붙인다. 편집하지 않는다. - AI 분석: review를 읽고 분석가 관점으로 직접 해석. 핵심 스토리, 수치 교차검증, 업종 맥락, 내 관점.
- 엔진 개선 사항: 치명/보완/표현 분류. 숫자 오류, null 누락, 왜곡된 지표 등.
[OK]찍고 "양호" 쓰는 건 audit이 아니다- review 전문 없이 요약만 쓰는 것도 audit이 아니다
- 이 구조를 따르지 않은 파일은 재작성
- accountMappings.json 등 매핑 변경은 실험 검증 후 반영한다
- total_equity =
EquityAttributableToOwnersOfParent, equity_including_nci =Equity
| 항목 | 이유 |
|---|---|
| 소셜미디어 감성 | 47.6% = 랜덤 이하 |
| GDP beta | 개별 기업에 무효 (Fed 2024) |
| 주가내재 역산 | 순환논리 |
calc 함수는 두 개의 단일 진실의 원천 헬퍼를 통해 finance 데이터를 정제한다:
core/finance/flow.py::synthesizeAnnualFromQuarters— 분기에서 연간 값 합성. IS/CIS/CF (flow) 는 4분기 strict 합, BS (stock) 는 Q4 alias.toDict/toDictBySnakeId/_financeToDataFrame모두가 위임.core/finance/labels.py::mergeAliasRows—SNAKEID_ALIASES양방향 row 머지. pivot DataFrame 단계와 calc dict 단계 모두 단일 함수 호출.
calc 가 c.select("IS", [...]) → toDictBySnakeId(result) 로 변환하면 두 헬퍼가
자동 적용되어 data["sales"]["2024"] 처럼 한국어/snakeId/연간 키 어느 것으로도
접근 가능하다.
| 경로 | 역할 |
|---|---|
src/dartlab/analysis/financial/ |
재무분석 calc 함수 |
src/dartlab/analysis/financial/_helpers.py |
toDict / toDictBySnakeId (SSOT 위임 진입점) |
src/dartlab/core/finance/flow.py |
synthesizeAnnualFromQuarters SSOT |
src/dartlab/core/finance/labels.py |
mergeAliasRows + SNAKEID_ALIASES SSOT |
src/dartlab/analysis/financial/creditRating.py |
신용평가 6 calc (등급/eCR/시계열/플래그) |
src/dartlab/analysis/financial/insight/ |
grading + spec |
src/dartlab/analysis/financial/research/ |
리서치 (predictionSignals) |
src/dartlab/analysis/forecast/ |
simulation, 예측 |
src/dartlab/analysis/valuation/ |
DCF, DDM, 상대가치 |
src/dartlab/core/finance/creditScorecard.py |
20단계 등급 산출 순수 로직 |
src/dartlab/core/finance/sectorThresholds.py |
업종별 등급 기준표 (11개 대분류) |
src/dartlab/core/finance/chsModel.py |
CHS 하이브리드 부도확률 모델 |
src/dartlab/core/finance/exogenousAxes.py |
6축 28개 지표 업종 매핑 |