{
  "ticker": "058470.KQ",
  "ticker_name": "리노공업",
  "status": "success",
  "trade_date": "2026-04-16",
  "analysis_date": "2026-04-16",
  "decision": "{\n  \"rating\": \"HOLD\",\n  \"portfolio_stance\": \"BULLISH\",\n  \"entry_action\": \"WAIT\",\n  \"setup_quality\": \"DEVELOPING\",\n  \"confidence\": 0.67,\n  \"time_horizon\": \"medium\",\n  \"entry_logic\": \"058470.KQ는 중기적으로 투자 가능한 품질과 추세를 유지한다. 공격적 분석가와 중립 분석가가 지적한 대로 영업이익률 약 32.9%, 순이익률 약 29.2%, 2025년 각 분기 양의 잉여현금흐름, 현금 및 단기금융자산 약 455.2 billion KRW, 차입금 약 113 million KRW의 순현금 구조는 프리미엄을 뒷받침한다. 또한 2026-01-23의 68700에서 2026-03-06의 127000까지 상승한 뒤 2026-03-31의 94400까지 조정되고 2026-04-15에 112800까지 회복했으며, 10일 지수이동평균, 거래량가중이동평균, 50일 단순이동평균, 200일 단순이동평균 위에 있어 추세가 훼손됐다고 보기 어렵다. 다만 보수적 분석가가 강조한 것처럼 2025-06 매출 약 112.5 billion KRW에서 2025-09 약 96.8 billion KRW, 2025-12 약 84.8 billion KRW로 둔화됐고 영업이익도 약 53.4 billion KRW에서 48.3 billion KRW, 40.4 billion KRW로 감소했다. forward PER 약 36.7, 얇은 회사별 뉴스, RSI 54.47, MACD 히스토그램 둔화는 오늘 신규 매수를 정당화하지 못한다. 따라서 방향성은 건설적이나 즉시 진입은 보류한다. 신규 자금은 116800을 명확히 상회하는 거래량 동반 종가 돌파, 또는 106000-110000 구간에서 매도 거래량이 줄고 강한 반등 거래량이 확인될 때만 starter로 검토한다.\",\n  \"exit_logic\": \"기존 보유분은 중간 수준의 핵심 비중만 유지한다. 058470.KQ가 106000 아래로 종가 이탈하고 거래량이 확대되면 단기 반등 구조와 50일선 지지가 약화되므로 전술 비중을 축소하거나 청산한다. 106000 이탈 후 100000을 지키지 못하면 중기 가정도 재평가하고 잔여 전술 노출을 추가로 줄인다. 반대로 120000-127000 저항권에 접근했는데 거래량이 늘지 않거나 MACD와 RSI가 재가속하지 못하면 일부 이익 실현이 적절하다. 다음 실적에서 매출 안정화, 마진 방어, 증설 자산의 매출 전환이 확인되지 않으면 HOLD 판단을 낮출 수 있다.\",\n  \"position_sizing\": \"오늘은 신규 자금 투입을 보류한다. 기존 보유자는 ATR이 가격의 약 5.95%로 높다는 점을 반영해 보통보다 낮거나 중간 수준의 핵심 비중만 유지한다. 116800 거래량 돌파 또는 106000-110000 지지 반등이 확인되면 정상 비중이 아니라 starter만 허용하고, 이후 돌파선 재확인이나 더 높은 거래량의 후속 상승이 있을 때 단계적으로 증액한다. 111000-116800 박스 안에서는 공격적 추가 매수를 피한다.\",\n  \"risk_limits\": \"1차 위험선은 106000 종가 이탈이며, 2차 하방 기준은 100000이다. ATR이 약 5.95%이므로 5-8%의 정상 변동이 포트폴리오 손실 한도를 넘지 않도록 starter 크기를 제한한다. forward PER 약 36.7, 최근 분기 실적 둔화, 혼재된 상대강도, 회사별 촉매 부족을 고려해 116800 위 돌파도 평균 이상 거래량이 없으면 추격하지 않는다. 시장이 강한데 058470.KQ가 계속 뒤처지면 신규 진입 기준을 더 엄격히 적용한다.\",\n  \"catalysts\": [\n    \"058470.KQ가 116800 위에서 평균 이상 거래량을 동반해 일봉 종가를 형성\",\n    \"돌파 이후 120000, 127000 저항권을 향한 후속 상승과 거래량 확장\",\n    \"다음 실적에서 2025-06 이후 둔화된 매출과 영업이익의 안정화 또는 재가속 확인\",\n    \"construction-in-progress가 약 79.3 billion KRW에서 129.5 billion KRW로 증가한 점과 순유형자산 증가가 실제 가동률 및 매출 성장으로 연결되는 증거\",\n    \"테스트 소켓 수요, 주요 고객, 목표가 상향, 자사주, 주주환원 개선 등 회사별 뉴스\",\n    \"AI, 5G, 고성능 컴퓨팅, 첨단 패키징 관련 반도체 테스트 수요의 지속\"\n  ],\n  \"invalidators\": [\n    \"106000 아래 종가 이탈과 거래량 확대\",\n    \"106000 이탈 이후 100000 지지 실패\",\n    \"다음 분기에도 매출과 영업이익 감소가 이어지고 회복 신호가 부재\",\n    \"마진 압박으로 프리미엄 밸류에이션 논리가 약화\",\n    \"강한 시장 환경에서도 058470.KQ의 상대 약세가 지속\",\n    \"고객 수요 둔화, 부정적 공시, 증설 투자 수익성 훼손을 시사하는 증거\"\n  ],\n  \"watchlist_triggers\": [\n    \"058470.KQ의 116800 상회 일봉 종가와 최근 평균을 뚜렷하게 웃도는 거래량\",\n    \"가격 강세와 함께 RSI가 60 위로 회복\",\n    \"110000-106000 구간으로 조정될 때 매도 거래량이 감소하고 이후 더 강한 거래량으로 반등\",\n    \"조정 이후 거래량가중이동평균과 10일 지수이동평균 위에서 종가 유지\",\n    \"반도체 테스트 수요와 연결된 회사별 공시 또는 애널리스트 추정치 상향\",\n    \"다음 실적에서 매출 안정화, 마진 회복력, 잉여현금흐름 품질 확인\"\n  ],\n  \"data_coverage\": {\n    \"company_news_count\": 1,\n    \"disclosures_count\": 0,\n    \"social_source\": \"news_derived\",\n    \"macro_items_count\": 2\n  }\n}",
  "started_at": "2026-04-16T10:47:52.283582+09:00",
  "finished_at": "2026-04-16T11:01:43.993970+09:00",
  "duration_seconds": 831.71,
  "metrics": {
    "llm_calls": 64,
    "tool_calls": 22,
    "tokens_in": 0,
    "tokens_out": 0,
    "tokens_available": false,
    "calls_by_model": {
      "gpt-5.4": 64
    }
  },
  "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_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": "fallback",
        "fallback": true,
        "note": "opendart: empty or unusable result"
      },
      {
        "method": "get_macro_news",
        "vendor": "alpha_vantage",
        "status": "success",
        "fallback": false,
        "note": null
      },
      {
        "method": "get_company_news",
        "vendor": "naver",
        "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
      }
    ],
    "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"
  }
}