이 스킬
회사 P&L × 매크로 시나리오 grid → 적정가치 분포 (p25/50/75)
기존 base/bull/bear 3 path DCF 가 아니라 매크로 146 시나리오 (rate × FX × 사이클 × 침체) grid × 회사 elasticity → 146 P&L path → 146 fair value → 분포 (p25/p50/p75 + 현재가 대비 확률) 산출. 단일 점추정의 한계 보완. company ↔ macro ↔ analysis 격리 메우는 조합. 트리거 — '시나리오 적정가치 분포', 'fair value distribution', '146 시나리오 valuation'.
이어 가기
절차
실행 순서
- 1
c.analysis('growth') — base revenue forecast
- 2
c.analysis('macroSensitivity') — rate / FX elasticity 계수
- 3
macro('scenario', market='KR') — 146 시나리오 grid (rate × FX × cyclePhase × 침체)
- 4
c.analysis('valuationBand') — 적정 multiple band
- 5
c.panel('BS') — 기준 balance + 발행주식
- 6
elasticity 가 회사별 추정 vs 산업 평균 — 산업 평균 사용 시 회사 고유성 무시.
- 7
WACC (discount rate) 가 시나리오별 변동 — 일정 가정 시 분포 좁아짐 (보수적).
- 8
146 시나리오는 historical pattern 기반 — black swan 미커버.
- 9
multiple 기반 fair value — multiple regime shift 시 분포 위치 이동.
- 10
probAboveCurrent > 70% → `recipes.quant.qualityFactor` 로 quality cross-check.
- 11
distribution std-dev 큼 (sensitive) → `recipes.macro.qualityMacroBeta` 로 phase 정합 확인.
- 12
p25 < 현재가 < p50 → `recipes.macro.tailRiskScenarioScan` 으로 하방 시나리오 매칭.
예시
이런 질문이 들어오면 이 skill 을 쓴다
- 삼성전자 146 시나리오 fair value 분포
- 현대차 시나리오 적정가치 p25/p50/p75
공개 호출 방식
import dartlab
import polars as pl
target = "005930"
c = dartlab.Company(target)
def latest_period(df):
if hasattr(df, "columns"):
for col in df.columns:
if str(col)[:4].isdigit():
return str(col)
return "latest"
def compact(obj):
if isinstance(obj, pl.DataFrame):
return {"type": "DataFrame", "rows": obj.height, "columns": obj.width}
if isinstance(obj, dict):
return {"type": "dict", "keys": list(obj.keys())[:8]}
return {"type": type(obj).__name__}
forecast = c.analysis("growth")
macro_sensitivity = c.analysis("macroSensitivity")
valuation_band = c.analysis("valuationBand")
scenario = dartlab.macro("scenario", market="KR")
bs = c.panel("BS", freq="Y")
emit_result(
table=[
{"step": "companyGrowth", "result": compact(forecast)},
{"step": "macroSensitivity", "result": compact(macro_sensitivity)},
{"step": "scenario", "result": compact(scenario)},
{"step": "valuationBand", "result": compact(valuation_band)},
],
values={"target": target, "pathSteps": 4, "scenarioReady": compact(scenario)["type"] != "NoneType"},
date=latest_period(bs),
sources=["dartlab://company/show", "dartlab://company/forecast", "dartlab://macro/scenario"],
) 호출 동작
1. 결론 도출
146 시나리오 fair value 분포 + probAboveCurrent 단정. 예: “005930 현재가 78,000 / p25 fair=72,500 / p50=82,300 / p75=94,100 / probAboveCurrent=0.62 → median fair value > 현재가 (5.5% 상회) + 62% 시나리오에서 상회 — 중장기 우상향 분포 우세.”
2. 핵심 근거 수집
- c.analysis(‘growth’) — base revenue forecast
- c.analysis(‘macroSensitivity’) — rate / FX elasticity 계수
- macro(‘scenario’, market=‘KR’) — 146 시나리오 grid (rate × FX × cyclePhase × 침체)
- c.analysis(‘valuationBand’) — 적정 multiple band
- c.panel(‘BS’) — 기준 balance + 발행주식
3. 메커니즘 분석
146 시나리오 (rate × FX × phase × 침체)
각 시나리오 → revenue elasticity 적용 → P&L path
↓
146 P&L path → multiple 적용 → 146 fair value
↓
분포 산출:
p25 = 하위 25% fair value (보수적 valuation)
p50 = median (중앙값)
p75 = 상위 25% (낙관 valuation)
probAboveCurrent = (fair > current price) 비율
↓
single point estimate 보완:
p50 > current + probAboveCurrent > 60% → 상승 분포 우세
p25 < current < p50 + probAbove ~ 50% → 양면 분포
p75 < current → 하락 분포 우세 분포 std-dev 가 base price 의 5% 이상 → sensitivity 유효. < 5% → 시나리오 collapse (가정 무효 — pythonCheck falsifier 발동).
4. 반례·한계
- elasticity 가 회사별 추정 vs 산업 평균 — 산업 평균 사용 시 회사 고유성 무시.
- WACC (discount rate) 가 시나리오별 변동 — 일정 가정 시 분포 좁아짐 (보수적).
- 146 시나리오는 historical pattern 기반 — black swan 미커버.
- multiple 기반 fair value — multiple regime shift 시 분포 위치 이동.
5. 후속 모니터링
- probAboveCurrent > 70% →
recipes.quant.qualityFactor로 quality cross-check. - distribution std-dev 큼 (sensitive) →
recipes.macro.qualityMacroBeta로 phase 정합 확인. - p25 < 현재가 < p50 →
recipes.macro.tailRiskScenarioScan으로 하방 시나리오 매칭.
대표 반환 형태
pl.DataFrame — 단일 row:
scenarioCount : intcurrentPrice : floatp25FairValue : float·p50FairValue : float·p75FairValue : floatprobAboveCurrent : floatdistributionStd : float
연계 절차
- 본 recipe → 적정가치 분포.
- probAboveCurrent > 0.7 → strong buy / < 0.3 → strong sell signal.
- distribution std-dev 큰 종목 → sensitivity 큰 회사.
recipes.macro.betaPeerScreen와 결합.
기본 검증
ValidateRecipe(..., capture=False)기준으로 공개 호출 블록이 실행되어야 한다.requiredEvidence의 근거 종류가 모두 반환되어야 한다.- target을 바꿔도
Company("005930")하드코딩 가정이 남지 않아야 한다.
AI 직접 사용 방식
ReadSkill에서 사용자 질문과whenToUse를 맞춰 이 recipe를 고른다.GetSkillBody로 본문 전체를 읽고linkedSkills순서대로 먼저 필요한 엔진 skill을 확인한다.## 공개 호출 방식의 첫 Python 블록을 target만 바꿔ValidateRecipe(..., capture=False)로 smoke 실행한다.- 실행 결과의
skillRef,tableRef,valueRef,dateRef,executionRef중 누락된 근거가 있으면 답변을 작성하지 말고 호출 또는 근거 요구를 보강한다. - 답변은 결론, 핵심 근거, 메커니즘, 반례·한계, 후속 모니터링 순서로 작성하고
falsifier.description이 있으면 반례 단락에서 반드시 확인한다.
런타임
실행 환경별 호환성
| 환경 | 상태 | 비고 / 제한 |
|---|---|---|
| Local Python | supported | · |
| Server | supported | · |
| MCP | supported | · |
| Web AI | limited | · |
| Pyodide | limited | · |
실패 회피
흔한 실패 · 절대 금지
- 146 시나리오가 너무 corner case 지향이면 분포 fat-tail 으로 왜곡.
- DCF discount rate (WACC) 가 시나리오 별 변동 — 단순 일정 가정 시 분포 좁아짐.
- 단일 시나리오 (base) 만으로 적정가치 단정 금지 — 분포 필수.
- elasticity 가 산업 평균만 사용 — 회사별 추정 신뢰도 차이 무시 금지.