recipes.macro.companyMacroPathProjection Recipes Recipe drafted

회사 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'.

이 스킬

회사 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'.

Recipes drafted recipes.macro.companyMacroPathProjection

이어 가기

절차

실행 순서

  1. 1

    `scenarioCount : int`

  2. 2

    `currentPrice : float`

  3. 3

    `p25FairValue : float` · `p50FairValue : float` · `p75FairValue : float`

  4. 4

    `probAboveCurrent : float`

  5. 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),
)

호출 동작

  1. c.analysis("revenueForecast") — base revenue forecast.
  2. c.analysis("macroSensitivity") — rate / FX elasticity.
  3. dartlab.macro("scenario") — 146 시나리오 (rate × FX × phase grid).
  4. 각 시나리오 → revenue shock → fair value (multiple 기반).
  5. 분포 p25/50/75 + 현재가 대비 above 확률.

대표 반환 형태

pl.DataFrame — 단일 row:

  • scenarioCount : int
  • currentPrice : float
  • p25FairValue : float · p50FairValue : float · p75FairValue : float
  • probAboveCurrent : float
  • distributionStd : float

연계 절차

  1. 본 recipe → 적정가치 분포.
  2. probAboveCurrent > 0.7 → strong buy / < 0.3 → strong sell signal.
  3. distribution std-dev 큰 종목 → sensitivity 큰 회사. recipes.macro.betaPeerScreen 와 결합.

기본 검증

  • ValidateRecipe(..., capture=False) 기준으로 공개 호출 블록이 실행되어야 한다.
  • requiredEvidence의 근거 종류가 모두 반환되어야 한다.
  • target을 바꿔도 Company("005930") 하드코딩 가정이 남지 않아야 한다.

AI 직접 사용 방식

  1. ReadSkill 에서 사용자 질문과 whenToUse를 맞춰 이 recipe를 고른다.
  2. GetSkillBody 로 본문 전체를 읽고 linkedSkills 순서대로 먼저 필요한 엔진 skill을 확인한다.
  3. ## 공개 호출 방식의 첫 Python 블록을 target만 바꿔 ValidateRecipe(..., capture=False)로 smoke 실행한다.
  4. 실행 결과의 skillRef, tableRef, valueRef, dateRef, executionRef 중 누락된 근거가 있으면 답변을 작성하지 말고 호출 또는 근거 요구를 보강한다.
  5. 답변은 결론, 핵심 근거, 메커니즘, 반례·한계, 후속 모니터링 순서로 작성하고 falsifier.description이 있으면 반례 단락에서 반드시 확인한다.

런타임

실행 환경별 호환성

환경상태비고 / 제한
Local Python supported
Server supported
MCPunknown
Web AIunknown
Pyodide limited

실패 회피

흔한 실패 · 절대 금지

흔한 실패
  • 146 시나리오가 너무 corner case 지향이면 분포 fat-tail 으로 왜곡.
  • DCF discount rate (WACC) 가 시나리오 별 변동 — 단순 일정 가정 시 분포 좁아짐.
절대 금지
  • 단일 시나리오 (base) 만으로 적정가치 단정 금지 — 분포 필수.
  • elasticity 가 산업 평균만 사용 — 회사별 추정 신뢰도 차이 무시 금지.