{
  "ticker": "012450.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.69,\n  \"time_horizon\": \"medium\",\n  \"entry_logic\": \"012450.KS에 대한 최종 판단은 방향성은 긍정적이나 즉시 진입은 보류다. 공격적 분석이 지적한 대로 2026-04-13 종가 1530000은 50일선 1332440과 200일선 1048377을 크게 웃돌고, MACD가 7453에서 47460으로 확대됐으며 MACD 히스토그램도 11707까지 개선되어 중기 상승 추세는 살아 있다. 또한 2026-04-01과 2026-04-10 공급계약 공시, 폴란드·인도네시아 방산 외교 기대, 2025-12 매출 8.42조 KRW와 영업이익 8126억 KRW는 건설적 논거다. 다만 보수·중립 분석이 강조한 것처럼 2026-04-14는 비거래일로 당일 체결 근거가 없고, 2026-04-13 거래량 259390은 3월 초 급등일 1295365에 크게 못 미치며, ATR 약 89658 KRW는 종가 대비 5.86%로 높다. 따라서 오늘은 매수하지 않는다. 1530000~1550000 위에서 거래량이 최근 4월 수준보다 뚜렷하게 증가하고 MACD 히스토그램이 유지 또는 확대될 때, 또는 1459000 부근 10일 EMA와 1413000 부근 VWMA가 낮은 매도 거래량으로 방어될 때만 축소된 초기 포지션을 검토한다.\",\n  \"exit_logic\": \"향후 조건 충족 후 진입하더라도 012450.KS가 1413000 부근 VWMA를 종가 기준으로 이탈하고 거래량이 증가하며 MACD 히스토그램이 약화되면 축소 또는 청산한다. 1332440 부근 50일선이 확대 거래량으로 깨지면 단순 변동성이 아니라 트레이딩 논리 훼손으로 보고 청산한다. 공급계약의 마진, 납기, 원가 부담, 수출 승인 조건이 시장 기대보다 약하거나, 다음 실적에서 2025-12 현금흐름 개선이 운전자본 일회성에 그친 것으로 확인되거나, 추가 희석·불리한 자금조달·규제 정정·풍문 해명 리스크가 재부각되면 가격 신호를 기다리지 않고 방어적으로 대응한다.\",\n  \"position_sizing\": \"현재는 신규 포지션 없음. 조건이 충족되면 정상 위험 배정의 약 1/3 이하로 초기 진입한다. 공격적 분석의 1/2 배정은 현재 거래량 부족과 높은 ATR을 감안하면 이르며, 보수적 분석의 1/4 이하만 허용하는 접근은 추세 재개 시 기회비용이 커질 수 있어 기본 기준은 1/3 이하가 적절하다. 1/2 이상 증액은 1530000~1550000 위 안착 후 거래량 확장, 1655000 전고점권 재시험 가능성 증가, 또는 다음 공시·실적에서 마진과 현금흐름 품질이 확인될 때로 제한한다.\",\n  \"risk_limits\": \"손절 폭을 좁게 두기보다 포지션 크기로 위험을 통제한다. ATR 약 89658 KRW와 종가 대비 5.86% 변동성을 반영해 고정 손절보다 1413000 VWMA와 1332440 50일선을 단계적 위험 기준으로 사용한다. 1530000 위에서 거래량 확인 없이 추격 매수하지 않으며, RSI가 65~70에 접근하는데 가격이 1530000~1550000 위로 안착하지 못하면 피로 신호로 본다. 신규 진입 시 포트폴리오 손실 허용액은 작게 유지하고, 이벤트 공시 전후 갭 위험을 감안해 단일 종목 집중을 피한다.\",\n  \"catalysts\": [\n    \"012450.KS의 2026-04-01 및 2026-04-10 공급계약 공시가 구체적 계약금액, 마진, 납기, 원가 조건 측면에서 긍정적으로 확인되는 경우\",\n    \"폴란드 또는 인도네시아 방산 외교 일정이 구체적 주문 규모, 상대방, 일정이 포함된 후속 계약으로 전환되는 경우\",\n    \"다음 실적에서 2025-12 매출 8.42조 KRW 성장과 함께 영업이익률 안정 또는 개선이 확인되는 경우\",\n    \"영업현금흐름 4.13조 KRW와 자유현금흐름 3.20조 KRW 개선이 운전자본 일회성이 아니라 반복 가능한 현금창출력으로 확인되는 경우\",\n    \"1530000~1550000 위에서 최근 4월 수준을 뚜렷하게 넘는 거래량과 MACD 히스토그램 유지 또는 추가 확대가 동반되는 경우\"\n  ],\n  \"invalidators\": [\n    \"012450.KS가 1332440 부근 50일선을 확대 거래량으로 이탈하는 경우\",\n    \"1413000 부근 VWMA 이탈과 동시에 매도 거래량 증가 및 MACD 히스토그램 약화가 나타나는 경우\",\n    \"신규 공급계약에서 낮은 마진, 납기 지연, 불리한 원가 부담, 수출 승인 불확실성이 확인되는 경우\",\n    \"2025-12 현금흐름 개선이 운전자본 효과에 그치고 이후 재고·매출채권 또는 총부채 부담이 악화되는 경우\",\n    \"추가 유상증자, 불리한 자금조달, 규제 정정, 풍문 해명 공시가 희석 또는 지배구조 우려를 다시 키우는 경우\",\n    \"코스피 강세에도 012450.KS가 반복적으로 상대약세를 보이며 방산 섹터 수급 이탈이 지속되는 경우\"\n  ],\n  \"watchlist_triggers\": [\n    \"1530000~1550000 위 종가와 최근 4월 수준을 뚜렷하게 넘는 거래량 동반 여부\",\n    \"1459000 부근 10일 EMA에서 낮은 매도 거래량으로 지지되는지 여부\",\n    \"1413000 부근 VWMA가 장중 약세 후에도 종가 기준으로 방어되는지 여부\",\n    \"MACD 히스토그램이 유지 또는 확대되는지, 반대로 가격이 1530000을 회복하지 못한 채 꺾이는지 여부\",\n    \"RSI가 65~70에 접근할 때 가격이 신고가 또는 1655000 전고점권 재시험으로 이어지는지 여부\",\n    \"폴란드·인도네시아 관련 방산 뉴스가 구체적 계약 규모, 일정, 상대방을 포함하는지 여부\",\n    \"1332440 부근 50일선 이탈 또는 ATR이 이미 높은 수준에서 추가 확대되는지 여부\"\n  ],\n  \"data_coverage\": {\n    \"company_news_count\": 3,\n    \"disclosures_count\": 5,\n    \"social_source\": \"news_derived\",\n    \"macro_items_count\": 1\n  }\n}",
  "started_at": "2026-04-14T11:25:16.333700+09:00",
  "finished_at": "2026-04-14T11:37:05.774112+09:00",
  "duration_seconds": 709.44,
  "metrics": {
    "llm_calls": 56,
    "tool_calls": 22,
    "tokens_in": 0,
    "tokens_out": 0,
    "tokens_available": false,
    "calls_by_model": {
      "gpt-5.4": 56
    }
  },
  "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_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"
  }
}