{
  "ticker": "095340.KQ",
  "ticker_name": "ISC",
  "status": "success",
  "trade_date": "2026-04-13",
  "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.63,\n  \"time_horizon\": \"medium\",\n  \"entry_logic\": \"095340.KS는 중기 방향성은 긍정적이지만 오늘 즉시 신규 진입할 만큼 매수 확인은 완성되지 않았다. 공격 측이 지적한 2025-12-31 매출 72.33bn KRW, 영업이익 21.97bn KRW, 영업이익률 약 30.4%, 잉여현금흐름 18.16bn KRW, 현금 및 단기투자 343.88bn KRW 대비 차입금 21.19bn KRW는 강한 기본 체력을 뒷받침한다. 그러나 보수 및 중립 측이 지적한 MACD 하락, 히스토그램 -3,542.1, RSI 46.66, ATR 약 25,120 KRW, 2026-04-10 장중 변동폭 48,500 KRW는 단기 매수 주도권이 약해졌음을 보여준다. 따라서 방향성은 BULLISH로 유지하되 entry_action은 WAIT이다. 250,000-253,000 공급 및 VWMA 구간을 거래량 증가와 함께 종가로 회복하고, 다음 거래일에도 250,000 위를 유지하거나 장중 지지가 확인될 때만 STARTER가 정당화된다. 271,000 돌파는 추가 매수 검토, 292,500 돌파는 추세 재가속 확인 구간으로 본다.\",\n  \"exit_logic\": \"기존 보유자는 240,000 위에서는 축소된 핵심 보유를 유지할 수 있다. 다만 250,000-253,000 구간에서 반복적으로 밀리거나, 240,000을 거래량 동반 종가로 이탈하면 전술 비중을 줄인다. 50일선 약 201,390 이탈은 중기 상승 구조 훼손으로 보고 물량을 크게 줄이거나 청산한다. 다음 실적에서 CPO 및 테스트 소켓 기대가 매출로 확인되지 않거나, 영업이익률 압박과 함께 매출채권 69.84bn KRW 및 재고 25.01bn KRW의 질이 악화되면 투자 논리를 재평가한다.\",\n  \"position_sizing\": \"오늘 신규 풀 포지션은 금지한다. 기존 보유 비중은 정상 단일 종목 비중보다 낮게 유지한다. 250,000-253,000 회복이 단순히 양호한 수준이면 정상 비중의 1/4 이내 STARTER만 허용한다. 회복이 거래량 증가, RSI 50 회복, MACD 히스토그램 개선, 다음 거래일 유지까지 동반되면 정상 비중의 약 1/3까지 가능하다. 정상 비중의 1/2은 271,000 돌파와 강한 회전율이 확인된 뒤에만 검토한다.\",\n  \"risk_limits\": \"전술 위험선은 240,000이며, 신규 진입 후 이 구간을 빠르게 되깨면 손실을 제한한다. 50일선 약 201,390은 신규 매수의 손절선이 아니라 중기 논리 훼손선으로 본다. ATR 약 25,120 KRW를 감안해 좁은 손절보다 변동성 조정 기준을 쓰되, 평균단가 낮추기는 VWMA 아래에서 금지한다. 2025-10-13의 80,543.3에서 2026-04-10의 257,500까지 큰 재평가가 이미 진행됐으므로 과도한 단일 종목 집중을 피한다. 교환권 행사, 자기주식 처분 정정, 지배구조 변화에 따른 공급 부담도 노출 한도에 반영한다.\",\n  \"catalysts\": [\n    \"SOL AI반도체TOP2플러스 편입은 095340.KS에 패시브 및 테마 수급 유입 가능성을 만든다.\",\n    \"AI 반도체, CPO, 광통신, 테스트 소켓 수요는 현재 시장이 선호하는 성장 테마와 맞닿아 있다.\",\n    \"2025-12-31 기준 매출 72.33bn KRW, 영업이익 21.97bn KRW, 영업이익률 약 30.4%, 잉여현금흐름 18.16bn KRW는 단순 테마주가 아니라는 근거다.\",\n    \"현금 및 단기투자 343.88bn KRW와 차입금 21.19bn KRW의 순현금 구조는 하방 완충력과 전략적 선택지를 제공한다.\",\n    \"2026-04-14 반도체 섹터 위험 선호 개선은 095340.KS의 재상승 시도에 우호적 배경이 될 수 있다.\"\n  ],\n  \"invalidators\": [\n    \"240,000 이탈 후 반등이 약하면 조정이 단순 소화가 아니라 추세 약화로 전환될 가능성이 커진다.\",\n    \"50일선 약 201,390 이탈은 중기 상승 구조를 훼손한다.\",\n    \"CPO 및 테스트 소켓 기대가 다음 보고 주기에서 매출, 고객, 마진 가시성으로 연결되지 않으면 테마 프리미엄이 약해질 수 있다.\",\n    \"매출채권 69.84bn KRW와 재고 25.01bn KRW가 추가로 늘고 현금 전환이 따라오지 않으면 이익의 질이 훼손된다.\",\n    \"교환권 행사, 자기주식 처분, 지배구조 변화가 지속적 공급 부담이나 투자심리 약화로 이어지면 재평가 여지가 낮아진다.\"\n  ],\n  \"watchlist_triggers\": [\n    \"250,000-253,000을 최근 평균보다 높은 거래량으로 종가 회복한다.\",\n    \"회복 다음 거래일에도 250,000 위를 유지하거나 장중 지지가 명확하게 확인된다.\",\n    \"MACD 히스토그램 악화가 멈추고 양전환 방향으로 개선된다.\",\n    \"RSI가 50 위에서 안정되고 가격이 10일 EMA 약 243,546 위를 유지한다.\",\n    \"271,000을 강한 회전율로 돌파하면 추가 매수 후보로 격상한다.\",\n    \"292,500을 장중 반락 없이 돌파하면 추세 재가속 확인으로 본다.\",\n    \"CPO 테스트 소켓 수요, 고객 확보, 마진 지속성, 매출채권 회수, 재고 질에 대한 공시나 IR 확인이 나온다.\",\n    \"240,000 이탈 또는 VWMA 부근 고거래량 분산 매도가 나오면 관찰 종목의 위험 경보로 전환한다.\"\n  ],\n  \"data_coverage\": {\n    \"company_news_count\": 2,\n    \"disclosures_count\": 5,\n    \"social_source\": \"news_derived\",\n    \"macro_items_count\": 1\n  }\n}",
  "started_at": "2026-04-14T12:21:15.104827+09:00",
  "finished_at": "2026-04-14T12:34:10.594254+09:00",
  "duration_seconds": 775.49,
  "metrics": {
    "llm_calls": 59,
    "tool_calls": 22,
    "tokens_in": 0,
    "tokens_out": 0,
    "tokens_available": false,
    "calls_by_model": {
      "gpt-5.4": 59
    }
  },
  "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"
  }
}