Skip to content

Latest commit

 

History

History
584 lines (436 loc) · 29.1 KB

File metadata and controls

584 lines (436 loc) · 29.1 KB

Analysis

상위 사상: philosophy.md · 자가개선 루프: coreloop.md

주체: analysis 엔진 (L2) · AI (엔진 결과 소비자). 현재: 22 축 5 그룹 (financial 14 · valuation 1 · governance 3 · forecast 2 · macro 2) · 6 막 인과 구조 · 스토리 템플릿 7 종. 방향: 템플릿 자동 감지 정밀도 · audit 피드백 루프 강화 · override 키 자동 생성.

회사는 스토리가 있다. 재무제표를 그 스토리의 구조화된 데이터로 변환한다. 숫자의 나열이 아니라, 인과로 연결된 서사가 분석의 목표다. 각 섹션은 "이렇게 한다" 명제로 열고, 반복된 실수는 섹션 하단 "반복 실패" 에 정리한다.


1. 호출 계약 — 5 엔진 통일 패턴으로 간다

import dartlab
c = dartlab.Company("005930")

# 1. 무인자 → 가이드 DataFrame (axis | label | description | example | group | 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/industry) 도 동일 패턴: 무인자 → 가이드, "축이름" → 분석.

노트북

marimo Colab

항목 내용
레이어 L2
진입점 c.analysis(), c.analysis("financial", "수익성"), c.analysis("수익성")
소비 Company(finance, docs, report), gather(price, macro)
생산 story, ai 가 analysis 결과를 소비
재무분석 + forecast + valuation, 6 막 인과 구조

Company → Analysis → Story → AI 순서로 계층이 쌓인다. analysis 품질이 올라가면 story 와 AI 품질이 동시에 올라간다.


2. 엔진 독립 규칙 — L2 상호 import 하지 않는다

  • analysis ↛ credit, credit ↛ analysis — 같은 L2 지만 상호 import 금지.
  • macro ↛ analysis, analysis ↛ macro — 같은 L2 지만 상호 import 금지. 시장 레벨 매크로 해석은 dartlab.macro() 엔진이 담당 (→ ops/macro.md).
  • 각 엔진이 데이터 필요하면 Company/core(L0/L1) 에서 직접 가져온다.
  • story 가 조합한다. story 에서 analysis 블록과 credit 블록을 성격별로 블록식으로 조합하여 보고서를 구성한다.
  • import 방향: Company(L0/L1) → analysis(L2), Company(L0/L1) → credit(L2), gather(L1) → macro(L2).

반복 실패 — analysis 에서 macro 또는 credit 을 import 하려는 시도. 공통 연산은 core/(L0) 로 올려서 공유, L2 상호 import 금지.


3. 6 막 인과 — 스토리 구조로 재무제표를 읽는다

story 보고서는 이 6 막 순서를 따른다. 앞 막이 뒷 막의 원인. 6 개 프레임워크(Damodaran/McKinsey/Buffett/Lynch/애널리스트/HBS) 조사 결과의 공통 구조.

6 막

제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이므로 재투자가 가치 창출"

이 연결은 story/narrative.pybuildActTransition() 이 자동 생성.

왜 스토리인가

비율 대시보드는 숫자를 보여주지만 "왜"를 말하지 않는다. 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 전체 방법론

4. 스토리 템플릿 — 기업 유형별 7 종으로 분기한다

모든 기업에는 고유한 스토리가 있다. 모든 기업을 같은 방식으로 분석할 수 없다.

  • analysis 는 도구다 — calc 함수는 재무제표에서 숫자를 뽑는 도구.
  • story 는 스토리를 조합한다 — 기업의 스토리에 맞는 도구를 골라서 조립.
  • 같은 도구라도 기업에 따라 순서, 강조, 해석이 달라야 한다.

템플릿 체계

기업의 스토리 유형에 따라 story 가 다른 템플릿을 적용한다. 템플릿은 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 으로 검증 — 최소 3 개 기업.
  • 검증 없이 템플릿을 만들지 않는다.
  • "좋아 보이니까" 추가하지 않는다. "실제로 분석력이 올라가는가?" 를 audit 으로 확인 후 반영.
  • 실효성 없는 함수는 제거한다. 학술적으로 맞지만 실무 임팩트가 불분명한 것은 audit 판단 후 유지/제거.
  • 6 막 구조, 막 전환 문장, ROIC Tree 등 변경 시 삼성전자 + 대우건설 + 1 개 이상에서 검증.

반복 실패 — 템플릿 검증 없이 "좋아 보이니까" 추가 / 단일 기업에서만 검증 후 배치. 최소 3 개 기업 audit 게이트 확정.


5. 단일 진입점 + 두 소비자

  • dartlab.analysis() / c.analysis() 하나로 모든 축에 접근한다.
  • analysis() 가 가이드하고 라우팅 — 개별 calc 함수는 내부 구현.
  • insight 는 등급 카드(보조 요약) — analysis 와 역할이 다르다.

analysis 는 두 소비자를 모두 최고로 지원한다:

소비자 사용 방식 기대
story(L3) buildBlocks() 에서 calc 호출 → Block 변환 블록화 가능한 dict. 보고서 배치용
AI(L4) c.analysis("수익성") 직접 호출 AI 가 주체자. 결과를 의심하고 원본으로 검증. override 재계산
  • story 는 calc 결과를 블록으로 배치한다 (해석 안 함).
  • AI 는 calc 결과를 의심하고, 원본(c.show) 으로 검증하고, overrides 로 재계산한다.
  • 엔진은 양쪽 모두에게 최고의 재료를 제공한다 — 투명한 dict 반환.

6. 축 체계 — 22 축 5 그룹

신용평가는 독립 엔진 c.credit() — analysis 축이 아님. 상세: ops/credit.md.

5 그룹: financial(14 축), valuation(1 축), governance(3 축), forecast(2 축), macro(2 축) = 총 22 축.

financial 그룹 (14 축)

Part 설명 calc 수 calc 파일
1-1 수익구조 매출 구성 8 revenue.py
1-2 자금조달 자금 출처 9 capital.py
1-3 자산구조 자산 구성 4 asset.py
1-4 현금흐름 현금 흐름 4 cashflow.py
2-1 수익성 이익률 6 profitability.py
2-2 성장성 성장률 5 growthAnalysis.py
2-3 안정성 재무건전성 6 stability.py
2-4 효율성 자산 효율 2 efficiency.py
2-5 종합평가 재무건강 3 scorecard.py
3-1 이익품질 발생액/현금 7 earningsQuality.py
3-2 비용구조 비용 행태 5 costStructure.py
3-3 자본배분 현금 배분 7 capitalAllocation.py
3-4 투자효율 투자 가치 5 investmentAnalysis.py
3-5 재무정합성 재무제표 일치 6 crossStatement.py + taxAnalysis.py

valuation 그룹 (1 축)

Part 설명 calc 수 calc 파일
4-1 가치평가 적정 가치 14 valuation.py + lifeCycle.py + consistency.py + storyValidation.py

대표 calc: calcDcf, calcDdm, calcRelativeValuation, calcResidualIncome, calcPriceTarget, calcReverseImplied, calcSensitivity, calcValuationSynthesis, calcLifeCycle, calcCashFlowConsistency, calcStoryPrecedents, calcPlausibilityBand, calcValuationSins.

governance 그룹 (3 축)

Part 설명 calc 수 calc 파일
5-1 지배구조 주인과 감시 8 governance.py
5-2 공시변화 공시 변동 감지 4 disclosureDelta.py
5-3 비교분석 시장 내 위치 3 peerBenchmark.py

forecast 그룹 (2 축)

Part 설명 calc 수 calc 파일
6-1 매출전망 매출 예측 8 forecastCalcs.py
6-2 예측신호 실적 방향 신호 15 predictionSignals.py

macro 그룹 (2 축) — Company-bound 매크로 연결

기업에 종속된 매크로 분석. 시장 레벨 매크로 해석(사이클, 자산신호)은 독립 macro 엔진(dartlab.macro()) 으로 이동. → ops/macro.md.

Part 설명 calc 파일
6-2 매크로민감도 외생변수 6 축 회귀 + 매출 방향 macroExposure.py
6-4 밸류에이션밴드 PER/PBR 정규분포 밴드 현재 위치 macroExposure.py

바텀업 경로: Company → exogenousAxes → 매출 × 외생변수 회귀 → 현재 매크로에서 이 기업 방향.


7. DART/EDGAR 통합 — 양쪽에서 동일하게 동작한다

통화 분기

  • company.currency 에서 KRW/USD 자동 감지.
  • analysis 금액 포맷: KRW → 조/억, USD → $B/$M.
  • contextvars 기반 — 스레드 안전, 자동 복원.

계정 브릿지

  • _bridgeKoreanSnakeId(): c.select("IS", ["매출액"]) → EDGAR 에서 sales row 반환.
  • toDict(): EDGAR snakeId 키를 한국어 키로 변환 → data.get("매출액") DART/EDGAR 양쪽 동작.
  • analysis calc 함수 내부에서 한국어 계정명 사용 → EDGAR 에서도 자동 변환.

EDGAR 지원 현황 (실측 검증 2026-04-04)

영역 지원 비고
financial 전축 대부분 동일 일부 축에 DART report 전용 서브키 None (허용)
forecast (매출 방향) 업종 매핑은 KR 특화 (US fallback 있음)
valuation (DCF/DDM) Yahoo price 연동
notes enrichment XBRL 수치 태그 기반

EDGAR 허용된 None (SEC 구조 한계)

None 서브키 원인
수익구조 segment 4 개 DART docs productService 전용
비용구조 rawMaterialBreakdown DART report rawMaterial 전용
자본배분 treasuryStockStatus DART report treasuryStock 전용
투자효율 investmentInOther DART report investedCompany 전용
지배구조 legalEventRisk 전체 DART docs sanction + contingentLiability 섹션 전용
지배구조 relatedPartyIntensity 전체 DART docs relatedPartyTx 섹션 전용
지배구조 ceoTurnover 전체 DART docs executive 섹션 전용

이 4 건은 SEC 공시 구조의 근본적 차이. 상세: ops/edgar.md "구조적 한계" 섹션.


8. 6 대 설계 규칙

  1. 각 calc 함수는 독립적 — 다른 calc 함수를 호출하지 않는다.
  2. 각 단계는 자기 범위만 담당 — 단계 간 의존 없음.
  3. 속도가 생명 — 외부 API 호출 최소화.
  4. 시계열 테이블 필수 — 최소 5 개 기간.
  5. basePeriod 기준점 — 모든 calc 에 basePeriod 파라미터.
  6. 기본 도구 = select() — finance(IS/BS/CF) + docs + report 동일 패턴.

품질 게이트

  • calc 함수는 3 개 섹터 이상에서 검증 후 배치.
  • fallback 이 가치 없으면 제거 (None 반환이 나음).
  • 금융업(은행/증권/보험) IS/BS 구조 미지원 — 장기 과제.

반복 실패 — calc 함수가 다른 calc 함수를 호출 → 단계 간 의존 발생. 독립성 유지로 병렬/선택 실행 가능.


9. 재무제표 극한 활용 (갭 매트릭스)

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 — 즉시 (데이터 있음, 나누기만 추가):

  1. Penman RNOA + FLEV/SPREAD → profitability.py.
  2. Richardson 3 계층 발생액 → earningsQuality.py.
  3. 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.

10. forecast — 모멘텀 + 업종별 베이즈로 매출 방향을 예측한다

모든 것은 예측 가능하다. 매출, 이익, 현금흐름, 배당 — 완벽한 정확도는 불가능하지만 방향과 범위는 추정할 수 있다. 예측하지 않으면 가치평가도 없고, 투자 판단도 없다. forecast 엔진은 이 전제에서 출발한다.

현재 구현: 매출 방향 예측 (72~78% 정확도). 향후 확장: 이익 예측, 현금흐름 예측, 배당 예측.

매출 방향 예측엔진 (calcRevenueDirection)

방법론: 모멘텀 + 업종별 베이즈 사후확률 갱신.

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 유료).

외생변수 6 축 (OLS 확인용)

지표 예시
원자재 가격 구리, 알루미늄, 유가, 금속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 약함 제외

valuation (가치평가)

  • DCF, DDM, 상대가치.
  • CAPM WACC, DPS, PEG, NAV, Forward PBR, Normalized DCF.

예측에서 영구 제외된 것

항목 이유
소셜미디어 감성 47.6% = 랜덤 이하
GDP beta 개별 기업에 무효 (Fed 2024)
주가내재 역산 순환논리

반복 실패 — 단일 ML 모델로 정확도 올리려 함. 모멘텀 72% 천장을 ML 구조로는 못 뚫는다. 새 데이터 추가가 유일한 경로.


11. Spec + Audit — 학습 체계로 운영한다

Spec 체계

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 학습 체계

audit 파일(data/dart/auditAnalysis/{종목코드}.md) 은 반드시 아래 3 섹션 구조를 따른다:

  1. story 전문: c.story().toMarkdown() 출력을 그대로 붙인다. 편집하지 않는다.
  2. AI 분석: story 를 읽고 분석가 관점으로 직접 해석. 핵심 스토리, 수치 교차검증, 업종 맥락, 독자 관점의 시사점.
  3. 엔진 개선 사항: 치명/보완/표현 분류. 숫자 오류, null 누락, 왜곡된 지표 등.

audit 의 목적이 확장된다:

  1. 기존: 엔진 오류 찾기 (오탐 수정).
  2. 추가: 기업의 스토리 발견 → 어떤 템플릿이 맞는지 판단.
  3. 추가: 템플릿 개선 → audit 에서 발견한 패턴으로 템플릿 보강.
  4. 추가: 인과 연결 검증 → 막 전환 문장이 실제 데이터와 맞는지.

audit 파일 구조도 확장:

1. story 전문: c.story().toMarkdown() 그대로
2. AI 분석: 이 기업의 스토리는 무엇인가. 어떤 템플릿이 맞는가.
3. 엔진 개선: 이 스토리를 더 잘 전달하려면 뭐가 빠졌는가.
4. 템플릿 피드백: 현재 템플릿이 이 기업에 맞는가. 뭘 바꿔야 하는가.

반복 실패[OK] 찍고 "양호" 만 쓰는 것 / story 전문 없이 요약만 쓰기. 둘 다 audit 아님. 3 섹션 구조 따르지 않은 파일은 재작성.


12. 데이터 매핑 + SSOT 헬퍼

데이터 매핑

  • accountMappings.json 등 매핑 변경은 실험 검증 후 반영한다.
  • total_equity = EquityAttributableToOwnersOfParent, equity_including_nci = Equity.

SSOT 헬퍼 (분기 합성 + alias 머지)

calc 함수는 두 개의 단일 진실의 원천 헬퍼를 통해 finance 데이터를 정제한다:

  • core/finance/flow.py::synthesizeAnnualFromQuarters — 분기에서 연간 값 합성. IS/CIS/CF (flow) 는 4 분기 strict 합, BS (stock) 는 Q4 alias. toDict / toDictBySnakeId / _financeToDataFrame 모두가 위임.
  • core/finance/labels.py::mergeAliasRowsSNAKEID_ALIASES 양방향 row 머지. pivot DataFrame 단계와 calc dict 단계 모두 단일 함수 호출.

calc 가 c.select("IS", [...])toDictBySnakeId(result) 로 변환하면 두 헬퍼가 자동 적용되어 data["sales"]["2024"] 처럼 한국어/snakeId/연간 키 어느 것으로도 접근 가능하다.


13. 관련 코드

경로 역할
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 개 지표 업종 매핑

요약 — 명제 11 줄

  1. 호출은 c.analysis() 단일 진입점. 5 엔진 통일 패턴 (가이드 / 그룹+축 / 단축형).
  2. L2 엔진 상호 import 금지 (analysis ↔ credit ↔ macro). 공통은 core/, 조합은 story.
  3. 6 막 인과 구조 — 사업이해 → 수익성 → 현금 → 안정성 → 자본배분 → 전망. 앞 막이 뒷 막의 원인.
  4. 스토리 템플릿 7 종 (사이클/프랜차이즈/턴어라운드/성장/자본집약/지주/현금부자). 하나의 기업이 복수 가능.
  5. 22 축 5 그룹 — financial 14 + valuation 1 + governance 3 + forecast 2 + macro 2.
  6. 두 소비자 — story(블록 배치) + AI(의심·검증·override 재계산). calc 는 투명한 dict.
  7. calc 독립성 원칙 — 다른 calc 호출 금지, 시계열 최소 5 기간, basePeriod 필수, select() 기본 도구.
  8. DART/EDGAR 양쪽 동일 동작, 통화 분기 + 계정 브릿지. SEC 구조 한계 영역은 None 허용.
  9. forecast = 모멘텀 + 업종별 베이즈 (72~78% 방향 정확도), 연속 확률. GDP/감성/내재역산은 영구 제외.
  10. SSOT 헬퍼 — synthesizeAnnualFromQuarters + mergeAliasRows 로 한국어/snakeId/연간 키 통합.
  11. audit 파일은 story 전문 + AI 분석 + 엔진 개선 3 섹션 필수. 템플릿 변경은 3 개 기업 검증 후.