{
  "ticker": "058470.KQ",
  "ticker_name": "리노공업",
  "status": "success",
  "trade_date": "2026-04-15",
  "analysis_date": "2026-04-16",
  "decision": "{\n  \"rating\": \"OVERWEIGHT\",\n  \"portfolio_stance\": \"BULLISH\",\n  \"entry_action\": \"WAIT\",\n  \"setup_quality\": \"DEVELOPING\",\n  \"confidence\": 0.66,\n  \"time_horizon\": \"medium\",\n  \"entry_logic\": \"058470.KQ는 중기적으로 비중확대 후보로 유지한다. 공격적 분석가가 지적한 것처럼 가격은 2026-04-15 기준 10일 EMA 110,774와 상승 중인 50일 SMA 106,286 위에 있고, MACD도 2026-04-02 -389에서 2026-04-15 2,115로 회복해 반등 구조가 살아 있다. 다만 보수적·중립적 분석가가 공통으로 지적한 115,000-120,000 저항 미돌파, 최근 거래량 0.58-0.59M 수준 둔화, 기관 매도 부담 때문에 오늘 즉시 추격 매수는 하지 않는다. 신규 진입은 106,000-108,000 지지 확인 또는 120,000 이상 종가 돌파와 1.0M주 이상 거래량, 이후 115,000-120,000 지지 재확인을 기다린다.\",\n  \"exit_logic\": \"기존 보유분은 유지 가능하지만 방어 기준을 명확히 둔다. 106,000 종가 이탈은 50일 SMA 지지 훼손으로 보고 감축한다. 96,000-98,000 재진입 또는 이탈은 3월 저점대 재시험으로 간주해 투자 논리를 재평가하거나 상당 부분 청산한다. 115,000-120,000에서 재차 거절되고 거래량이 줄거나 기관 매도가 재강화되면 추가 매수가 아니라 일부 차익 실현 또는 비중 축소 신호로 본다.\",\n  \"position_sizing\": \"확인 전 신규 풀 포지션은 금지한다. 유효한 지지 확인 또는 돌파 후 첫 진입은 목표 비중의 25-30%를 기본으로 하며, 거래량이 강하고 다음 거래일 지지 재확인이 동반될 때만 35%까지 허용한다. 공격적 분석가의 25-40% 제안은 상승 재개 가능성을 반영하지만, 보수적 분석가가 지적한 고PER·수급 혼재·저항 부담을 감안해 상단을 낮춘다. 추가 매수는 외국인 순매수 지속, 기관 매도 둔화, 돌파 후 재지지 확인 때만 단계적으로 한다.\",\n  \"risk_limits\": \"ATR 약 6,700 KRW, 가격 대비 약 6% 변동성을 감안해 1-2%의 좁은 손절은 사용하지 않는다. 106,000 종가 이탈은 전술적 위험선, 96,000-98,000은 중기 논리 훼손 구간으로 둔다. 선행 PER 36.7은 영업이익률 32.9%, 순이익률 29.2%, 현금 및 단기투자 4,552억 원, 총부채 607억 원이라는 우량성을 반영하지만, 2025-12 매출 847.6억 원이 2025-06 1,125.2억 원과 2025-09 968.4억 원보다 둔화된 점이 개선되지 않으면 밸류에이션 리스크를 재평가한다.\",\n  \"catalysts\": [\n    \"058470.KQ가 120,000 이상에서 종가 마감하고 거래량이 1.0M주 이상으로 회복해 115,000-120,000 매물 흡수를 확인한다.\",\n    \"돌파 다음 거래일에 115,000-120,000 구간을 재지지해 단순 장중 돌파가 아님을 확인한다.\",\n    \"외국인 순매수가 지속되고 기관 매도 압력이 둔화된다.\",\n    \"반도체 테스트 소켓 수요와 고객사 투자 사이클 회복 증거가 확인된다.\",\n    \"다음 실적에서 2025-12 매출 둔화가 일시적이었고 영업이익률 30%대가 유지됨을 확인한다.\",\n    \"KRW 안정과 KOSDAQ 반도체 위험선호가 이어진다.\"\n  ],\n  \"invalidators\": [\n    \"058470.KQ가 106,000 아래에서 종가 마감해 50일 SMA 인근 지지와 반등 구조가 약화된다.\",\n    \"가격이 96,000-98,000으로 재진입하거나 이탈해 3월 저점대 재시험 국면으로 돌아간다.\",\n    \"115,000-120,000 저항에서 거래량 둔화와 함께 재차 거절되고 기관 매도가 강화된다.\",\n    \"2025-12 매출 둔화 이후에도 매출 재가속 증거가 나오지 않는다.\",\n    \"건설중인자산 증가가 매출 성장으로 연결되지 않아 자본효율 저하 우려가 커진다.\",\n    \"신규 공시나 실적에서 마진 압박, 고객 주문 약화, 증설 투자 수익성 저하가 확인된다.\"\n  ],\n  \"watchlist_triggers\": [\n    \"120,000 이상 종가와 1.0M주 이상 거래량이 동시에 발생한다.\",\n    \"106,000-108,000 구간에서 종가 지지와 거래량 안정이 확인된다.\",\n    \"돌파 후 다음 거래일에 115,000-120,000 구간을 지지한다.\",\n    \"MACD가 양수권을 유지하고 RSI가 60 이상으로 회복하되 볼린저 상단에서 과도하게 이격되지 않는다.\",\n    \"외국인 순매수 지속과 기관 매도 둔화가 함께 나타난다.\",\n    \"다음 실적 또는 가이던스에서 매출 재가속과 높은 영업이익률 지속이 확인된다.\"\n  ],\n  \"data_coverage\": {\n    \"company_news_count\": 5,\n    \"disclosures_count\": 0,\n    \"social_source\": \"news_derived\",\n    \"macro_items_count\": 2\n  }\n}",
  "started_at": "2026-04-16T03:01:32.283662+09:00",
  "finished_at": "2026-04-16T03:13:43.781207+09:00",
  "duration_seconds": 731.5,
  "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": 5,
    "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": "fallback",
        "fallback": true,
        "note": "opendart: empty or unusable result"
      },
      {
        "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"
  ],
  "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"
  }
}