{
  "ticker": "058470.KQ",
  "ticker_name": "리노공업",
  "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\": \"058470.KQ는 중기 방향성은 우호적이다. 세 분석진 모두 가격이 10일 지수이동평균, 50일 단순이동평균, 200일 단순이동평균 및 거래량가중평균 위에 있고, MACD가 양수로 회복했으며, RSI 55 수준이 과열이 아니라는 점을 인정했다. 또한 영업이익률 약 32.9%, 순이익률 약 29.2%, 유동비율 7.5 초과, 낮은 부채 부담, 양의 잉여현금흐름은 품질 프리미엄을 뒷받침한다. 다만 최신 유효 종가 113400에서는 즉시 진입하지 않는다. 2026-04-14 강한 KOSDAQ 장세에서 058470.KQ가 하락 예외로 언급된 상대 약세, 2026-04-13 거래량 578766의 부족, 약 6.4% ATR, forward PE 약 36, 그리고 매출이 2025-06-30 112522064120에서 2025-09-30 96841827640, 2025-12-31 84759949280으로 둔화된 점이 아직 확인되지 않은 위험이다. 따라서 방향성은 BULLISH로 유지하되, 즉시 행동은 WAIT이다. 116800 상향 돌파가 1000000주 초과 거래량과 상대강도 회복을 동반하거나, 110000 부근 조정 후 105000-106000 위험선 위에서 안정화되고 113400 회복 또는 폭 개선이 확인될 때만 소규모 시작 진입을 검토한다.\",\n  \"exit_logic\": \"기존 보유분은 058470.KQ가 105000-106000의 50일 단순이동평균 지지권 위에서 마감하고 단기 모멘텀이 유지되는 동안 보유한다. 일봉 종가가 105000 아래로 내려가면 중기 상승 구조 훼손으로 보고 감축 또는 청산한다. 지지 이탈 후 10일 지수이동평균을 회복하지 못하거나, KOSDAQ 대비 고거래량 상대 약세가 반복되면 위험을 줄인다. 127000 재시험 구간에서 거래량 확장 없이 상승하거나 RSI가 과열권에 접근하면 기존 보유분은 일부 이익실현 또는 재평가한다.\",\n  \"position_sizing\": \"오늘 113400 부근에서는 신규 전체 포지션을 열지 않는다. 116800을 종가 기준 돌파하고 거래량이 1000000주를 넘으며 KOSDAQ 대비 상대강도 회복이 확인될 경우 의도한 총 비중의 20%-25%만 STARTER로 시작한다. 돌파 후 두 번째 종가가 116800 위에서 유지되고 고거래량 반전이 없으면 33%까지 확대할 수 있다. 110000 부근 조정 진입도 첫 접촉이 아니라 안정화, 105000-106000 방어, 113400 회복 또는 폭 개선이 확인될 때만 20%-25%로 제한한다. 추가 매수는 116800 위 안착, 상대강도 개선, 또는 다음 실적에서 매출 재가속과 마진 방어가 확인된 뒤에만 허용한다.\",\n  \"risk_limits\": \"ATR이 약 7212, 가격 대비 약 6.4%로 커서 촘촘한 손절보다 변동성 조정 위험관리가 필요하다. 진입 시 105000 하회까지의 손실이 통상 단일 종목 위험예산을 넘지 않도록 수량을 역산한다. 거래량이 600000 아래에 머물며 116800 아래에서 정체되면 추가하지 않는다. KOSDAQ 강세에도 058470.KQ의 상대 약세가 이어지거나, 다음 분기 매출이 2025-12-31 84759949280에서 반등하지 못하거나, 설비투자 및 건설중인자산 증가가 마진과 자본효율을 압박하면 비중 확대를 금지한다.\",\n  \"catalysts\": [\n    \"058470.KQ가 116800 위에서 종가 마감하고 거래량이 1000000주를 넘으며 KOSDAQ 대비 상대강도가 회복되는 경우\",\n    \"116800 돌파 후 두 번째 종가가 해당 가격 위에서 유지되고 고거래량 반전 없이 127000 재시험 가능성이 높아지는 경우\",\n    \"다음 분기 매출이 84759949280에서 반등하고 영업이익률이 과거 높은 수준에 가깝게 유지되는 경우\",\n    \"2026-03-26 기업가치 제고 계획이 측정 가능한 주주환원, 자본효율 목표, 현금 활용 방안으로 구체화되는 경우\",\n    \"KOSDAQ 및 반도체 부품 순환매가 최근 소외된 고품질 종목으로 확산되는 경우\"\n  ],\n  \"invalidators\": [\n    \"058470.KQ가 일봉 종가 기준 105000-106000 지지권을 이탈하는 경우\",\n    \"116800 아래에서 반복적으로 실패하고 거래량이 줄며 KOSDAQ 대비 상대 약세가 지속되는 경우\",\n    \"다음 분기 매출이 2025-06-30, 2025-09-30, 2025-12-31로 이어진 하락 추세를 멈추지 못하는 경우\",\n    \"설비투자와 건설중인자산 증가가 매출 회복 없이 감가상각 부담, 마진 압박, 자본효율 저하로 연결되는 경우\",\n    \"영업이익률 압박으로 forward PE 약 36의 프리미엄 밸류에이션이 정당화되지 못하는 경우\",\n    \"기업가치 제고 또는 배당 관련 공시가 구체성 없이 시장 기대에 미달하는 경우\"\n  ],\n  \"watchlist_triggers\": [\n    \"058470.KQ가 116800 위에서 종가 마감하고 거래량이 1000000주를 초과하면 entry_action을 STARTER로 상향하되 첫 비중은 20%-25%로 제한한다\",\n    \"058470.KQ가 116800 돌파 후 두 번째 종가도 해당 가격 위에서 유지하고 상대강도가 개선되면 33%까지 확대를 검토한다\",\n    \"058470.KQ가 110000 부근으로 조정받은 뒤 105000-106000 위를 방어하고 113400을 회복하면 STARTER를 검토한다\",\n    \"058470.KQ가 105000 아래에서 종가 마감하면 portfolio_stance를 NEUTRAL 쪽으로 낮추고 기존 위험을 감축한다\",\n    \"거래량이 600000 아래에 머물며 가격이 116800 아래에서 정체되면 WAIT을 유지한다\",\n    \"다음 실적에서 매출 반등과 마진 방어가 동시에 확인되면 setup_quality를 COMPELLING 쪽으로 상향 검토한다\"\n  ],\n  \"data_coverage\": {\n    \"company_news_count\": 1,\n    \"disclosures_count\": 6,\n    \"social_source\": \"news_derived\",\n    \"macro_items_count\": 4\n  }\n}",
  "started_at": "2026-04-14T11:56:19.853812+09:00",
  "finished_at": "2026-04-14T12:09:32.790744+09:00",
  "duration_seconds": 792.94,
  "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_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": "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"
  }
}