이 스킬
Damodaran 내러티브 맵
Company metadata, topics, 재무 패널, reference mapping을 엮어 사업 스토리를 성장·마진·리스크·모델 경로로 구조화하는 L1/L1.5 절차. 트리거 — 'Damodaran narrative map', '스토리 숫자 연결', '사업 내러티브 가치평가'.
이어 가기
절차
실행 순서
- 1
5개 고정 타깃에서 `tableRef`, `valueRef`, `sourceRef`를 남긴다.
- 2
L2/L3 호출 금지 정적 검사를 통과해야 한다.
예시
이런 질문이 들어오면 이 skill 을 쓴다
- 삼성전자 Damodaran 내러티브 맵
- AAPL 스토리를 성장과 마진 가정으로 연결
출력
기대 결과
- ?? narrative? growth ? margin ? reinvestment ? risk driver? ??? ?
- text evidence ?? ? fallback note
- story-to-driver ??? ?? narrative hypothesis
공개 호출 방식
import dartlab
import importlib.resources as resources
import json
import polars as pl
from dartlab.synth.damodaranL15 import buildDamodaranMemo
target = "005930"
c = dartlab.Company(target)
market = getattr(c, "market", "US" if not target.isdigit() else "KR")
currency = getattr(c, "currency", "USD" if market == "US" else "KRW")
company_name = getattr(c, "corpName", getattr(c, "companyName", target))
def _loadReference(name):
return json.loads(resources.files("dartlab.reference.data").joinpath(name).read_text(encoding="utf-8"))
def _safeShow(topic):
try:
table = c.show(topic, freq="Y")
except TypeError:
table = c.show(topic)
except Exception:
return pl.DataFrame()
return table if isinstance(table, pl.DataFrame) else pl.DataFrame()
def _latestPrice(frame):
if not isinstance(frame, pl.DataFrame) or frame.height == 0:
return {}
date_col = "date" if "date" in frame.columns else "Date" if "Date" in frame.columns else None
close_col = "close" if "close" in frame.columns else "Close" if "Close" in frame.columns else None
latest = frame.sort(date_col).tail(1).to_dicts()[0] if date_col else frame.tail(1).to_dicts()[0]
out = {}
if close_col and latest.get(close_col) is not None:
out["price"] = latest.get(close_col)
if date_col and latest.get(date_col) is not None:
out["priceDate"] = str(latest.get(date_col))
return out
def _marketData():
out = {}
try:
frame = dartlab.gather("price", target, market="US") if market == "US" else dartlab.gather("price", target)
out.update(_latestPrice(frame))
except Exception as exc:
out["priceError"] = type(exc).__name__
return out
country_defaults = _loadReference("damodaranDefaults.json")
industry_defaults = _loadReference("damodaranIndustryDefaults.json")
statements = {topic: _safeShow(topic) for topic in ("IS", "BS", "CF")}
memo = buildDamodaranMemo(
target=target,
market=market,
currency=currency,
companyName=company_name,
statements=statements,
countryDefaults=country_defaults,
industryDefaults=industry_defaults,
marketData=_marketData(),
)
emit_result(
table=memo["tables"]["narrativeMap"],
values=memo["headline"],
date=memo.get("asOf"),
units=memo["units"],
sources=memo["sources"],
) 호출 동작
1. 결론 도출
사업 정체성, 모델 경로, 성장 스토리, 수익성 스토리, 시장 리스크를 valuation driver로 연결한다.
2. 핵심 근거 수집
Company 기본 메타데이터, Company.show("IS"|"BS"|"CF"), dartlab.gather("price"), Damodaran reference를 사용한다.
3. 메커니즘 분석
내러티브는 문장이 아니라 driver map이다. 각 narrative 요소는 성장률, 마진, 자본효율, 리스크, 모델 경로 중 하나 이상으로 번역되어야 한다.
4. 반례·한계
사업 설명 topic alias가 없으면 재무 패널과 reference 기반의 낮은 confidence mapping으로 남긴다.
5. 후속 모니터링
후속 스킬은 storyToDrivers다.
대표 반환 형태
narrativeMap : list[dict] — narrativeElement, driver, value, status, source.
연계 절차
- recipes.fundamental.valuation.damodaran.dataAudit - 사용 가능한 L1/L1.5 근거 확인.
- recipes.fundamental.valuation.damodaran.businessModelFit - 모델 경로 확정.
- recipes.fundamental.valuation.damodaran.storyToDrivers - narrative를 수치 driver로 변환.
기본 검증
- 5개 고정 타깃에서
tableRef,valueRef,sourceRef를 남긴다. - L2/L3 호출 금지 정적 검사를 통과해야 한다.
런타임
실행 환경별 호환성
| 환경 | 상태 | 비고 / 제한 |
|---|---|---|
| Local Python | supported | — |
| Server | supported | — |
| MCP | unknown | — |
| Web AI | unknown | — |
| Pyodide | limited | — |
실패 회피
흔한 실패 · 절대 금지
- 사업 설명을 숫자 driver로 연결하지 않음
- 금융업 모델 경로를 일반 FCFF narrative로 처리
- L2/L3 story 또는 analysis 엔진 호출 금지.
- 텍스트 근거 없이 narrative를 확정하지 않는다.