이 스킬
회사 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
`scenarioCount : int`
- 2
`currentPrice : float`
- 3
`p25FairValue : float` · `p50FairValue : float` · `p75FairValue : float`
- 4
`probAboveCurrent : float`
- 5
`distributionStd : float`
예시
이런 질문이 들어오면 이 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.show("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),
) 호출 동작
c.analysis("revenueForecast")— base revenue forecast.c.analysis("macroSensitivity")— rate / FX elasticity.dartlab.macro("scenario")— 146 시나리오 (rate × FX × phase grid).- 각 시나리오 → revenue shock → fair value (multiple 기반).
- 분포 p25/50/75 + 현재가 대비 above 확률.
대표 반환 형태
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 | unknown | — |
| Web AI | unknown | — |
| Pyodide | limited | — |
실패 회피
흔한 실패 · 절대 금지
- 146 시나리오가 너무 corner case 지향이면 분포 fat-tail 으로 왜곡.
- DCF discount rate (WACC) 가 시나리오 별 변동 — 단순 일정 가정 시 분포 좁아짐.
- 단일 시나리오 (base) 만으로 적정가치 단정 금지 — 분포 필수.
- elasticity 가 산업 평균만 사용 — 회사별 추정 신뢰도 차이 무시 금지.