feat(peers): 동종업종(테마) 비교 패널
- backend/app/seed/themes.py: themes_for_code(code) 헬퍼 추가 (코드 → 소속 테마들)
- backend/app/api/themes.py: GET /api/themes/peer/{code} 신규
· 종목이 속한 모든 테마의 코드 합집합을 peer 풀로
· 단일 SQL (ROW_NUMBER OVER PARTITION BY code) 로 21영업일 누적수익률 일괄 계산
· 본인 / peer 평균 / 상·하위 5종목 반환
- web/lib/api.ts: PeerCompare 타입 + api.peerCompare()
- web/components/PeerComparePanel.tsx: 테마 태그 + 3-칸 요약 (본인/평균/격차) + 상·하위 5
- [code]/page.tsx 에 PeriodReturns 아래 부착. 테마 무소속 종목은 패널 자동 숨김.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
This commit is contained in:
@@ -5,6 +5,7 @@ import { useEffect, useMemo, useState } from "react";
|
||||
import { CompositeScoreCard } from "../../components/CompositeScoreCard";
|
||||
import { DisclosuresPanel } from "../../components/DisclosuresPanel";
|
||||
import { MetricsPanel } from "../../components/MetricsPanel";
|
||||
import { PeerComparePanel } from "../../components/PeerComparePanel";
|
||||
import { NewsList } from "../../components/NewsList";
|
||||
import { PeriodReturns } from "../../components/PeriodReturns";
|
||||
import { PeriodTabs, periodSpec, type Period } from "../../components/PeriodTabs";
|
||||
@@ -147,6 +148,9 @@ export default function CodePage({ params }: { params: { code: string } }) {
|
||||
<div className="mt-6">
|
||||
<PeriodReturns ohlcv={chart.ohlcv} />
|
||||
</div>
|
||||
<div className="mt-6">
|
||||
<PeerComparePanel code={code} />
|
||||
</div>
|
||||
<div className="mt-6 grid gap-6 md:grid-cols-2">
|
||||
<TradingValuePanel data={chart.trading_value} />
|
||||
<MetricsPanel code={code} />
|
||||
|
||||
Reference in New Issue
Block a user