{
  "ticker": "278470.KS",
  "ticker_name": "에이피알",
  "status": "success",
  "trade_date": "2026-04-16",
  "analysis_date": "2026-04-16",
  "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에 대한 중기 배분 관점은 긍정적으로 유지한다. 공격적 분석가와 중립 분석가가 지적한 것처럼 매출 1.53조 원, 영업이익 3,655억 원, 영업이익률 23.8%, 순이익률 19.0%, ROE 75.3%, 2025년 4분기 자유현금흐름 약 1,508억 원은 프리미엄을 정당화할 수 있는 근거다. 다만 보수적 분석가와 중립 분석가가 강조한 대로 2026-04-15 종가 KRW 413,000은 10일 EMA보다 약 11%, 50일선보다 약 31%, 200일선보다 약 70% 위에 있고, ATR이 종가의 약 6%이며, 4월 15일 거래량 414,029주는 4월 9일 868,166주보다 약해 추격 진입의 손익비가 불리하다. 따라서 오늘 신규 진입은 WAIT로 두되, 278470.KS가 KRW 407,500-413,000을 회복 또는 유지하고 KRW 417,000 돌파를 시도하면서 거래량이 의미 있게 증가하거나, KRW 386,000-399,500 눌림 후 RSI가 식고 거래량이 회복되는 반등이 나오면 소규모 STARTER는 정당화될 수 있다.\",\n  \"exit_logic\": \"기존 보유자는 278470.KS가 KRW 386,000 돌파 실패선 위에 있고 가능하면 KRW 371,500 부근 10일 EMA 위를 유지하는 동안 핵심 비중을 보유한다. 종가 기준 KRW 386,000 이탈이 거래량 증가와 함께 발생하면 단순 조정이 아니라 실패한 돌파로 보고 축소 또는 청산한다. KRW 371,500 부근을 지속적으로 이탈하고 MACD가 약화되면 상승 속도 둔화로 판단해 bullish allocation을 재검토한다. Q1에서 매출 성장은 확인되더라도 판매비, 플랫폼 수수료, 재고, 사후관리 비용 때문에 마진 또는 FCF 품질이 훼손되면 비중을 낮춘다. 좋은 뉴스에도 가격 반응이 계속 약하거나 저거래량 급등이 반복되면 일부 이익 실현을 우선한다.\",\n  \"position_sizing\": \"신규 자금은 확인 전 투입하지 않는다. 조건이 충족되면 의도 비중의 25%-40%만 STARTER로 시작하고, 이후 KRW 386,000-399,500 지지 확인 또는 KRW 413,000-417,000 위 고거래량 안착이 이어질 때 분할 추가한다. 보수적 분석가의 지적처럼 변동성이 크고 기대가 높으므로 레버리지는 사용하지 않는다. 기존 보유자는 핵심 비중을 유지할 수 있지만, 저가 매수로 수익이 큰 계정은 저거래량 급등이나 좋은 뉴스에도 약한 반응이 나올 때 일부 차익 실현을 고려한다.\",\n  \"risk_limits\": \"손절과 비중 관리는 짧은 고정 비율보다 ATR과 가격 구조에 맞춘다. KRW 413,000 기준 1 ATR 하락이 약 KRW 388,000으로 KRW 386,000 invalidation zone과 겹치므로, 이 구간을 핵심 위험 기준으로 둔다. 거래량이 약한 신고가에는 추가하지 않는다. KRW 371,500 부근 10일 EMA의 지속 이탈은 단기 추세 속도 훼손 신호로 본다. 재고가 2024년 말 1,097억 원에서 2025년 말 1,655억 원으로 높아진 점, 2025년 4분기 판매 및 마케팅 비용 2,554억 원 수준, 해외 플랫폼 수수료와 사후관리 비용 증가 가능성을 계속 감시한다.\",\n  \"catalysts\": [\n    \"Q1 실적에서 북미와 서유럽 매출 성장, 안정적 또는 개선된 영업이익률, 양호한 FCF 전환이 동시에 확인되는 경우\",\n    \"Coachella, celebrity-driven Medicube 노출, 성수동 플래그십 외국인 수요가 일회성 화제가 아니라 반복 구매와 브랜드 자산으로 연결된다는 증거\",\n    \"US reciprocal tariff refund의 규모, 시점, 회계 처리가 확인되어 현금흐름 또는 해외 수익성 우려를 완화하는 경우\",\n    \"KRW 413,000-417,000 52주 고점 구간을 거래량 증가와 함께 돌파하고 후속 안착하는 경우\",\n    \"재고 회전과 자유현금흐름이 해외 확장 과정에서도 유지되는 경우\"\n  ],\n  \"invalidators\": [\n    \"278470.KS가 KRW 386,000 아래로 종가 이탈하고 거래량이 증가해 돌파 실패를 확인하는 경우\",\n    \"KRW 371,500 부근 10일 EMA를 지속적으로 하회하고 MACD가 약화되는 경우\",\n    \"Q1에서 매출은 성장하지만 판매비, 플랫폼 비용, 재고, 사후관리 비용 때문에 마진이 압박받는 경우\",\n    \"재고가 매출 성장률을 초과해 다시 증가하거나 할인 판매와 판촉비 증가로 이어지는 경우\",\n    \"긍정 뉴스에도 주가가 반복적으로 약세를 보이며 기대 선반영 또는 차익실현 압력이 확인되는 경우\"\n  ],\n  \"watchlist_triggers\": [\n    \"KRW 407,500-413,000 위 회복 또는 유지와 함께 거래량이 414,029주를 의미 있게 넘고 가능하면 868,166주에 근접하는지 확인\",\n    \"KRW 413,000-417,000 위 고거래량 종가 안착 및 후속 거래일 지지 여부 확인\",\n    \"KRW 386,000-399,500 눌림에서 가격 붕괴 없이 반등하고 RSI가 과열권에서 식으며 거래량이 회복되는지 확인\",\n    \"Q1 공시 또는 실적 자료에서 해외 성장, 비용 통제, 재고 회전, FCF 품질이 동시에 확인되는지 확인\",\n    \"관세 환급의 규모, 시점, 회계 처리에 대한 뉴스 또는 공시 확인\"\n  ],\n  \"data_coverage\": {\n    \"company_news_count\": 5,\n    \"disclosures_count\": 0,\n    \"social_source\": \"news_derived\",\n    \"macro_items_count\": 1\n  }\n}",
  "started_at": "2026-04-16T12:22:29.490288+09:00",
  "finished_at": "2026-04-16T12:34:26.956517+09:00",
  "duration_seconds": 717.47,
  "metrics": {
    "llm_calls": 55,
    "tool_calls": 22,
    "tokens_in": 0,
    "tokens_out": 0,
    "tokens_available": false,
    "calls_by_model": {
      "gpt-5.4": 55
    }
  },
  "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_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
      }
    ],
    "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"
  }
}