{
  "ticker": "034020.KS",
  "ticker_name": "두산에너빌리티",
  "status": "success",
  "trade_date": "2026-04-15",
  "analysis_date": "2026-04-15",
  "decision": "{\n  \"rating\": \"OVERWEIGHT\",\n  \"portfolio_stance\": \"BULLISH\",\n  \"entry_action\": \"WAIT\",\n  \"setup_quality\": \"DEVELOPING\",\n  \"confidence\": 0.66,\n  \"time_horizon\": \"medium\",\n  \"entry_logic\": \"034020.KS에 대한 중기 방향성은 건설적이다. 공격적 분석가가 지적한 것처럼 4Q 매출 4.86조 KRW, 영업이익 2121억 KRW, 순이익 728억 KRW 전환, 영업현금흐름 1.397조 KRW, 자유현금흐름 1.206조 KRW, 순차입금 4.306조 KRW에서 2.728조 KRW로 감소한 점은 핵심 개선 신호다. 또한 2026-04-14 종가 99700 KRW가 10일 지수이동평균 98887.76 KRW, 50일 이동평균 98296 KRW, 200일 이동평균 79023 KRW, 거래량가중평균 97589 KRW 위에 있어 회복 구조는 유지된다. 다만 보수적 분석가와 중립 분석가의 지적처럼 101200-101700 KRW 저항이 반복되고, 최근 거래량 170만-190만 주가 과거 800만-1000만 주 모멘텀 구간보다 크게 낮으며, 예상 PER 약 97배와 낮은 이익률은 즉시 추격 매수 근거로 부족하다. 따라서 기존 보유자는 조건부 초과비중을 유지할 수 있으나, 오늘 신규 진입이나 추가 매수는 보류한다. 실행 가능한 진입은 101700 KRW 상향 종가 돌파와 거래량 확대가 동시에 확인되거나, 98200-98900 KRW 조정 구간에서 종가 기준 지지가 확인되고 반등 거래량이 개선될 때로 제한한다.\",\n  \"exit_logic\": \"기존 노출은 97500 KRW 종가 이탈 시 즉시 위험 축소한다. 이 수준은 거래량가중평균과 50일선 회복의 신뢰가 깨지는 방어선이며, 이탈 시 93600-94900 KRW, 이후 91800 KRW까지 하방 위험이 커진다. 101700 KRW 돌파 후 거래량이 약하거나 빠르게 다시 101700 KRW 아래로 종가가 내려오면 허위 돌파로 보고 돌파 기반 추가분은 축소한다. 미국 원전, SMR, 가스터빈 수주 기대가 지연되거나 마진 개선을 동반한 수주잔고로 전환되지 못하는 경우, 또는 자사주 취득 정정 공시의 규모와 일정이 기대보다 약할 경우에도 투자 근거를 재평가한다.\",\n  \"position_sizing\": \"신규 자금은 정상 비중보다 낮은 단계적 배분만 허용한다. 베타 1.832와 ATR 약 5.1%를 감안해 저항 부근 추격 매수는 피하고, 확인된 지지 반등 또는 고거래량 돌파 후 부분 진입한다. 기존 초과비중 보유자는 유지 가능하지만 97500 KRW 종가 이탈 시 빠르게 정상 또는 축소 비중으로 낮춘다. 추가 매수는 첫 확인 후 부분, 이후 103000-106000 KRW 재시험과 거래량 지속 여부를 보고 제한적으로 확대한다.\",\n  \"risk_limits\": \"핵심 전술 방어선은 97500 KRW 종가 이탈이다. 종목의 일반 변동폭이 주당 약 5000 KRW 수준임을 감안하되, 지지 이탈을 중기 투자 논리로 방치하지 않는다. 예상 PER 약 97배, 영업이익률 약 3.4%, 순이익률 약 0.5%, ROE 약 1.7%, 높은 금융비용이 여전히 부담이므로 수주 가시성, 마진 전환, 반복 가능한 현금흐름이 확인되기 전까지 신규 비중은 보수적으로 제한한다. 시장 위험회피가 커질 경우 높은 베타 특성상 손실 확대 가능성을 우선 관리한다.\",\n  \"catalysts\": [\n    \"034020.KS의 미국 대형 원전 수주 진행 또는 계약 가시성에 대한 신뢰도 높은 확인\",\n    \"SMR 또는 가스터빈 수주 확대가 이익 추정치 상향으로 연결되는 증거\",\n    \"자사주 취득 정정 공시에서 의미 있는 규모, 일정, 실행 방식이 확인되는 경우\",\n    \"101700 KRW 상향 종가 돌파와 최근 170만-190만 주 범위를 뚜렷하게 넘는 거래량 확대\",\n    \"103000-106000 KRW 재시험 성공과 기관 또는 외국인 수급 개선\",\n    \"4Q 자유현금흐름 개선이 운전자본 요인이 아니라 영업이익 기반으로 반복되는 증거\"\n  ],\n  \"invalidators\": [\n    \"034020.KS가 97500 KRW를 종가 기준으로 이탈\",\n    \"미국 원전, SMR, 가스터빈 수주 기대가 지연, 취소, 또는 저마진 수주로 확인\",\n    \"자사주 취득 정정 내용이 기대보다 작은 규모, 느린 일정, 약한 실행 구조로 확인\",\n    \"2026년 실적에서 낮은 마진, 분기 손실 재발, 운전자본 정상화 이후 현금흐름 반전이 나타남\",\n    \"101700 KRW 돌파 후 거래량이 붙지 않고 빠르게 재이탈하는 허위 돌파\",\n    \"KOSPI 위험선호가 약화되어 고베타 정책·에너지 인프라 종목 수급이 악화\"\n  ],\n  \"watchlist_triggers\": [\n    \"034020.KS가 101700 KRW 위에서 종가를 형성하고 거래량이 최근 170만-190만 주 범위를 크게 초과\",\n    \"98200-98900 KRW 조정 구간에서 종가 기준 지지 후 거래량이 개선되며 반등\",\n    \"97500 KRW 종가 이탈 시 WAIT와 보유 편향에서 위험 축소로 전환\",\n    \"OpenDART의 자사주 실행 조건 또는 수주잔고 관련 신규 공시\",\n    \"4Q 현금흐름 강세가 영업이익 개선을 통해 반복되는지 확인되는 분기 지표\",\n    \"101200-101700 KRW 접근 시 거래량이 여전히 부진하면 추가 매수 보류 또는 일부 위험 축소 검토\"\n  ],\n  \"data_coverage\": {\n    \"company_news_count\": 4,\n    \"disclosures_count\": 1,\n    \"social_source\": \"news_derived\",\n    \"macro_items_count\": 1\n  }\n}",
  "started_at": "2026-04-15T12:55:00.943643+09:00",
  "finished_at": "2026-04-15T13:09:52.808816+09:00",
  "duration_seconds": 891.87,
  "metrics": {
    "llm_calls": 58,
    "tool_calls": 22,
    "tokens_in": 0,
    "tokens_out": 0,
    "tokens_available": false,
    "calls_by_model": {
      "gpt-5.4": 58
    }
  },
  "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_social_sentiment",
        "vendor": "naver",
        "status": "fallback",
        "fallback": true,
        "note": "naver: empty or unusable result"
      },
      {
        "method": "get_company_news",
        "vendor": "naver",
        "status": "success",
        "fallback": false,
        "note": null
      },
      {
        "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
      }
    ]
  },
  "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"
  }
}