{
  "ticker": "064400.KS",
  "ticker_name": "LG CNS",
  "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.6,\n  \"time_horizon\": \"medium\",\n  \"entry_logic\": \"064400.KS에 대한 방향성은 건설적이다. 공격적 분석이 지적한 TTM 매출 6.13조 원, 순이익 4,379억 원, ROE 17.3%, Forward PE 11.64, 배당수익률 3.04%, 현금 및 단기투자자산 1.68조 원 대비 총차입금 7,717억 원은 단순 테마주가 아니라는 근거다. 또한 MACD 히스토그램이 2026-04-07 -354.81에서 2026-04-08 0.69로 양전환하고 2026-04-13 557.27을 유지한 점은 매도 압력 둔화를 시사한다. 그러나 보수적·중립적 분석이 맞게 지적했듯 2026-04-13 종가 60900은 63000-63300 매물대, 50D SMA 64832.36, 200D SMA 65877.95 아래이며, 2026-04-10 63300 회복 시도 후 60900으로 밀렸다. 따라서 오늘 즉시 매수할 실행 근거는 부족하다. 63300 위 종가와 거래량 확장이 첫 조건이며, 50D SMA 위 안착이 확인될 때 setup_quality를 상향한다.\",\n  \"exit_logic\": \"기존 보유분은 59680 부근 거래량가중평균과 59000-60000 방어 구간을 종가 기준으로 이탈하면 축소한다. 55800은 최종 재검토선이며, 그 전에 이미 위험 축소가 진행되어야 한다는 보수적 분석을 반영한다. 55800 종가 이탈, 63000-63300 반복 실패와 MACD 재악화, 계약 공시의 낮은 규모·마진, 운전자본 회수 악화, 주요 주주 또는 임원 매도 신호가 확인되면 중기 상승 논리를 무효화한다.\",\n  \"position_sizing\": \"신규 전체 포지션은 오늘 열지 않는다. 064400.KS가 63300 위에서 종가를 만들고 거래량이 최근보다 확장될 경우에만 정상 포지션의 15%-25% 수준으로 시험 진입을 허용한다. 이는 공격적 분석의 조건부 참여 논리와 보수적·중립적 분석의 고변동성 경고를 절충한 것이다. 50D SMA 64832.36 위에서 1-2회 종가 유지, RSI 50 회복, MACD 본선 개선이 함께 확인되면 추가를 검토한다. 200D SMA 65877.95 회복 전까지 총 노출은 정상 수준 이하로 제한한다.\",\n  \"risk_limits\": \"ATR이 약 3015 KRW로 2026-04-13 종가 60900의 약 5.0%에 해당하므로 촘촘한 장중 손절보다 작은 포지션과 종가 기준 방어선을 사용한다. 63000 아래에서는 확정 수주, 실적, 또는 현금회수 개선 같은 새 촉매가 없으면 추가하지 않는다. 59680 이탈 시 즉시 위험을 재평가하고, 59000-60000 이탈 시 기존 노출을 줄이며, 55800 종가 이탈 시 상승 논리를 재검토한다.\",\n  \"catalysts\": [\n    \"064400.KS의 차세대 K-Edufine 공공 시스템 참여 또는 수주 확정\",\n    \"2026-04-01 단일판매·공급계약 공시의 금액, 상대방, 마진, 기간이 의미 있게 확인되는 경우\",\n    \"2027년 2월 예정된 토큰증권 제도 시행을 앞두고 064400.KS가 직접 구현 파트너로 확인되는 경우\",\n    \"FuriosaAI RNGD 기반 AI 인프라 서비스에서 SamsungSDS와 LG CNS의 상용 고객 채택 또는 성능 검증\",\n    \"국민연금 지분 약 5.7% 수준의 안정 또는 증가와 기관 수급 유지\",\n    \"다음 보고 기간에서 매출채권 회수와 운전자본 전환 개선 확인\"\n  ],\n  \"invalidators\": [\n    \"064400.KS가 59000-60000 방어 구간을 종가 기준으로 이탈한 뒤 55800도 종가 기준으로 하회\",\n    \"63000-63300 재돌파에 반복 실패하고 MACD 히스토그램이 다시 음전환\",\n    \"RSI가 50 아래에 머물고 MACD 본선이 0선 아래에서 추가 악화\",\n    \"2026-04-01 계약 공시 세부 내용이 소규모, 저마진, 또는 불리한 조건으로 확인\",\n    \"매출 증가에도 매출채권과 운전자본 유출이 다음 보고 기간에 계속 악화\",\n    \"대량보유, 최대주주, 임원 또는 보호예수 관련 공시에서 의미 있는 매도 압력 확인\"\n  ],\n  \"watchlist_triggers\": [\n    \"064400.KS가 63300 위에서 종가를 만들고 최근보다 높은 거래량을 동반하면 15%-25% 시험 진입 후보로 전환\",\n    \"50D SMA 64832.36 위에서 1-2회 종가 유지 시 setup_quality를 COMPELLING에 가깝게 상향 검토\",\n    \"200D SMA 65877.95 회복 시 중기 추세 복원 확인\",\n    \"59680 부근 거래량가중평균과 59000-60000 방어 구간을 pullback에서 유지\",\n    \"RSI가 50 위로 회복하고 MACD 본선이 0선 쪽으로 개선\",\n    \"K-Edufine, 토큰증권, AI 인프라 관련 뉴스가 참여 가능성이나 과거 이력 언급이 아니라 실제 신규 매출로 연결되는지 확인\",\n    \"2026-04-03 대량보유·최대주주·임원 보유 공시의 방향성이 매도 압력인지 안정적 보유인지 확인\"\n  ],\n  \"data_coverage\": {\n    \"company_news_count\": 3,\n    \"disclosures_count\": 5,\n    \"social_source\": \"news_derived\",\n    \"macro_items_count\": 0\n  }\n}",
  "started_at": "2026-04-14T12:09:32.793976+09:00",
  "finished_at": "2026-04-14T12:21:15.101449+09:00",
  "duration_seconds": 702.31,
  "metrics": {
    "llm_calls": 58,
    "tool_calls": 21,
    "tokens_in": 0,
    "tokens_out": 0,
    "tokens_available": false,
    "calls_by_model": {
      "gpt-5.4": 58
    }
  },
  "tool_telemetry": {
    "total_tool_calls": 21,
    "vendor_calls": {
      "yfinance": 14,
      "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_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_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": "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"
  }
}