+ {/* 헤더 */}
+
+
+
성과 분석
+
매매 일지 자동 생성 & 전략 자동 최적화
+
+
+
+
+
+
+
+ {/* 성과 요약 카드 */}
+ {perfLoading ? (
+
성과 데이터 로딩 중...
+ ) : summary && summary.total_trades > 0 ? (
+
+ = 50 ? 'green' : summary.win_rate >= 40 ? 'yellow' : 'red'}
+ icon={Target}
+ />
+ = 1.5 ? 'green' : summary.profit_factor >= 1.0 ? 'yellow' : 'red'}
+ icon={TrendingUp}
+ />
+ = 1.5 ? 'green' : summary.risk_reward_ratio >= 1.0 ? 'yellow' : 'red'}
+ icon={TrendingDown}
+ />
+ = 0 ? 'green' : 'red'}
+ icon={summary.net_pnl >= 0 ? TrendingUp : TrendingDown}
+ />
+
+ ) : (
+
+ 최근 {days}일 내 완료된 매도 거래가 없습니다.
+
+ )}
+
+
+ {/* 전략별 성과 */}
+
+
전략별 성과
+ {perf && Object.keys(perf.by_strategy).length > 0 ? (
+
+ {Object.entries(perf.by_strategy).map(([strat, stats]) => (
+
+
+ {strat}
+ {stats.total}건
+
+
+ = 50 ? 'text-green-400' : 'text-red-400'}>
+ 승률 {fmt(stats.win_rate)}%
+
+ = 0 ? 'text-green-400' : 'text-red-400'}>
+ 평균 {stats.avg_return >= 0 ? '+' : ''}{fmt(stats.avg_return)}%
+
+
+
+ ))}
+
+ ) : (
+
데이터 없음
+ )}
+
+
+ {/* 청산 유형별 */}
+
+
청산 유형별 통계
+ {perf && Object.keys(perf.by_exit_type).length > 0 ? (
+
+ {Object.entries(perf.by_exit_type).map(([etype, stats]) => (
+
+
+ {etype}
+ {stats.count}건
+
+
= 0 ? 'text-green-400' : 'text-red-400'}`}>
+ 평균 {stats.avg_return >= 0 ? '+' : ''}{fmt(stats.avg_return)}%
+
+
+ ))}
+
+ ) : (
+
데이터 없음
+ )}
+
+
+
+ {/* 인사이트 */}
+
+
+
+ 전략 인사이트
+
+ {insightsLoading ? (
+
분석 중...
+ ) : insights.length > 0 ? (
+
+ {insights.map((ins, i) => )}
+
+ ) : (
+
분석할 데이터가 없습니다.
+ )}
+
+
+ {/* 매매일지 */}
+
+
+
+
+ 매매일지 자동 생성
+
+
+
+
+ 최근 7일 내 일지가 없는 완료 거래에 대해 템플릿 기반 매매일지를 자동 생성합니다.
+ 장 종료 후 16:00에 자동으로도 실행됩니다.
+
+
+
+ {/* 전략 자동 최적화 */}
+
+
+
+
+
+ 전략 자동 최적화
+
+ {insightsData?.last_optimization_date && (
+
+ 마지막 최적화: {new Date(insightsData.last_optimization_date).toLocaleDateString('ko-KR')}
+
+ )}
+
+
+
+
+ RSI, 손절선, ATR 배수, 볼린저 밴드 파라미터를 그리드 서치로 최적화합니다.
+ Sharpe Ratio 10% 이상 개선 시 자동으로 전략 설정에 적용됩니다.
+ (매일 16:00 KST 자동 실행, 최근 7일 거래 5건 이상 시)
+
+
+ {/* 최적화 이력 */}
+
+
최적화 이력
+ {optHistLoading ? (
+
로딩 중...
+ ) : optHistory.length > 0 ? (
+
+ {optHistory.map((log) => (
+
+
+
+ {expandedOptLog === log.id && (
+
+
+
+
최적 Sharpe
+
{fmt(log.best_sharpe, 3)}
+
+
+
최적 승률
+
{fmt(log.best_win_rate, 1)}%
+
+
+
최적 MDD
+
{fmt(log.best_mdd, 1)}%
+
+
+
+ 사유:
+ {log.apply_reason || '-'}
+
+ {log.best_params && (
+
+
최적 파라미터:
+
+ {JSON.stringify(log.best_params, null, 2)}
+
+
+ )}
+
+ )}
+
+ ))}
+
+ ) : (
+
최적화 이력이 없습니다.
+ )}
+
+
+
+ {/* 최악/최고 종목 */}
+ {perf && (perf.worst_stocks.length > 0 || perf.best_stocks.length > 0) && (
+
+
+
최대 손실 종목 Top5
+
+ {perf.worst_stocks.map((s) => (
+
+ {s.stock_code}
+ {fmtKRW(s.net_pnl)}
+
+ ))}
+
+
+
+
최대 수익 종목 Top5
+
+ {perf.best_stocks.map((s) => (
+
+ {s.stock_code}
+ {fmtKRW(s.net_pnl)}
+
+ ))}
+
+
+
+ )}
+
+ )
+}