{
  "ticker": "034020.KS",
  "ticker_name": "두산에너빌리티",
  "status": "success",
  "trade_date": "2026-04-16",
  "analysis_date": "2026-04-16",
  "decision": "{\n  \"rating\": \"OVERWEIGHT\",\n  \"portfolio_stance\": \"BULLISH\",\n  \"entry_action\": \"WAIT\",\n  \"setup_quality\": \"DEVELOPING\",\n  \"confidence\": 0.64,\n  \"time_horizon\": \"medium\",\n  \"entry_logic\": \"034020.KS의 중기 방향성은 건설적이다. 공격적 분석이 지적한 대로 2026-04-15 종가 104,200원이 10일 EMA 99,853원과 50일 SMA 98,500원을 모두 상회했고, MACD가 -62.61에서 440.48로 양전환했으며, 거래량도 직전 190만주 안팎에서 5,470,474주로 확대됐다. 1Q26 매출 4조 1,511억원, 영업이익 2,105억원 전망도 원전, SMR, 가스터빈, 전력 인프라 기대가 숫자로 연결될 가능성을 뒷받침한다. 다만 보수적 분석이 강조한 선행 PER 102배, 순이익률 0.497%, 영업이익률 3.372%, 분기 이자비용 828억원 수준, 저항권 105,700-108,250 근접, 베타 1.832와 ATR 약 5%를 감안하면 오늘 추격 진입은 부적절하다. 따라서 레거시 배분 의견은 OVERWEIGHT로 유지하되, 즉시 실행은 WAIT로 둔다. 신규 진입은 105,700원 위 종가와 5,470,474주 이상 거래량 확인 후 소규모로 시작하거나, 99,800-98,500원 눌림 지지가 확인되고 반등 거래량이 살아날 때 허용한다.\",\n  \"exit_logic\": \"신규 전술 포지션은 98,500원 부근 50일 SMA를 종가로 이탈하면 감축 또는 청산한다. 96,600원 이탈은 4월 반등 구조 훼손으로 보고 강한 축소 신호로 처리한다. 중기 보유 논리는 1Q26 실적에서 영업이익 증가뿐 아니라 순이익률, 이자비용, 영업현금흐름, 순차입금, 수주잔고의 마진 품질이 확인되어야 유지된다. 원전·SMR 기대가 실제 계약 규모, 납기, 마진으로 전환되지 않거나, 2025년 4분기 자유현금흐름 1.206조원이 운전자본 효과에 그치고 반복성이 약하다고 확인되면 OVERWEIGHT를 낮춘다.\",\n  \"position_sizing\": \"기존 보유자는 조건부 OVERWEIGHT를 유지할 수 있으나 105,700-108,250 저항 아래에서는 추가 매수를 하지 않는다. 신규 자금은 확인 전 대기하고, 105,700원 돌파 시에도 목표 비중을 한 번에 채우지 않고 작은 시작 비중만 허용한다. 108,250원 위 안착과 거래량 유지가 확인될 때만 2차 증액을 검토한다. 베타 1.832와 ATR 약 5%를 반영해 손절 기준 98,500원 또는 진입가 대비 약 1 ATR 손실이 포트폴리오 위험 한도를 넘지 않도록 정상보다 낮은 초기 비중을 사용한다.\",\n  \"risk_limits\": \"주요 전술 한도는 98,500원 종가 이탈이며, 96,600원은 반등 구조의 핵심 무효화 기준이다. RSI가 60을 넘었는데도 105,700-108,250 저항을 돌파하지 못하면 추격 매수와 증액을 중단한다. 돌파 시 거래량이 5,470,474주 미만으로 약해지거나, KOSPI 위험선호가 꺾이거나, 글로벌 원전·인프라 테마 멀티플이 압축되면 진입 조건을 재검토한다. 갭 하락 가능성이 있으므로 손절선 존재만으로 위험이 충분히 통제된다고 보지 않는다.\",\n  \"catalysts\": [\n    \"034020.KS 1Q26 실적이 매출 4조 1,511억원, 영업이익 2,105억원 기대에 부합하고 마진 개선을 확인하는 경우\",\n    \"원전, SMR, 가스터빈, 전력 인프라 수주가 계약 규모, 마진 품질, 납기와 함께 구체적으로 공시되는 경우\",\n    \"105,700원 위 종가와 5,470,474주 이상 거래량이 동반되고, 108,250원 위 안착으로 110,000-112,100원 재시험 가능성이 열리는 경우\",\n    \"2025-12-31 운전자본 효과 이후에도 영업현금흐름과 자유현금흐름이 반복되고 순차입금 감소가 이어지는 경우\",\n    \"2026-04-13 자기주식 취득 정정 공시가 실질적으로 주주친화적이라는 점이 확인되는 경우\"\n  ],\n  \"invalidators\": [\n    \"034020.KS가 98,500원 아래로 종가 이탈한 뒤 50일 SMA를 빠르게 회복하지 못하는 경우\",\n    \"96,600원 이탈로 4월 반등 구조가 훼손되는 경우\",\n    \"1Q26 실제 실적이 긍정적 전망을 밑돌거나 순이익률, 이자비용, 현금 전환율에서 품질이 약한 경우\",\n    \"원전·SMR 서사가 기대에 머물고 실제 수주, 수주잔고 품질, 마진 가시성으로 연결되지 않는 경우\",\n    \"KOSPI 또는 글로벌 원전·인프라 관련주의 위험회피 전환으로 테마 멀티플 압축이 발생하는 경우\"\n  ],\n  \"watchlist_triggers\": [\n    \"매수 가능 돌파: 034020.KS가 105,700원 위로 종가 마감하고 거래량이 5,470,474주 이상 유지되는지 확인\",\n    \"추가 확인: 108,250원 위에서 최소 하루 이상 안착하고 후속 매수가 110,000-112,100원 방향으로 이어지는지 확인\",\n    \"눌림 진입: 99,800-98,500원 구간에서 지지가 확인되고 반등 거래량과 장중 수급이 개선되는지 확인\",\n    \"경고 신호: RSI가 60을 넘었는데도 105,700-108,250 저항 아래에서 정체되는지 확인\",\n    \"기본 점검: 1Q26 영업이익, 순이익률, 이자비용, 영업현금흐름, 순차입금, 수주잔고와 에너빌리티 부문 성장 내용을 확인\"\n  ],\n  \"data_coverage\": {\n    \"company_news_count\": 3,\n    \"disclosures_count\": 1,\n    \"social_source\": \"news_derived\",\n    \"macro_items_count\": 1\n  }\n}",
  "started_at": "2026-04-16T10:21:23.086174+09:00",
  "finished_at": "2026-04-16T10:34:10.366045+09:00",
  "duration_seconds": 767.28,
  "metrics": {
    "llm_calls": 55,
    "tool_calls": 22,
    "tokens_in": 0,
    "tokens_out": 0,
    "tokens_available": false,
    "calls_by_model": {
      "gpt-5.4": 55
    }
  },
  "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_company_news",
        "vendor": "naver",
        "status": "success",
        "fallback": false,
        "note": null
      },
      {
        "method": "get_macro_news",
        "vendor": "alpha_vantage",
        "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",
    "intraday_snapshot_missing_same_day"
  ],
  "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"
  }
}