{
  "ticker": "278470.KS",
  "ticker_name": "에이피알",
  "status": "success",
  "trade_date": "2026-04-15",
  "analysis_date": "2026-04-16",
  "decision": "{\n  \"rating\": \"OVERWEIGHT\",\n  \"portfolio_stance\": \"BULLISH\",\n  \"entry_action\": \"WAIT\",\n  \"setup_quality\": \"DEVELOPING\",\n  \"confidence\": 0.74,\n  \"time_horizon\": \"medium\",\n  \"entry_logic\": \"278470.KS는 중기 관점에서 비중확대가 가능한 강한 성장주로 판단한다. 공격적 분석가가 지적한 대로 50일선 315,442와 200일선이 상승 중이고, 주가는 386,000 부근에서 추세를 유지하며, MACD는 4월 8일 7,766.53에서 4월 15일 21,438.97로 확대되어 모멘텀이 재가속되고 있다. 또한 최근 분기 매출 547.6십억원, 영업이익 130.3십억원, 순이익 98.8십억원, 잉여현금흐름 150.8십억원, 영업이익률 23.788%, 순이익률 18.965%, 높은 ROE와 낮은 레버리지는 프리미엄을 뒷받침한다. 다만 보수적·중립적 분석가가 강조한 것처럼 가격은 408,500 고점 근처이고, RSI 68.12, ATR 약 24,831, 50일선 대비 큰 괴리가 있어 오늘 즉시 추격 매수할 자리로 보기는 어렵다. 따라서 방향성은 강세로 유지하되, 신규 진입은 396,000 회복이 평균 대비 뚜렷한 거래량을 동반하거나, 371,464~358,589 지지 구간에서 거래량이 줄며 안정되는 경우까지 기다린다. 408,500 돌파는 단순 장중 돌파가 아니라 종가 안착과 이후 유지가 확인될 때 추가 근거로 본다.\",\n  \"exit_logic\": \"신규 진입 후 396,000 또는 408,500 돌파가 빠르게 실패하면 일부 축소하거나 철수한다. 278470.KS가 358,589 VWMA를 상승 거래량과 함께 종가로 이탈하면 단기 지지 구조가 무너지고 분산 매물 위험이 커진 것으로 보고 전술적 비중을 줄인다. 315,442 50일선으로 빠르게 접근하거나 하향 이탈하면 중기 추세 자체를 재평가한다. 기존 보유자는 10일 EMA 371,464 이탈만으로 자동 매도하지 않되, 이탈이 거래량 증가와 동반되면 방어적으로 조정한다. 실적 발표나 공시에서 미국 매출 전환, 반복 구매, 채널 수익성, 재고·매출채권 질, 마진 지속성, 관세 환급 규모와 시점이 기대에 미치지 못하면 비중확대 의견을 낮춘다.\",\n  \"position_sizing\": \"오늘은 신규 풀사이즈 진입을 하지 않는다. 확인 조건이 충족되면 정상 비중보다 작은 시작 비중만 허용하고, 2~3회에 나누어 편입한다. 첫 번째 분할은 396,000 회복이 거래량으로 확인되거나 371,464~358,589 구간에서 조용한 지지가 확인될 때 가능하다. 두 번째 분할은 408,500 위 종가 안착과 이후 유지가 확인될 때 검토한다. 세 번째 분할은 고점 위 가격 수용이 이어지거나 다음 실적·공식 자료에서 매출 성장, 마진, 현금전환, 재고 품질이 확인될 때만 허용한다. 기존 중기 보유자는 통제된 비중확대를 유지할 수 있으나, 이미 과도한 비중이면 추가 추격은 보류한다.\",\n  \"risk_limits\": \"단기 변동성이 크므로 촘촘한 가격 손절보다 변동성 기반 리스크 관리를 사용한다. 386,000 기준 1 ATR은 약 24,831로, 저 361,000대와 358,589 VWMA가 핵심 전술 방어선이다. 단일 종목 손실 허용액은 보수적으로 제한하고, 단기 5~10% 조정 가능성을 기본 가정에 포함한다. 358,589 아래로 거래량이 확대되면 비중을 줄이고, 315,442 50일선 접근 시에는 매수보다 자본 보호를 우선한다. 재고가 165.5십억원, 매출채권이 78.0십억원으로 증가한 점은 성장 준비와 운전자본 부담 양쪽 가능성이 있으므로, 향후 현금전환 악화가 확인되면 리스크 한도를 낮춘다.\",\n  \"catalysts\": [\n    \"278470.KS가 396,000을 평균 대비 뚜렷한 거래량으로 회복\",\n    \"278470.KS가 408,500을 종가로 돌파하고 이후 유지\",\n    \"외국인 순매수가 지속되며 글로벌 K뷰티 성장주로 재평가 지속\",\n    \"Coachella, Medicube, TikTok Shop, Lisa 노출이 미국 매출 성장과 반복 구매로 연결된다는 증거\",\n    \"관세 환급 규모와 시점이 공식 확인되어 현금흐름 또는 이익에 긍정적으로 반영\",\n    \"다음 실적에서 매출 성장, 영업이익률 방어, 강한 잉여현금흐름, 재고 품질이 확인\"\n  ],\n  \"invalidators\": [\n    \"278470.KS가 358,589 VWMA를 상승 거래량과 함께 종가 이탈\",\n    \"가격이 315,442 50일선으로 빠르게 접근하거나 하향 이탈\",\n    \"재고 또는 매출채권 증가가 할인, 마진 압박, 현금전환 악화로 이어짐\",\n    \"미국 확장 관련 마케팅 비용은 증가하지만 반복 판매나 채널 수익성이 확인되지 않음\",\n    \"관세 환급 기대가 부인되거나, 크게 지연되거나, 이익 영향이 미미한 것으로 확인\",\n    \"RSI가 70을 넘은 뒤 가격이 신고가를 만들지 못해 모멘텀 둔화가 나타남\"\n  ],\n  \"watchlist_triggers\": [\n    \"278470.KS가 396,000 위에서 평균 대비 의미 있게 높은 거래량을 동반\",\n    \"278470.KS가 408,500을 돌파하고 종가까지 유지\",\n    \"371,464~358,589 구간 조정에서 거래량이 줄고 가격이 안정\",\n    \"371,464 이탈이 거래량 증가와 동반되는지 여부\",\n    \"358,589 하향 이탈 시 거래량 확대 여부\",\n    \"공식 공시나 실적에서 미국 매출 기여, 마진 추세, 재고 품질, 관세 환급 세부 사항 확인\",\n    \"외국인 매수세가 둔화 또는 순매도로 전환되는지 여부\"\n  ],\n  \"data_coverage\": {\n    \"company_news_count\": 4,\n    \"disclosures_count\": 0,\n    \"social_source\": \"news_derived\",\n    \"macro_items_count\": 1\n  }\n}",
  "started_at": "2026-04-16T03:44:12.117174+09:00",
  "finished_at": "2026-04-16T03:58:17.087288+09:00",
  "duration_seconds": 844.97,
  "metrics": {
    "llm_calls": 61,
    "tool_calls": 22,
    "tokens_in": 0,
    "tokens_out": 0,
    "tokens_available": false,
    "calls_by_model": {
      "gpt-5.4": 61
    }
  },
  "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_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": "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_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
      }
    ],
    "called_tools": [],
    "intraday_snapshot_used": false
  },
  "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"
  }
}