{
  "ticker": "064400.KS",
  "ticker_name": "LG CNS",
  "status": "success",
  "trade_date": "2026-04-17",
  "analysis_date": "2026-04-17",
  "decision": "{\n  \"rating\": \"HOLD\",\n  \"portfolio_stance\": \"BULLISH\",\n  \"entry_action\": \"WAIT\",\n  \"setup_quality\": \"DEVELOPING\",\n  \"confidence\": 0.68,\n  \"time_horizon\": \"medium\",\n  \"entry_logic\": \"064400.KS의 중기 방향성은 건설적이지만, 오늘 즉시 추격 매수할 정도로 진입 조건이 완성되지는 않았다. 공격적 분석이 지적한 대로 2026-04-16 종가 67,100은 50일선 64,619.69와 200일선 65,547.06을 모두 회복했고, MACD도 -439.99에서 34.56으로 플러스 전환했으며 거래량도 2026-04-15 804,682주, 2026-04-16 771,022주로 개선됐다. 또한 KRW 6.13T LTM 매출, 10.95% 영업이익률, 17.34% ROE, KRW 1.68T 현금 및 단기투자자산, forward PER 약 12.4x는 투자 가능한 기본 체력을 뒷받침한다. 다만 보수적·중립적 분석이 강조한 것처럼 50일선은 아직 200일선 아래이고, ATR 2,945.12로 종가 대비 약 4.4% 변동성이 크며, 가격은 10일 EMA 62,698.17 및 VWMA 60,882.70보다 상당히 위에 있어 단기 되돌림 위험이 있다. 따라서 방향성은 BULLISH로 유지하되, 신규 자금은 65,500-66,000 지지 확인 또는 67,200 위 거래량 동반 종가 안착 전까지 WAIT가 적절하다. 조건이 충족되면 소규모 starter는 정당화될 수 있지만, 현재는 전면 매수 신호가 아니다.\",\n  \"exit_logic\": \"기존 보유분은 064400.KS가 65,500 전후의 200일선 부근 지지와 64,600 핵심 종가 방어선을 유지하는 한 보유한다. 65,500 하회는 경고 신호로 보고 신규 매수 계획을 중단하며, 64,600 아래 종가 이탈은 감축 또는 재검토 기준으로 삼는다. 특히 이탈이 거래량 약화, 200일선 재회복 실패, 또는 MACD 둔화와 동반되면 방어적으로 전환한다. 하락 모멘텀이 재개되면 62,700 부근 10일 EMA와 약 60,900 VWMA까지 되돌림 위험을 다시 평가한다. 실적 공시나 IR에서 마진 훼손, 수주 둔화, 현금전환 악화, AI·자동화 매출화 부재가 확인될 경우에도 기존 강세 가정을 낮춘다.\",\n  \"position_sizing\": \"기존 핵심 보유분은 정상 또는 약간 낮은 비중으로 유지한다. 신규 자금은 추격하지 않고 두 단계로만 접근한다. 첫째, 65,500-66,000 부근 지지를 확인하고 종가가 200일선 위에서 안정되면 작은 starter를 허용한다. 둘째, 67,200 위에서 거래량이 최근 771,022-804,682주 범위를 의미 있게 넘고 종가가 유지되면 추가 starter를 검토한다. ATR이 약 4.4%로 높고 실적·IR, R&D, M&A, 운전자본 리스크가 남아 있으므로 full allocation은 실적과 가격 확인 이후로 미룬다.\",\n  \"risk_limits\": \"65,500은 1차 경고선, 64,600은 핵심 종가 기준 감축·재검토선이다. 장중 변동성만으로 기계적으로 대응하기보다 종가, 거래량, 200일선 재회복 여부를 함께 본다. 67,200 돌파 시도 후 재차 200일선 아래로 밀리면 신규 매수 계획을 중단한다. 70,000-72,500은 1차 공급 구간으로 비중 확대를 자제하거나 일부 위험 축소를 검토한다. 단일 종목 위험은 modest하게 유지한다. R&D가 매출 대비 0.8%이고 전년 대비 감소했다는 우려, M&A가 아직 검토 단계라는 점, 2025년 4분기 매출채권 변화 -5,234억 원과 투자현금흐름 -3,259억 원, 리스부채 증가 가능성은 모두 포지션 한도를 제한하는 요인이다.\",\n  \"catalysts\": [\n    \"064400.KS가 65,500-66,000 지지대를 방어하고 종가 기준 200일선 위 안정성을 확인한다.\",\n    \"064400.KS가 67,200 위에서 거래량이 최근 771,022-804,682주 범위를 의미 있게 넘는 종가 안착을 보인다.\",\n    \"실적 공시와 IR에서 수주잔고, 매출 성장, 10% 안팎의 마진 내구성, 현금전환, AI·클라우드·자동화 수요가 확인된다.\",\n    \"피지컬 AI, 모바일 셔틀, 물류 자동화, 클라우드·AI 프로젝트가 고객명, 계약 규모, 반복 매출 또는 실적 기여로 구체화된다.\",\n    \"로봇 또는 AI M&A가 검토 단계에서 합리적 밸류에이션과 전략적 적합성을 갖춘 발표로 진전된다.\",\n    \"R&D 투자 방향이 개선되어 AI·로봇 성장 내러티브의 신뢰도 우려를 낮춘다.\"\n  ],\n  \"invalidators\": [\n    \"064400.KS가 64,600-65,500 지지 구간을 종가 기준으로 이탈해 50일선과 200일선 회복이 실패 신호로 바뀐다.\",\n    \"67,200 돌파 시도 후 거래량이 붙지 않거나 종가가 다시 200일선 아래로 밀린다.\",\n    \"실적 또는 IR에서 마진 하락, 수주 둔화, 현금전환 악화, 매출채권 부담, AI·자동화 매출화 부재가 확인된다.\",\n    \"R&D 비용이 매출 대비 0.8% 수준에 머물거나 더 낮아져 AI·로봇 성장 논리와 기술 내재화 신뢰도가 약해진다.\",\n    \"M&A가 반복 지연되거나 발표된 거래가 고가 인수, 희석, 전략 부적합, 통합 비용 부담으로 해석된다.\",\n    \"운전자본 부담, 매출채권 회수 지연, 리스부채 증가, 투자현금흐름 유출이 현재 예상보다 악화된다.\"\n  ],\n  \"watchlist_triggers\": [\n    \"다음 거래일 064400.KS가 급반등 이후 65,500-66,000을 방어하는지 확인한다.\",\n    \"67,200 위 종가 안착과 거래량이 최근 771,022-804,682주 범위를 의미 있게 넘는지 확인한다.\",\n    \"70,000-72,500 1차 저항·공급 구간에서 가격이 밀리는지, 아니면 거래량으로 흡수하는지 관찰한다.\",\n    \"75,500-76,900 이전 고점 저항대에 접근할 경우 실적·IR 확인 없이 단순 테마로 돌파를 시도하는지 점검한다.\",\n    \"OpenDART 실적 공시와 IR에서 매출 성장, 영업이익률, 정상화 이익, 매출채권, 자유현금흐름, 신사업 기여를 확인한다.\",\n    \"AI·로봇 M&A, R&D 예산 방향, 물류 자동화 고객 수주와 관련된 뉴스 또는 공시를 추적한다.\"\n  ],\n  \"data_coverage\": {\n    \"company_news_count\": 3,\n    \"disclosures_count\": 2,\n    \"social_source\": \"news_derived\",\n    \"macro_items_count\": 1\n  }\n}",
  "started_at": "2026-04-17T10:03:13.714866+09:00",
  "finished_at": "2026-04-17T10:16:15.733939+09:00",
  "duration_seconds": 782.02,
  "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_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_cashflow",
        "vendor": "yfinance",
        "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_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"
  },
  "intraday_snapshot_attempts": [
    {
      "ticker": "064400.KS",
      "attempted": true,
      "success": true,
      "checkpoint": "10:05",
      "interval": "5m",
      "attempted_at": "2026-04-17T10:40:50.468573+09:00",
      "provider": "yfinance_intraday",
      "market_data_asof": "2026-04-17T10:20:00+09:00"
    },
    {
      "ticker": "064400.KS",
      "attempted": true,
      "success": true,
      "checkpoint": "selective_rerun",
      "interval": "5m",
      "attempted_at": "2026-04-17T10:56:51.346375+09:00",
      "provider": "yfinance_intraday",
      "market_data_asof": "2026-04-17T10:35:00+09:00"
    },
    {
      "ticker": "064400.KS",
      "attempted": true,
      "success": true,
      "checkpoint": "12:35",
      "interval": "5m",
      "attempted_at": "2026-04-17T13:16:00.194434+09:00",
      "provider": "yfinance_intraday",
      "market_data_asof": "2026-04-17T12:55:00+09:00"
    }
  ],
  "latest_intraday_snapshot_attempt": {
    "ticker": "064400.KS",
    "attempted": true,
    "success": true,
    "checkpoint": "12:35",
    "interval": "5m",
    "attempted_at": "2026-04-17T13:16:00.194434+09:00",
    "provider": "yfinance_intraday",
    "market_data_asof": "2026-04-17T12:55:00+09:00"
  },
  "intraday_snapshot_latest_attempt": {
    "ticker": "064400.KS",
    "attempted": true,
    "success": true,
    "checkpoint": "12:35",
    "interval": "5m",
    "attempted_at": "2026-04-17T13:16:00.194434+09:00",
    "provider": "yfinance_intraday",
    "market_data_asof": "2026-04-17T12:55:00+09:00"
  }
}