{
  "ticker": "010950.KS",
  "ticker_name": "S-Oil",
  "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.64,\n  \"time_horizon\": \"medium\",\n  \"entry_logic\": \"010950.KS는 중기 상승 논리가 유지되지만 오늘 즉시 추격 매수할 만큼 진입 확인은 완성되지 않았다. 공격적 분석가는 2026-04-14 종가 119100이 50일 이동평균 111858.62, 200일 이동평균 81354.46, 10일 지수이동평균 116585.40, 거래량가중평균 114045.28 위에 있고, MACD가 2026-04-03 -402.90에서 2026-04-14 2252.66으로 회복했으며 RSI 55.28로 과열이 아니라고 보았다. 이는 상승 추세와 이익 반등을 지지한다. 다만 보수적 분석가가 지적한 대로 2026-03-04 거래량 10800000주 초과와 고가 176551, 종가 126108의 비정상 급등 이후 119000-122000 공급 부담이 아직 해소되지 않았고, 2026-04-15 WTI 8% 하락 뉴스에 010950.KS가 장중 116700까지 밀린 점은 원유와 지정학 뉴스 민감도가 높다는 증거다. 따라서 기존 핵심 보유는 유지할 수 있으나 신규 또는 추가 진입은 122000을 평균 이상 거래량으로 종가 돌파하거나 114000-116000 조정 구간을 지키며 반등 거래량이 개선될 때까지 기다린다. 조건이 충족되면 소규모 시작 포지션은 정당화된다.\",\n  \"exit_logic\": \"010950.KS가 111500-112000 지지 구간을 종가 기준으로 이탈하면 전술 노출을 축소하거나 청산한다. 특히 거래량 증가, RSI 50 하회, MACD 둔화가 함께 나타나면 4월 반등 실패로 해석한다. Q1 실적이 핵심 정제마진 개선보다 재고 이익이나 래그 효과에 주로 의존한 것으로 확인되거나, 원유와 지정학 프리미엄이 빠지는데 제품 스프레드가 이를 상쇄하지 못하면 OVERWEIGHT 논리를 재검토한다.\",\n  \"position_sizing\": \"신규 진입은 확인 전까지 보류하고, 조건 충족 시에도 정상 배분보다 작은 시작 포지션만 허용한다. ATR이 약 7455 KRW로 가격의 약 6% 수준이므로 변동성을 낮게 보아서는 안 된다. 기존 보유자는 핵심 물량은 유지하되 122000 돌파 확인 또는 114000-116000 지지 확인 전에는 공격적 추가 매수를 피한다. 포지션은 1.5-2.0 ATR 불리한 움직임이 포트폴리오 허용 손실 안에 들어오도록 산정한다.\",\n  \"risk_limits\": \"전술 위험 기준은 촘촘한 장중 손절보다 111500-112000 종가 지지 이탈에 둔다. 정제마진 급락, Q1 이익의 질 악화, KRW/USD 급변, WTI 또는 지정학 프리미엄 급반전이 동반되는 약세에는 물타기하지 않는다. 119000-122000 저항대 아래에서는 확인 없는 비중 확대를 제한한다.\",\n  \"catalysts\": [\n    \"010950.KS Q1 실적이 재고 이익이 아니라 핵심 정제마진 개선으로 예상치를 상회\",\n    \"122000 위 평균 이상 거래량 동반 종가 돌파로 3월 공급 부담 흡수 확인\",\n    \"원유 변동성에도 기준 정제마진과 제품 수요가 견조하게 유지\",\n    \"영업현금흐름과 잉여현금흐름 개선, 순차입금 감소 지속\",\n    \"국민연금 또는 기관 보유 공시에서 안정적이거나 증가한 노출 확인\"\n  ],\n  \"invalidators\": [\n    \"111500-112000 지지 구간을 거래량 증가와 함께 종가 이탈\",\n    \"RSI가 50 아래로 내려가고 MACD가 꺾이며 4월 반등 실패 신호 발생\",\n    \"Q1 호실적이 일시적 재고 이익이나 래그 효과 중심이고 향후 정제마진 가이던스가 약함\",\n    \"WTI 또는 지정학 프리미엄 반전으로 제품 스프레드 보강 없이 섹터 재평가 하락 반복\",\n    \"설비투자와 운전자본 부담이 최근 잉여현금흐름 개선을 되돌림\"\n  ],\n  \"watchlist_triggers\": [\n    \"010950.KS가 122000 위에서 평균 이상 거래량으로 종가 마감하면 entry_action을 STARTER 또는 ADD로 상향 검토\",\n    \"114000-116000 조정 구간을 지키고 반등 거래량 또는 장중 수급이 개선되면 소규모 STARTER 검토\",\n    \"111500 아래 종가 이탈 시 뉴스와 마진 환경에 따라 portfolio_stance를 NEUTRAL 또는 BEARISH로 하향\",\n    \"Q1 실적 발표 때 영업이익을 재고 이익과 핵심 정제마진 기여로 분리해 판단\",\n    \"WTI, 중동 협상 뉴스, KRW/USD, 기준 정제마진을 추적해 상승 논리 확인 또는 훼손 여부 점검\"\n  ],\n  \"data_coverage\": {\n    \"company_news_count\": 5,\n    \"disclosures_count\": 1,\n    \"social_source\": \"news_derived\",\n    \"macro_items_count\": 0\n  }\n}",
  "started_at": "2026-04-15T12:25:05.610050+09:00",
  "finished_at": "2026-04-15T12:41:08.550393+09:00",
  "duration_seconds": 962.94,
  "metrics": {
    "llm_calls": 60,
    "tool_calls": 22,
    "tokens_in": 0,
    "tokens_out": 0,
    "tokens_available": false,
    "calls_by_model": {
      "gpt-5.4": 60
    }
  },
  "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_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": "success",
        "fallback": false,
        "note": null
      },
      {
        "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
      }
    ]
  },
  "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"
  }
}