{
  "ticker": "278470.KS",
  "ticker_name": "에이피알",
  "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\": \"278470.KS에 대한 중기 방향성은 우호적으로 유지한다. 공격적 분석가가 지적한 2025년 강한 성장, 영업이익률 23.788%, 순이익률 18.965%, ROE 75.3%, 순이익을 웃도는 잉여현금흐름, 해외 성장 기대, 외국인 순매수 보도, 50일 평균 312686원과 200일 평균 241874원 위의 추세는 투자 가능한 상승 논리를 뒷받침한다. 다만 보수적·중립적 분석가가 지적한 대로 2026-04-14 종가 386000원은 50일 평균보다 크게 높고, ATR 24625원은 종가 대비 6.38%로 진입 오류 비용이 크며, 399500원에서 386000원으로 밀린 고점권 대량거래는 추격매수에 불리하다. 따라서 기존 보유는 유지 가능하지만 오늘 신규 진입은 대기한다. 매수 가능한 조건은 362000-351500원이 낮은 거래량으로 지지되고 RSI가 50 위를 유지하는 눌림목, 또는 399500원 종가 돌파와 286905주를 뚜렷하게 넘는 거래량 및 후속 매물 소화 확인이다.\",\n  \"exit_logic\": \"기존 보유자는 278470.KS가 10일 EMA 부근인 362000원 위를 유지하고 해외 매출 성장, 높은 마진, 강한 현금흐름 논리가 훼손되지 않는 한 중기 비중을 유지한다. 362000원을 거래량 증가와 함께 종가 이탈하면 전술 비중을 줄이고, VWMA 부근 351500원까지 실패하면 단순 조정이 아니라 리스크 재평가 구간으로 전환한다. 다음 실적에서 미국·유럽 매출 성장 둔화, 마케팅 비용 증가에 따른 영업이익률 압박, 재고와 매출채권 질 악화가 확인되면 중기 OVERWEIGHT 근거를 낮춘다.\",\n  \"position_sizing\": \"OVERWEIGHT는 전면 공격 비중이 아니라 제한적 초과비중으로 운용한다. ATR이 6.38%이고 주가가 50일 평균보다 크게 위에 있으므로 신규 자금은 확인 신호 이후 starter tranche만 허용하며, 지지 방어 또는 399500원 돌파 유지가 확인될 때만 단계적으로 늘린다. 기존 보유자는 유지하되 고점권 뉴스 집중 구간에서 공격적 추가 매수는 금지한다.\",\n  \"risk_limits\": \"한 번의 정상 ATR 변동으로 강제 청산되지 않도록 여유를 두되, 포트폴리오 손실 한도는 작은 초기 비중으로 통제한다. 핵심 가격선은 362000원, 351500원, 312700원이다. 386000원 아래 고거래량 약세에는 추가 매수하지 않고, 399500원 돌파가 실패하거나 돌파 후 후속 거래일에 매물이 소화되지 않으면 모멘텀 진입을 보류한다. 장중 PER 51.79배와 동일업종 PER 38.60배 대비 프리미엄은 선행 PER 24.45배와 실적 상향이 실제로 확인될 때만 정당화된다고 본다.\",\n  \"catalysts\": [\n    \"278470.KS의 다음 실적에서 미국과 유럽 중심 해외 매출 성장이 지속되는 것\",\n    \"코첼라, medicube 글로벌 노출, BLACKPINK 리사 방문 효과가 실제 판매, 반복 구매, 플랫폼 순위 개선으로 전환되는 증거\",\n    \"DB Securities 목표주가 500000원 상향처럼 해외 성장률 재평가와 이익 추정 상향을 뒷받침하는 추가 증권사 업데이트\",\n    \"외국인과 기관 수요가 이어지며 고점권 거래량을 소화하는 흐름\",\n    \"399500원 종가 돌파와 286905주를 뚜렷하게 넘는 거래량이 동반되는 모멘텀 확인\"\n  ],\n  \"invalidators\": [\n    \"362000원 부근 10일 EMA를 거래량 증가와 함께 종가 이탈\",\n    \"351500원 부근 VWMA 실패 후 분산성 매도가 이어지는 흐름\",\n    \"다음 실적에서 마케팅 비용이 매출보다 빠르게 증가해 영업이익률이 압박되는 경우\",\n    \"재고와 매출채권 증가가 해외 sell-through 둔화 또는 채널 재고 부담으로 해석되는 경우\",\n    \"news_derived 감성에 집중된 브랜드 이벤트가 미국·유럽 매출 성장이나 아마존 성과로 연결되지 않는 경우\"\n  ],\n  \"watchlist_triggers\": [\n    \"눌림목 매수 후보: 362000-351500원 구간 지지, 거래량 감소, RSI 50 이상 유지\",\n    \"모멘텀 후보: 399500원 종가 돌파, 거래량 286905주를 뚜렷하게 상회, 다음 거래일 매물 소화\",\n    \"위험 축소: 362000원 종가 이탈과 거래량 증가\",\n    \"리스크 재평가: 351500원 VWMA 이탈 후 추가 약세\",\n    \"기본적 확인: 다음 분기 해외 매출 성장, 영업이익률, 재고와 매출채권 질이 프리미엄 밸류에이션을 지지\"\n  ],\n  \"data_coverage\": {\n    \"company_news_count\": 4,\n    \"disclosures_count\": 1,\n    \"social_source\": \"news_derived\",\n    \"macro_items_count\": 0\n  }\n}",
  "started_at": "2026-04-15T14:00:53.314954+09:00",
  "finished_at": "2026-04-15T14:12:36.813787+09:00",
  "duration_seconds": 703.5,
  "metrics": {
    "llm_calls": 54,
    "tool_calls": 22,
    "tokens_in": 0,
    "tokens_out": 0,
    "tokens_available": false,
    "calls_by_model": {
      "gpt-5.4": 54
    }
  },
  "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_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_cashflow",
        "vendor": "yfinance",
        "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_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"
  }
}