{
  "ticker": "058470.KQ",
  "ticker_name": "리노공업",
  "status": "success",
  "trade_date": "2026-04-15",
  "analysis_date": "2026-04-15",
  "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-14 종가 111600원은 10일 EMA 110323.89원, VWMA 107649.78원, 50일 SMA 105872원, 200일 SMA 66276.99원을 모두 상회하고, MACD가 4월 2일 -389.02에서 4월 14일 2037.97로 회복했으며 RSI 53.49는 과열이 아닌 중립권이다. 또한 영업이익률 약 47.6%, 매출총이익률 약 51.9%, 현금 및 단기투자 4552억원대, 차입금 1억원대, 양의 잉여현금흐름은 프리미엄을 뒷받침한다. 다만 보수적·중립적 분석이 강조한 선행 P/E 약 36배, 2025년 6월 이후 매출과 영업이익 둔화, 외국인 734억원 순매도, 116800-117300원 저항권 앞 거래량 감소, 최근 7일 공시 부재 때문에 신규 진입은 확인이 필요하다. 따라서 방향성은 BULLISH, 기존 보유는 OVERWEIGHT 유지 가능, 즉시 행동은 WAIT이다. 117300원 상향 돌파와 거래량 확대가 동시에 나오거나 107600-110300원 눌림에서 지지를 확인하고 10일 EMA와 VWMA를 회복할 때만 작은 starter가 정당화된다.\",\n  \"exit_logic\": \"기존 보유분은 058470.KQ가 105000-106000원 지지대를 종가 기준으로 유지하는 동안 보유한다. 110000원을 종가로 이탈하거나 117300원 부근에서 반복적으로 거절되고 거래량이 줄어들면 일부 축소한다. 돌파 매수 후 다시 110000원 또는 10일 EMA 아래로 밀리면 실패한 돌파로 보고 추가 매수를 중단한다. 105000원 아래 종가가 나오면 4월 반등 구조와 50일선 지지 시나리오가 훼손된 것으로 보고 방어 전환 또는 청산한다. 이후 하방은 103200원과 99100원 재시험 가능성을 열어둔다.\",\n  \"position_sizing\": \"ATR 7017.89원, 종가 대비 약 6%의 변동성을 감안해 평소보다 낮은 비중으로 운용한다. 기존 보유자는 중간 수준의 OVERWEIGHT는 유지할 수 있으나, 저항 돌파나 눌림 지지 확인 전까지 정상 비중 이상의 추가 확대는 피한다. 신규 자금은 조건 충족 시에만 분할로 접근한다. 117300원 거래량 동반 돌파 또는 107600-110300원 지지 확인 후 starter를 넣고, 이후 110000원과 10일 EMA를 지키며 거래량이 따라올 때만 추가한다. 다음 실적에서 매출 재가속이 확인되기 전에는 펀더멘털 확인 전 비중 확대를 제한한다.\",\n  \"risk_limits\": \"핵심 방어선은 105000-106000원 종가 이탈이다. 그 전 단계에서 110000원 종가 이탈은 단기 모멘텀 약화의 조기 경고로 보고 신규 진입을 멈추거나 일부 축소한다. 107600원 VWMA 부근을 지키지 못하면 눌림 매수 시나리오를 보류한다. 117300원 돌파가 거래량 없이 나오거나 돌파 직후 되밀리면 추격을 금지한다. 변동성이 크므로 손절은 장중 흔들림보다 종가 기준으로 판단하되, 고평가 상태에서 다음 실적이 매출과 영업이익 회복을 보여주지 못하면 밸류에이션 압축 위험을 반영해 비중을 낮춘다.\",\n  \"catalysts\": [\n    \"058470.KQ가 116800-117300원 저항을 거래량 확대와 함께 종가 기준 돌파\",\n    \"4월 13-14일 거래량 578766주와 591983주를 뚜렷하게 넘는 수급 회복\",\n    \"RSI가 60 위로 회복하고 MACD 히스토그램이 409.42에서 재확대\",\n    \"반도체 업종 심리 개선 지속과 AI 메모리·테스트 부품 수요 기대 강화\",\n    \"다음 분기 실적에서 2025년 6월 이후 둔화된 매출과 영업이익의 재가속 확인\",\n    \"건설중인자산 792.9억원에서 1295.0억원 증가와 순유형자산 확대가 수익성 있는 증설로 연결된다는 증거\",\n    \"외국인 734억원 순매도 이후 매도 둔화 또는 순매수 전환\"\n  ],\n  \"invalidators\": [\n    \"105000-106000원 종가 이탈로 50일 SMA 부근 지지와 4월 반등 구조 훼손\",\n    \"110000원 종가 이탈 뒤 10일 EMA 회복 실패\",\n    \"RSI가 50 아래로 하락하고 MACD 히스토그램이 음전환\",\n    \"116800-117300원에서 반복적으로 거절되고 거래량이 계속 감소\",\n    \"다음 실적에서 매출과 영업이익 둔화가 이어져 선행 P/E 약 36배 부담이 커지는 경우\",\n    \"외국인 매도가 지속되는 가운데 반도체 동종주 대비 상대 성과가 약화\",\n    \"개별 공시나 수주·마진·가동률 개선 신호 없이 거시 위험선호만으로 상승한 뒤 되돌림 발생\"\n  ],\n  \"watchlist_triggers\": [\n    \"117300원 위 종가와 최근 4월 13-14일 거래량 578766-591983주를 웃도는 거래량 동반\",\n    \"107600-110300원 구간 눌림 이후 10일 EMA 110323.89원과 VWMA 107649.78원 재상회\",\n    \"RSI 60 상향 돌파와 MACD 히스토그램 재확대\",\n    \"110000원 종가 이탈 시 단기 모멘텀 약화 경고\",\n    \"105000-106000원 접근 시 기존 보유 위험 축소 여부 점검\",\n    \"공식 공시 또는 실적 발표에서 주문, 마진 방어, 설비 가동률, 매출 재가속 확인\",\n    \"외국인 순매도 둔화 또는 순매수 전환 확인\"\n  ],\n  \"data_coverage\": {\n    \"company_news_count\": 3,\n    \"disclosures_count\": 0,\n    \"social_source\": \"news_derived\",\n    \"macro_items_count\": 1\n  }\n}",
  "started_at": "2026-04-15T13:21:54.182910+09:00",
  "finished_at": "2026-04-15T13:33:59.773441+09:00",
  "duration_seconds": 725.59,
  "metrics": {
    "llm_calls": 54,
    "tool_calls": 22,
    "tokens_in": 0,
    "tokens_out": 0,
    "tokens_available": false,
    "calls_by_model": {
      "gpt-5.4": 54
    }
  },
  "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_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
      }
    ]
  },
  "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"
  }
}