{
  "ticker": "278470.KS",
  "ticker_name": "에이피알",
  "status": "success",
  "trade_date": "2026-04-17",
  "analysis_date": "2026-04-17",
  "decision": "{\n  \"rating\": \"OVERWEIGHT\",\n  \"portfolio_stance\": \"BULLISH\",\n  \"entry_action\": \"WAIT\",\n  \"setup_quality\": \"DEVELOPING\",\n  \"confidence\": 0.72,\n  \"time_horizon\": \"medium\",\n  \"entry_logic\": \"278470.KS에 대한 중기 배분 관점은 OVERWEIGHT로 유지한다. 공격적 분석가가 강조한 2025-12-31 분기 매출 547634595480원, 영업이익 130272376980원, 순이익 98770046870원, 영업현금흐름 156069250900원, 자유현금흐름 150847694940원은 성장성과 이익의 질을 동시에 뒷받침한다. 또한 10일 EMA, 50일 SMA, 200일 SMA 위의 정배열, MACD 23662.01과 히스토그램 6860.72 개선은 상승 추세가 아직 유효하다는 근거다. 다만 보수적·중립 분석가가 지적한 대로 2026-04-16 종가 414500원은 10일 EMA 379288.67원보다 약 9.3% 높고, 2026-04-09 돌파 거래량 868166주 대비 2026-04-16 거래량 161094주로 줄어 추격 매수의 손익비는 충분하지 않다. 오늘 즉시 신규 진입은 보류하되, 417000~418000원 위 종가 안착과 거래량 회복이 확인되면 조건부 초기 진입이 가능하고, 393000~400000원 눌림에서 지지와 강한 반등이 확인되면 더 우호적인 진입 구간으로 본다.\",\n  \"exit_logic\": \"기존 보유자는 상승 추세가 유지되는 동안 보유를 지속한다. 278470.KS가 417000~418000원 돌파에 실패한 뒤 거래량 증가와 함께 390000원 아래로 종가 이탈하면 단기 돌파 실패로 판단해 비중을 줄인다. 379000원대 10일 EMA 이탈은 단순 변동성이 아니라 상승 속도 훼손 신호로 보고 OVERWEIGHT 강도를 재검토한다. 다음 실적에서 매출 성장 둔화, 판매 및 마케팅 비용 효율 악화, 완제품 재고 부담, 할인 판매, 재고평가손, 매출채권 회수 악화가 확인되면 HOLD 이하로 낮춘다.\",\n  \"position_sizing\": \"신규 매수는 오늘 실행하지 않는다. 조건이 충족될 경우 고변동성 성장주 특성을 반영해 목표 비중의 25~40%를 초기 비중으로 시작한다. 417000~418000원 위 종가와 의미 있는 거래량 회복이 확인되면 25~40%의 탐색 비중을 허용하고, 393000~400000원 눌림 지지 후 양봉 전환이 확인되면 손익비가 더 좋아 목표 비중의 30~45%까지 시작할 수 있다. ATR 24164원, 종가 대비 약 5.8% 변동성을 감안해 일반 성장주보다 작게 시작하고, 추가 매수는 안착과 거래량, 다음 실적 지표 확인 후 단계적으로만 진행한다.\",\n  \"risk_limits\": \"현재 414500원 부근에서는 거래량이 동반되지 않은 신고가권 추격 매수를 금지한다. 전술적 위험선은 거래량 증가를 동반한 390000원 종가 이탈이며, 이 경우 신규 진입 계획을 중단하거나 기존 비중을 축소한다. 추세 위험선은 379000원대 10일 EMA 이탈이다. RSI가 70 이상으로 상승한 뒤 거래량 둔화와 윗꼬리 확대가 동시에 나타나면 추가 매수를 동결하고 보유 비중을 점검한다. 손절 폭은 최소 1 ATR 이상을 반영하되, 포트폴리오 손실 한도를 넘지 않도록 초기 비중을 제한한다.\",\n  \"catalysts\": [\n    \"2025-12-31 분기 매출 547634595480원, 영업이익 130272376980원, 순이익 98770046870원으로 성장성과 수익성이 확인됨\",\n    \"영업현금흐름 156069250900원과 자유현금흐름 150847694940원이 순이익을 상회해 이익의 질이 우수함\",\n    \"278470.KS가 10일 EMA, 50일 SMA, 200일 SMA를 모두 상회하고 MACD 23662.01, 히스토그램 6860.72로 모멘텀이 개선됨\",\n    \"2026-04-09에 868166주 거래량을 동반해 365500원 돌파 후 가격대가 상향 이동한 점은 수급 변화의 근거임\",\n    \"K-뷰티 대표 성장주 프리미엄과 ESG 평판 개선 뉴스는 단기 매수 근거보다는 중기 보유 명분을 보강함\"\n  ],\n  \"invalidators\": [\n    \"417000~418000원 돌파 실패 후 거래량 증가를 동반한 390000원 하향 종가 이탈\",\n    \"379000원대 10일 EMA 이탈과 MACD, RSI 등 모멘텀 둔화 동반\",\n    \"다음 실적에서 매출 성장률 둔화 또는 판매 및 마케팅 비용 증가가 영업이익률을 압박하는 경우\",\n    \"완제품 재고 165457160450원 관련 회전율 악화, 재고평가손, 할인 판매 확대 또는 매출채권 회수 악화\",\n    \"해외 성장률 둔화나 K-뷰티 대표주 프리미엄 축소로 선행 PER 24.75배 정당성이 약화되는 경우\",\n    \"공시 부재가 지속되는 가운데 실적·계약·자본정책 관련 신규 촉매가 나오지 않는 경우\"\n  ],\n  \"watchlist_triggers\": [\n    \"278470.KS가 417000~418000원 위에서 종가 안착하고 2026-04-16의 161094주를 뚜렷하게 넘어서는 거래량 회복이 나타나는지 확인\",\n    \"393000~400000원 눌림 구간에서 지지 확인 후 강한 양봉 전환과 수요 회복이 나타나는지 확인\",\n    \"390000원 종가 이탈 여부와 이탈 시 거래량 증가 여부 확인\",\n    \"379000원대 10일 EMA 방어 여부 확인\",\n    \"RSI가 70 이상으로 올라간 뒤 거래량 둔화와 윗꼬리 확대가 동시에 나타나는지 확인\",\n    \"다음 분기 매출 성장률, 영업이익률, 판매 및 마케팅 비용 효율 확인\",\n    \"재고 165457160450원과 완제품 재고 회전, 할인 판매, 재고평가손 징후 확인\",\n    \"실적, 계약, 지분 변동, 자사주, 배당, 자본정책 관련 신규 공시 확인\"\n  ],\n  \"data_coverage\": {\n    \"company_news_count\": 4,\n    \"disclosures_count\": 0,\n    \"social_source\": \"news_derived\",\n    \"macro_items_count\": 0\n  }\n}",
  "started_at": "2026-04-17T10:28:59.356987+09:00",
  "finished_at": "2026-04-17T10:39:41.878078+09:00",
  "duration_seconds": 642.52,
  "metrics": {
    "llm_calls": 36,
    "tool_calls": 22,
    "tokens_in": 0,
    "tokens_out": 0,
    "tokens_available": false,
    "calls_by_model": {
      "gpt-5.4": 36
    }
  },
  "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_balance_sheet",
        "vendor": "yfinance",
        "status": "success",
        "fallback": false,
        "note": null
      },
      {
        "method": "get_cashflow",
        "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"
  },
  "intraday_snapshot_attempts": [
    {
      "ticker": "278470.KS",
      "attempted": true,
      "success": true,
      "checkpoint": "10:05",
      "interval": "5m",
      "attempted_at": "2026-04-17T10:41:06.851251+09:00",
      "provider": "yfinance_intraday",
      "market_data_asof": "2026-04-17T10:20:00+09:00"
    },
    {
      "ticker": "278470.KS",
      "attempted": true,
      "success": true,
      "checkpoint": "selective_rerun",
      "interval": "5m",
      "attempted_at": "2026-04-17T10:57:06.851891+09:00",
      "provider": "yfinance_intraday",
      "market_data_asof": "2026-04-17T10:35:00+09:00"
    },
    {
      "ticker": "278470.KS",
      "attempted": true,
      "success": true,
      "checkpoint": "14:35",
      "interval": "5m",
      "attempted_at": "2026-04-17T14:42:44.969916+09:00",
      "provider": "yfinance_intraday",
      "market_data_asof": "2026-04-17T14:20:00+09:00"
    }
  ],
  "latest_intraday_snapshot_attempt": {
    "ticker": "278470.KS",
    "attempted": true,
    "success": true,
    "checkpoint": "14:35",
    "interval": "5m",
    "attempted_at": "2026-04-17T14:42:44.969916+09:00",
    "provider": "yfinance_intraday",
    "market_data_asof": "2026-04-17T14:20:00+09:00"
  },
  "intraday_snapshot_latest_attempt": {
    "ticker": "278470.KS",
    "attempted": true,
    "success": true,
    "checkpoint": "14:35",
    "interval": "5m",
    "attempted_at": "2026-04-17T14:42:44.969916+09:00",
    "provider": "yfinance_intraday",
    "market_data_asof": "2026-04-17T14:20:00+09:00"
  }
}