{
  "ticker": "034020.KS",
  "ticker_name": "두산에너빌리티",
  "status": "success",
  "trade_date": "2026-04-14",
  "analysis_date": "2026-04-14",
  "decision": "{\n  \"rating\": \"NO_TRADE\",\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-13 종가 99,300원은 200일선 78,829.5원을 약 26% 웃돌고, 50일선 98,142원과 10일 EMA 98,707원 위에서 버티며 장기 상승 구조가 훼손되지 않았다. 이집트 엘다바 원전, 원전·인프라 수주 기대, 2025년 4분기 자유현금흐름 1.206조 원, 순차입금 4.306조 원에서 2.728조 원으로 감소한 점도 긍정적이다. 다만 보수·중립 분석가가 강조한 것처럼 MACD는 -62.61로 아직 음수이고, 히스토그램은 개선 중일 뿐 양전환이 확정되지 않았으며, 4월 13일 거래량 1,746,075주는 3월 중순 800만~900만 주대 거래량보다 약하다. 따라서 오늘 즉시 진입은 보류한다. 진입은 103,000원 위 종가 안착과 최근 저거래 반등 대비 뚜렷한 거래량 증가, MACD 히스토그램 양전환 또는 0선 근처 개선 지속이 함께 확인될 때만 starter로 허용한다. 대안으로 98,100~98,700원 지지를 종가 기준으로 확인한 뒤 100,000원을 회복하고 반등 거래량이 붙는 경우에도 starter를 검토한다.\",\n  \"exit_logic\": \"기존 보유분은 98,100원 종가 이탈 시 일부 축소하고 신규 진입 검토를 중단한다. 95,000원 이탈은 중립 분석가와 보수적 분석가가 모두 지적한 추세 훼손 구간으로 보고 방어 또는 청산 모드로 전환한다. 확인 후 starter 진입이 이루어진 경우 106,300~109,600원 저항권에서는 수주 공시, 기관·외국인 수급, 거래량 확대, 실적 개선 확인이 동반되지 않으면 일부 이익 실현을 우선한다. 원전 뉴스가 구체적 계약 규모, 귀속분, 납품 일정, 마진으로 연결되지 않거나 현금흐름 개선이 반복되지 않으면 비중 확대를 보류한다.\",\n  \"position_sizing\": \"오늘 신규 포지션은 잡지 않는다. 조건 충족 시에도 ATR 5,362원, 종가 대비 약 5.4%, Beta 1.832의 높은 변동성을 반영해 정상 비중의 25~35% 수준 starter만 허용한다. 103,000원 위 안착이 재확인되거나 98,100~98,700원 지지 후 100,000원 회복이 거래량과 함께 유지될 때만 추가를 검토한다. Forward PE 93배, TTM 순이익률 0.497%, ROE 1.733%, 영업이익을 흡수하는 이자비용 부담이 남아 있어 초기부터 큰 비중은 부적절하다.\",\n  \"risk_limits\": \"98,100원을 1차 종가 기준 경고선으로 둔다. 이탈 시 기존 보유분 축소와 신규 진입 보류가 필요하다. 95,000원은 하드 리스크 한계로, 이탈 시 단순 변동성이 아니라 추세 훼손 가능성으로 본다. 101,200~103,000원 구간의 저거래량 상승은 추격하지 않는다. 원전 수주 기대가 계약 가치와 마진으로 확인되지 않거나, 2025년 4분기 현금흐름 개선이 운전자본 효과에 그친 것으로 드러나면 밸류에이션 압축 위험을 반영해 노출을 줄인다.\",\n  \"catalysts\": [\n    \"034020.KS가 관련된 이집트 엘다바 또는 해외 원전 프로젝트에서 구체적 계약 규모, 귀속분, 납품 일정, 마진 정보가 확인되는 경우\",\n    \"103,000원 위 종가 안착과 함께 1,746,075주를 단순히 넘는 수준이 아니라 최근 저거래 반등 대비 뚜렷한 거래량 증가가 동반되는 경우\",\n    \"MACD 히스토그램이 양전환하고 100,000원 위 가격 유지가 확인되는 경우\",\n    \"KOSPI 위험선호 회복 속에서 외국인·기관 수급이 원전·인프라 대형주로 유입되는 경우\",\n    \"2026-04-13 자기주식 취득 정정 공시의 세부 내용이 실제 주가 지지력 있는 규모와 조건으로 확인되는 경우\",\n    \"다음 실적에서 영업마진, 자유현금흐름, 순차입금 감소가 반복되는 경우\"\n  ],\n  \"invalidators\": [\n    \"98,100원 종가 이탈 후 50일선 98,142원과 10일 EMA 98,707원 부근을 빠르게 회복하지 못하는 경우\",\n    \"95,000원 이탈로 중기 지지 구조가 훼손되는 경우\",\n    \"원전 프로젝트 헤드라인이 034020.KS 귀속 계약 가치, 마진, 납품 일정으로 연결되지 않는 경우\",\n    \"2025년 4분기 자유현금흐름 1.206조 원 개선이 운전자본 효과에 그치고 다음 분기에 반복되지 않는 경우\",\n    \"순이자비용과 비영업손실이 영업이익을 계속 흡수해 최종 주주이익 개선이 지연되는 경우\",\n    \"Forward PE 93배를 정당화할 수 있는 수주, 마진, 현금흐름 증거가 약화되는 경우\"\n  ],\n  \"watchlist_triggers\": [\n    \"103,000원 위 종가 안착과 최근 저거래 반등 대비 뚜렷한 거래량 증가\",\n    \"MACD 히스토그램 양전환 또는 0선 근처 개선 지속과 100,000원 위 가격 유지\",\n    \"98,100~98,700원 지지 확인 후 100,000원 회복 및 반등 거래량 증가\",\n    \"106,300~109,600원 저항 재시험 시 거래량, 외국인·기관 수급, 원전 뉴스 동반 여부\",\n    \"2026-04-13 접수번호 20260413002228 자기주식 취득 정정 공시의 규모, 시기, 조건 확인\",\n    \"다음 분기 자유현금흐름, 순차입금, 영업마진이 2025년 4분기 개선을 반복하는지 확인\"\n  ],\n  \"data_coverage\": {\n    \"company_news_count\": 5,\n    \"disclosures_count\": 1,\n    \"social_source\": \"news_derived\",\n    \"macro_items_count\": 1\n  }\n}",
  "started_at": "2026-04-14T11:37:05.777021+09:00",
  "finished_at": "2026-04-14T11:48:24.181826+09:00",
  "duration_seconds": 678.4,
  "metrics": {
    "llm_calls": 52,
    "tool_calls": 22,
    "tokens_in": 0,
    "tokens_out": 0,
    "tokens_available": false,
    "calls_by_model": {
      "gpt-5.4": 52
    }
  },
  "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_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_balance_sheet",
        "vendor": "yfinance",
        "status": "success",
        "fallback": false,
        "note": null
      },
      {
        "method": "get_cashflow",
        "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": "fallback",
    "scope": "ticker",
    "provider": "codex",
    "model": "gpt-5.4",
    "reason": "writer_failed",
    "error": "1 validation error for CodexChatModel\ncodex_workspace_dir\n  Input should be a valid string [type=string_type, input_value=None, input_type=NoneType]\n    For further information visit https://errors.pydantic.dev/2.12/v/string_type"
  },
  "provider": "codex",
  "models": {
    "quick_model": "gpt-5.4",
    "deep_model": "gpt-5.4",
    "output_model": "gpt-5.4"
  }
}