feat: AI 투자 분석에 목표가·손절가 표시

CLAUDE.md §5.2 기준으로 계산해 매수 추천 금액 아래에 함께 표시.
  · 손절 = ATR(2.5×)과 -7% 중 타이트한 쪽(가격 높은 쪽), 적응형 모드면 그 값 사용
  · 목표 = 진입가 + 2R (R = 진입가 − 손절가) — +2R 50% 분할 매도 지점
ATR 은 stock_analysis.atr_14 우선, 없으면 DB 일봉으로 계산(KIS API 미사용). 테스트 4건 추가.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-09-23 13:34:59 +09:00
parent acbd9f35ea
commit f480eac25c
3 changed files with 138 additions and 0 deletions

View File

@@ -169,6 +169,28 @@ export const AiAnalysisPanel = React.memo(({ aiAnalysisData }: AiAnalysisPanelPr
{aiAnalysisData.data.suggested_quantity > 0 && aiAnalysisData.data.sizing_note && (
<div className="text-[9px] text-[#3a5570] mt-0.5">{aiAnalysisData.data.sizing_note}</div>
)}
{/* 목표가 · 손절가 (CLAUDE.md §5.2: 손절은 ATR/퍼센트 중 타이트한 쪽, 목표는 +2R) */}
{aiAnalysisData.data.target_price > 0 && (
<div className="flex items-baseline gap-3 mt-1">
<span className="text-[9px] uppercase tracking-wider text-[#4a6580]">목표</span>
<span className="text-[11px] font-mono text-[#ef4444]">
{Number(aiAnalysisData.data.target_price).toLocaleString('ko-KR')}원
<span className="text-[9px] ml-1">(+{aiAnalysisData.data.target_pct}%)</span>
</span>
<span className="text-[9px] uppercase tracking-wider text-[#4a6580]">손절</span>
<span className="text-[11px] font-mono text-[#3b82f6]">
{Number(aiAnalysisData.data.stop_loss_price).toLocaleString('ko-KR')}원
<span className="text-[9px] ml-1">({aiAnalysisData.data.stop_loss_pct}%)</span>
</span>
<span className="ml-auto text-[9px] font-mono text-[#4a6580]">
R:R 1:{aiAnalysisData.data.risk_reward}
</span>
</div>
)}
{aiAnalysisData.data.target_note && (
<div className="text-[9px] text-[#3a5570] mt-0.5">{aiAnalysisData.data.target_note}</div>
)}
</div>
)}