이 스킬
Damodaran Peer Multiple 분해
EV/Sales, EV/EBIT, P/B 같은 상대가치 multiple을 성장·마진·ROC·리스크 driver로 분해해 DCF sanity check로만 쓰는 절차. 트리거 — 'peer multiple decomposition', '상대가치 분해', 'multiple sanity check'.
이어 가기
절차
실행 순서
- 1
multiple row는 단독 투자 결론이 아니라 driverLink를 가져야 한다.
예시
이런 질문이 들어오면 이 skill 을 쓴다
- 삼성전자 peer multiple decomposition
출력
기대 결과
- peer multiple? margin ? growth ? ROC ? risk driver? ??? ?
- peer universe ??? ? market coverage status
- multiple ?? ?? ?? ?? ??
공개 호출 방식
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()
try:
price_frame = dartlab.gather("price", target, market="US") if market == "US" else dartlab.gather("price", target)
except Exception:
price_frame = pl.DataFrame()
memo = buildDamodaranMemo(
target=target,
market=market,
currency=currency,
companyName=company_name,
statements={topic: _safeShow(topic) for topic in ("IS", "BS", "CF")},
countryDefaults=_loadReference("damodaranDefaults.json"),
industryDefaults=_loadReference("damodaranIndustryDefaults.json"),
marketData={},
)
table = list(memo["tables"]["peerMultipleDecomposition"])
try:
scan_frame = dartlab.scan("valuation") if market == "KR" else pl.DataFrame()
scan_status = "usable" if isinstance(scan_frame, pl.DataFrame) and scan_frame.height else "missing"
except Exception as exc:
scan_status = type(exc).__name__
table.append({"multiple": "dartlab.scan('valuation')", "companyValue": None, "driverLink": "peer primitive", "driverValue": scan_status, "status": scan_status})
emit_result(
table=table,
values=memo["headline"],
date=memo.get("asOf"),
units=memo["units"],
sources=memo["sources"],
) 호출 동작
1. 결론 도출
상대가치 multiple을 DCF driver별 sanity check로 분해한다.
2. 핵심 근거 수집
Company.show, dartlab.gather("price"), KR의 dartlab.scan("valuation"), Damodaran reference를 사용한다.
3. 메커니즘 분석
EV/Sales는 성장과 sales-to-capital, EV/EBIT는 마진, P/B는 ROC-WACC spread와 연결한다.
4. 반례·한계
US peer primitive가 없으면 peer universe는 partial로 남긴다.
5. 후속 모니터링
후속 스킬은 multipleNarrativeCheck 또는 scenarioFalsifier다.
대표 반환 형태
peerMultipleDecomposition : list[dict] — multiple, companyValue, driverLink, driverValue, status.
연계 절차
- recipes.fundamental.valuation.damodaran.relativeCheck - 회사 multiple 계산.
- recipes.fundamental.valuation.damodaran.storyToDrivers - multiple 차이를 driver로 해석.
- recipes.fundamental.valuation.damodaran.scenarioFalsifier - 가격 내재 스토리와 대조.
기본 검증
- multiple row는 단독 투자 결론이 아니라 driverLink를 가져야 한다.
런타임
실행 환경별 호환성
| 환경 | 상태 | 비고 / 제한 |
|---|---|---|
| Local Python | supported | — |
| Server | supported | — |
| MCP | unknown | — |
| Web AI | unknown | — |
| Pyodide | unknown | — |
실패 회피
흔한 실패 · 절대 금지
- peer 차이를 성장·마진·리스크로 분해하지 않음
- L2 valuation 또는 industry 엔진 호출 금지.
- multiple만으로 적정가 결론을 내리지 않는다.