{
  "ticker": "034020.KS",
  "ticker_name": "두산에너빌리티",
  "status": "success",
  "trade_date": "2026-04-14",
  "analysis_date": "2026-04-16",
  "decision": "{\n  \"rating\": \"HOLD\",\n  \"portfolio_stance\": \"BULLISH\",\n  \"entry_action\": \"WAIT\",\n  \"setup_quality\": \"DEVELOPING\",\n  \"confidence\": 0.63,\n  \"time_horizon\": \"medium\",\n  \"entry_logic\": \"034020.KS에 대한 최종 판단은 조건부 상승 편향의 HOLD다. 공격적 분석가가 지적한 것처럼 50일선 98,296 KRW가 200일선 79,023 KRW를 크게 웃돌아 장기 상승 구조는 훼손되지 않았고, 약 2,011억 KRW 외국인 순매수, 원전·SMR 서사, 2025년 12월 분기 영업현금흐름 1.397조 KRW와 자유현금흐름 1.206조 KRW, 순부채 감소는 투자 가능한 상승 논리를 만든다. 그러나 보수적·중립적 분석가의 지적처럼 주가는 109,600 KRW에서 91,800 KRW까지 급락한 뒤 97,500-101,700 KRW 박스에서 아직 방향을 확정하지 못했고, MACD 18.31의 양전환은 초기 신호일 뿐이며 RSI 51.19는 강한 추세 재개를 확인하지 못한다. 따라서 기존 보유는 유지할 수 있지만 오늘 신규 추격 매수는 보류한다. 신규 스타터는 034020.KS가 101,700 KRW를 종가 기준 돌파하고 거래량이 증가하며 100,000 KRW 위를 유지하고 외국인 수급이 급반전하지 않을 때 정당화된다. 대안적으로 97,500-98,300 KRW 지지권을 훼손하지 않고 반등하며 모멘텀이 개선될 때만 소규모 진입을 검토한다.\",\n  \"exit_logic\": \"034020.KS가 97,500-98,300 KRW 지지권을 종가 기준 이탈하면 일부 축소하고 setup_quality를 재평가한다. 95,000 KRW 아래 종가는 반등 실패로 간주해 방어적 전환 또는 exit-oriented action을 우선하며, 하방은 91,800 KRW 재시험 가능성을 열어 둔다. SMR 부지 선정, 정책 지원, 원전 수주 전환이 지연되거나 실망스럽고, 외국인 매수가 지속 매도로 바뀌며, 다음 실적에서 영업이익·순이익·자유현금흐름 개선이 운전자본 효과를 넘어 반복 가능하다는 증거를 주지 못하면 중기 투자 논리를 낮춘다. 예상 PER 96.9배가 순이익률 0.497%, 영업이익률 3.372%, ROE 1.733% 개선으로 뒷받침되지 않는 경우도 축소 사유다.\",\n  \"position_sizing\": \"기존 보유자는 핵심 비중을 유지하되 101,700 KRW 돌파 확인 전에는 추가 매수를 피한다. 신규 진입자는 조건 충족 전까지 대기하고, 조건 충족 시에도 정상 비중의 약 25-35% 수준의 작은 스타터만 사용한다. 이후 103,500 KRW 안착, RSI 55-60 회복, 외국인 순매수 지속, 거래량 증가가 함께 확인될 때 2차 분할을 검토한다. 베타 1.832와 ATR 5,122 KRW가 약 5% 일중 변동성을 뜻하므로 전체 포트폴리오에서 정상보다 낮은 위험 예산을 배정하고, 106,300 KRW 및 108,800-109,600 KRW 저항권에서는 추격보다 이익 보호와 재평가를 우선한다.\",\n  \"risk_limits\": \"위험 관리는 촘촘한 장중 손절보다 종가 기준으로 수행한다. 1차 위험선은 97,500-98,300 KRW이며, 이 구간은 10일 EMA 98,888 KRW, 50일선 98,296 KRW, VWMA 97,589 KRW가 모여 있어 핵심 판단 구간이다. 95,000 KRW 아래는 강한 위험선으로 설정한다. 91,800 KRW가 다시 시야에 들어오면 단순 저가 매수나 평균단가 낮추기를 금지하고, 신규 수주·SMR·정책·실적 개선 같은 별도 촉매가 있을 때만 재검토한다. 고PER, 낮은 수익성, 이자비용 부담, 운전자본 의존 가능성이 남아 있으므로 포지션 크기는 변동성을 흡수할 수 있는 범위로 제한한다.\",\n  \"catalysts\": [\n    \"034020.KS가 101,700 KRW를 거래량 증가와 함께 종가 기준 돌파하고 100,000 KRW 위를 유지한다\",\n    \"약 2,011억 KRW로 언급된 034020.KS 외국인 순매수가 지속되고 KOSPI 위험선호가 유지된다\",\n    \"향후 약 두 달 내 SMR 1호기 부지 선정 및 관련 프로젝트 세부 내용이 034020.KS에 우호적으로 구체화된다\",\n    \"원전 및 에너지 인프라 수주 파이프라인이나 IR 메시지가 매출 가시성을 높인다\",\n    \"다음 분기 실적에서 영업이익, 순이익, 자유현금흐름 개선이 운전자본 효과를 넘어 반복 가능하다는 증거를 제공한다\",\n    \"자기주식취득결정 정정 공시의 세부 내용이 규모 축소나 지연이 아니라 주주환원 지지를 확인한다\"\n  ],\n  \"invalidators\": [\n    \"034020.KS가 97,500 KRW를 종가 기준 이탈하고 빠르게 회복하지 못한다\",\n    \"95,000 KRW 아래 종가로 반등 실패가 확인되어 91,800 KRW 재시험 가능성이 커진다\",\n    \"외국인 매수가 지속 매도로 반전하고 KOSPI 대형주 위험선호가 약화된다\",\n    \"SMR 부지 선정, 정책 지원, 원전 수주 전환이 지연되거나 기대에 미치지 못한다\",\n    \"예상 PER 96.9배가 순이익률 0.497%, 영업이익률 3.372%, ROE 1.733% 개선으로 정당화되지 않는다\",\n    \"2025년 12월 분기 자유현금흐름 개선이 운전자본 변화, 매입채무 증가, 재고 감소 중심의 일회성 효과로 확인되고 순이자손익 -861억 KRW 및 이자비용 부담이 재부각된다\"\n  ],\n  \"watchlist_triggers\": [\n    \"101,700 KRW 종가 돌파와 거래량 확대: 신규는 STARTER, 기존 보유자는 ADD 검토로 entry_action 상향\",\n    \"100,000 KRW 위 안착과 RSI 55-60 진입: 모멘텀 회복 확인\",\n    \"103,500 KRW 돌파 후 유지: 2차 분할 진입 가능성 점검\",\n    \"106,300 KRW 또는 108,800-109,600 KRW 접근: 추격보다 일부 이익 보호와 밸류에이션 재평가\",\n    \"97,500 KRW 종가 이탈: 일부 축소와 setup_quality 하향 검토\",\n    \"95,000 KRW 종가 이탈: 방어적 전환 또는 EXIT 검토\",\n    \"034020.KS에 직접 연결되는 SMR, 원전 수주, 정책 milestone 확인: rating을 OVERWEIGHT 또는 BUY로 재평가\",\n    \"다음 실적에서 반복 가능한 자유현금흐름과 마진 개선 확인: confidence 상향\"\n  ],\n  \"data_coverage\": {\n    \"company_news_count\": 5,\n    \"disclosures_count\": 2,\n    \"social_source\": \"news_derived\",\n    \"macro_items_count\": 3\n  }\n}",
  "started_at": "2026-04-16T02:34:41.200816+09:00",
  "finished_at": "2026-04-16T02:47:33.726853+09:00",
  "duration_seconds": 772.53,
  "metrics": {
    "llm_calls": 63,
    "tool_calls": 22,
    "tokens_in": 0,
    "tokens_out": 0,
    "tokens_available": false,
    "calls_by_model": {
      "gpt-5.4": 63
    }
  },
  "tool_telemetry": {
    "total_tool_calls": 22,
    "vendor_calls": {
      "yfinance": 15,
      "naver": 3,
      "ecos": 1,
      "opendart": 1,
      "alpha_vantage": 2
    },
    "fallback_count": 4,
    "events": [
      {
        "method": "get_stock_data",
        "vendor": "yfinance",
        "status": "success",
        "fallback": false,
        "note": null
      },
      {
        "method": "get_indicators",
        "vendor": "yfinance",
        "status": "success",
        "fallback": false,
        "note": null
      },
      {
        "method": "get_indicators",
        "vendor": "yfinance",
        "status": "success",
        "fallback": false,
        "note": null
      },
      {
        "method": "get_indicators",
        "vendor": "yfinance",
        "status": "success",
        "fallback": false,
        "note": null
      },
      {
        "method": "get_indicators",
        "vendor": "yfinance",
        "status": "success",
        "fallback": false,
        "note": null
      },
      {
        "method": "get_indicators",
        "vendor": "yfinance",
        "status": "success",
        "fallback": false,
        "note": null
      },
      {
        "method": "get_indicators",
        "vendor": "yfinance",
        "status": "success",
        "fallback": false,
        "note": null
      },
      {
        "method": "get_indicators",
        "vendor": "yfinance",
        "status": "success",
        "fallback": false,
        "note": null
      },
      {
        "method": "get_indicators",
        "vendor": "yfinance",
        "status": "success",
        "fallback": false,
        "note": null
      },
      {
        "method": "get_company_news",
        "vendor": "naver",
        "status": "success",
        "fallback": false,
        "note": null
      },
      {
        "method": "get_social_sentiment",
        "vendor": "naver",
        "status": "fallback",
        "fallback": true,
        "note": "naver: empty or unusable result"
      },
      {
        "method": "get_social_sentiment",
        "vendor": "yfinance",
        "status": "fallback",
        "fallback": true,
        "note": "yfinance: empty or unusable result"
      },
      {
        "method": "get_macro_news",
        "vendor": "ecos",
        "status": "fallback",
        "fallback": true,
        "note": "ecos: ECOS API key is not configured."
      },
      {
        "method": "get_disclosures",
        "vendor": "opendart",
        "status": "success",
        "fallback": false,
        "note": null
      },
      {
        "method": "get_macro_news",
        "vendor": "alpha_vantage",
        "status": "success",
        "fallback": false,
        "note": null
      },
      {
        "method": "get_company_news",
        "vendor": "naver",
        "status": "success",
        "fallback": false,
        "note": null
      },
      {
        "method": "get_income_statement",
        "vendor": "yfinance",
        "status": "success",
        "fallback": false,
        "note": null
      },
      {
        "method": "get_cashflow",
        "vendor": "yfinance",
        "status": "success",
        "fallback": false,
        "note": null
      },
      {
        "method": "get_balance_sheet",
        "vendor": "yfinance",
        "status": "success",
        "fallback": false,
        "note": null
      },
      {
        "method": "get_insider_transactions",
        "vendor": "yfinance",
        "status": "fallback",
        "fallback": true,
        "note": "yfinance: empty or unusable result"
      },
      {
        "method": "get_fundamentals",
        "vendor": "yfinance",
        "status": "success",
        "fallback": false,
        "note": null
      },
      {
        "method": "get_insider_transactions",
        "vendor": "alpha_vantage",
        "status": "success",
        "fallback": false,
        "note": null
      }
    ],
    "called_tools": [],
    "intraday_snapshot_used": false
  },
  "quality_flags": [
    "token_usage_unavailable"
  ],
  "report_writer": {
    "status": "success",
    "scope": "ticker",
    "provider": "codex",
    "model": "gpt-5.4"
  },
  "provider": "codex",
  "models": {
    "quick_model": "gpt-5.4",
    "deep_model": "gpt-5.4",
    "output_model": "gpt-5.4"
  }
}