{
  "ticker": "012450.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.72,\n  \"time_horizon\": \"medium\",\n  \"entry_logic\": \"012450.KS에 대한 중기 배분 의견은 비중확대와 상승 방향을 유지한다. 공격적 분석가가 지적한 것처럼 2026-04-14 종가 KRW 1,523,000은 10일 지수이동평균 KRW 1,470,929, 50일 단순이동평균 KRW 1,337,140, 200일 단순이동평균 KRW 1,051,395 및 거래량가중평균 KRW 1,421,083 위에 있어 추세 정렬이 양호하고, RSI 약 60과 양의 MACD도 회복된 모멘텀을 뒷받침한다. 그러나 보수적·중립 분석가가 강조한 대로 주가는 KRW 1,559,000 저항에 매우 가깝고 KRW 1,655,000의 3월 고점 공급 구간도 남아 있으며, ATR이 약 KRW 86,611로 높아 현재가에서 추격 매수의 손익비는 충분하지 않다. 따라서 오늘 즉시 신규 진입하거나 추가 매수하지 않고 대기한다. 신규 또는 추가 진입은 두 조건 중 하나가 충족될 때만 정당화된다: KRW 1,450,000-1,470,000 지지권에서 매도 거래량이 줄고 RSI가 50 위를 유지하며 안정화되는 경우, 또는 KRW 1,559,000을 확대 거래량으로 종가 돌파하고 IR·실적·공시가 방산 마진, 수주잔고 질, 현금전환 또는 유럽·NATO 수주 전환을 함께 확인해 주는 경우다. 이 조건이 충족되면 소규모 시작 포지션은 가능하지만, 현재는 확인이 부족하다.\",\n  \"exit_logic\": \"기존 보유분은 012450.KS가 KRW 1,450,000-1,470,000 지지권을 유지하고 RSI·MACD가 훼손되지 않는 한 유지한다. KRW 1,559,000-1,655,000 구간에 접근한다는 이유만으로 자동 축소하지는 않지만, 해당 구간에서 상승 거래량이 아닌 매도 거래량 증가와 명확한 거절이 나오면 과도한 비중은 줄인다. 종가가 KRW 1,451,000 아래로 내려간 뒤 KRW 1,470,000 부근 회복에 실패하면 단기 회복 구조가 약화된 것으로 보고 전술 비중을 축소하거나 청산한다. KRW 1,331,000-1,337,000의 50일선·중기 지지권 이탈은 중기 비중확대 논리 재평가 신호다. 다음 IR 또는 실적에서 마진 압박, 현금전환 약화, 불리한 계약 조건, 유럽·NATO 수주 전환 지연이 확인되면 투자 논리를 낮춘다.\",\n  \"position_sizing\": \"기존 보유자는 통제된 비중확대를 유지할 수 있으나 1 ATR인 약 KRW 86,611, 가능하면 1-2 ATR 변동을 강제 매도 없이 견딜 수 있는 규모로 제한한다. 신규 자금은 확인 전 투입하지 않는다. 조건 충족 시에도 첫 진입은 작게 시작하고, 지지 확인 또는 거래량 동반 돌파 이후에만 단계적으로 추가한다. 보수적 분석가가 지적한 높은 변동성, 52주 고점 부근 위치, Forward PE 약 26, 현금흐름 반복성 미확인 리스크를 반영해 집중 포지션은 피한다.\",\n  \"risk_limits\": \"타이트한 가격 손절보다 ATR을 반영한 위험관리를 적용한다. 단기 위험 기준은 KRW 1,451,000 아래 종가와 이후 KRW 1,470,000 회복 실패다. 이 경우 전술 비중을 줄인다. 중기 위험은 KRW 1,331,000-1,337,000 이탈에서 크게 상승한다. KRW 1,559,000-1,655,000 저항 구간에서는 확대 거래량과 IR·실적·공시의 질적 확인 없이 매수하지 않는다. 2026-03-04 장중 KRW 1,243,000-KRW 1,655,000의 극단적 변동이 있었던 만큼 돌파 매수도 소규모와 분할 원칙을 적용한다.\",\n  \"catalysts\": [\n    \"012450.KS IR 및 실적 발표에서 방산 마진, 수주잔고 질, 현금전환이 확인되는 경우\",\n    \"2026-04-01 및 2026-04-10 공급계약 공시의 규모, 납기, 마진, 환율 조건이 우호적으로 구체화되는 경우\",\n    \"30개국 NATO 대사 전략 대화 이후 유럽 방산 조달 또는 NATO 관련 수주 전환이 진전되는 경우\",\n    \"KRW 1,559,000을 확대 거래량으로 종가 돌파해 KRW 1,655,000 재시험 가능성이 높아지는 경우\",\n    \"정책금융 또는 은행권 지원이 수출 실행력, 생산능력 확장, 운전자본 부담 완화로 연결되는 경우\"\n  ],\n  \"invalidators\": [\n    \"KRW 1,451,000 아래 종가 이후 KRW 1,470,000 회복 실패\",\n    \"KRW 1,331,000-1,337,000 중기 지지권 및 50일선 구간 이탈\",\n    \"IR 또는 실적에서 마진 압박, 현금전환 약화, 시장 기대에 못 미치는 계약 조건이 확인되는 경우\",\n    \"최근 KRW 3.20조 자유현금흐름 개선이 약 KRW 3.06조의 운전자본 변동에 주로 의존했고 반복성이 낮다는 증거\",\n    \"지정학적 긴장 완화 또는 방산주 순환매 이탈로 KOSPI 강세에도 상대 약세가 지속되는 경우\"\n  ],\n  \"watchlist_triggers\": [\n    \"KRW 1,450,000-1,470,000 지지권 테스트에서 매도 거래량이 둔화되고 RSI가 50 위를 유지하는지 확인\",\n    \"KRW 1,559,000 위 거래량 동반 일봉 종가 돌파 여부 확인\",\n    \"KRW 1,559,000 부근 거절과 매도 거래량 증가가 동시에 나타나는지 확인\",\n    \"2026-04-01 및 2026-04-10 공급계약의 규모, 일정, 마진, 환율 조건 추가 공시 확인\",\n    \"다음 실적 또는 IR에서 영업마진, 수주잔고, 재고, 운전자본, 유럽 파이프라인 전환에 대한 해설 확인\",\n    \"KRW 1,655,000 재시험 시 돌파 지속성 또는 공급 출회 여부 확인\"\n  ],\n  \"data_coverage\": {\n    \"company_news_count\": 2,\n    \"disclosures_count\": 5,\n    \"social_source\": \"news_derived\",\n    \"macro_items_count\": 0\n  }\n}",
  "started_at": "2026-04-15T12:41:08.556002+09:00",
  "finished_at": "2026-04-15T12:55:00.937766+09:00",
  "duration_seconds": 832.38,
  "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_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
      }
    ]
  },
  "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"
  }
}