Live — https://daehun.app
12개 AI 에이전트가 협업하여 주식을 분석하고, 가상 매매로 판단을 검증하며, 실패에서 스스로 학습하는 투자 분석 시스템.
[분석검증 모드] 티커별 독립 분석 + 가상 매매
데이터 수집 → 투자 토론 → 리스크 토론 → 매매 판단 → 가상 매매 → 청산 시 반성
↑ │
└──────── 경험이 다음 판단에 반영 ─────────────┘
[포트폴리오 모드] 전체 티커 분석 완료 후 자동 실행
전체 분석 결과 → 비서 브리핑 → 포트폴리오 PA 리밸런싱 → 매매 실행 → 주간 회고
↑ │
└───────── 포트폴리오 경험이 다음 배분에 반영 ──────────┘
┌─ Market Analyst
데이터 수집 ├─ Social Analyst
(4명 독립 분석) ├─ News Analyst
└─ Fundamentals Analyst
↓
투자 토론 Bull Researcher ←→ Bear Researcher (N회)
↓
Research Manager (판결)
↓
매매 판단 Trader
↓
리스크 토론 Aggressive ←→ Conservative ←→ Neutral (N회)
↓
Risk Judge (최종 BUY/SELL/HOLD)
↓
실행 Portfolio Agent (매매 수량 결정)
데이터 수집 — 4명의 분석가가 각각 시장 데이터, 소셜 감성, 뉴스, 재무제표를 독립 분석한다.
투자 토론 — 분석 보고서를 바탕으로 강세/약세 리서처가 N라운드 토론. Research Manager가 양측 논거를 종합하여 판결.
리스크 토론 — Trader의 투자 계획에 대해 공격적/보수적/중립 3명이 N라운드 토론.
Risk Judge가 최종 BUY/SELL/HOLD + strategy_json(확신도, 비중)을 구조화 출력.
실행 — Portfolio Agent가 파이프라인 결정과 과거 경험(RAG)을 종합하여 매매 수량 결정.
가용 현금 대비 allocation_pct 기반으로 계산한다.
12에이전트 파이프라인은 포지션 정보 없이 완전 객관적으로 분석한다. 포지션을 아는 것은 마지막 Portfolio Agent뿐이다.
가상 매매로 분석 결과를 추적하고, 포지션 청산 시 전체 사이클을 되돌아보며 교훈을 추출한다.
- 티커당 $5,000 독립 자금 — 포지션 간 간섭 없음
- 매수/매도 모두 PA가 수량 결정 (소수점 매매 지원)
- 포지션 전량 청산 시 반성 에이전트 가동
- 공유 자금 풀 1억원 (KRW) — 분석검증 자금과 완전 분리
- 전체 티커 분석 완료 → 비서 에이전트가 브리핑 → PortfolioManagerAgent가 리밸런싱 결정
- 혼합 통화 지원 (USD+KRW), yfinance 실시간 환율 적용
- 시장별 거래 수수료: US 0.1%, KR 0.015%+세금, Crypto 0.04%
- 주간 회고로 배분 품질 자체 평가 → 경험이 다음 배분에 반영
- 해당 포지션의 전체 분석 리포트 + 매매 이력을 LLM에 전달
- 반성문 + 핵심 교훈 생성
- 성공/실패 레이블 + 섹터/산업/시장 메타데이터와 함께 저장
- 다음 분석에서 PA가 유사 경험을 검색
- Postgres FTS(키워드) + ChromaDB(시맨틱) → RRF Fusion
- 경험이 있으면 → 분석 60% + 경험 40% 가중치로 독립 판단
- 경험이 없으면 → 파이프라인 결정을 그대로 따름
- 검색 쿼리에 market/sector 맥락 부착 → 같은 시장/섹터 경험 우선 매칭
usefulness_score기반 쓰레기 문서 점진적 필터링 (RAG Validator)
- 회고분석 결과를 기반으로 RAG 문서별 유용성 평가
- PA가 해당 경험을 실제로 반영했는지 문서 단위 판정
usefulness_score±1 자동 조정 → 40 미만 시 검색에서 배제- 효과 분석 리포트 생성 → 사람이 읽고 판단
- 12에이전트 분석의 시장 움직임 대비 정확도 (0~100)
- RAG 경험이 PA 판단에 실제 기여한 정도 (0~100)
- 회고분석 프롬프트에서 자동 추출 → 대시보드 표시
- 티커별 APScheduler가 주기적으로 분석 트리거
asyncio.Queue→ 워커 1개가 순차 처리 (LLM rate limit 대응)- 새 시장 데이터가 없으면 스킵
- 파싱/에이전트 실패 시 자동 1회 재큐잉
- 서버 재시작 시 미완료 스케줄 자동 복구
- 분석 중 에이전트 진행 상태를 WebSocket으로 실시간 스트리밍
- 동시에 DB에 영속화 → 이후 이력 조회 가능
- Svelte SPA — 포지션, 스케줄, 리포트, 실시간 모니터링
- 모바일 최적화 다크 테마, PWA 설치 지원
| 영역 | 스택 |
|---|---|
| 백엔드 | Python 3.10+, FastAPI, LangGraph, APScheduler |
| 프론트엔드 | Svelte 4, TypeScript, Vite |
| 데이터베이스 | PostgreSQL 17, ChromaDB |
| LLM | Google Gemini — OAuth 인증, API 키 불필요 |
| 데이터 | yfinance (기본) → Alpha Vantage (자동 폴백) |
LLM Resilience: 429 → 동일 모델 재시도 (최대 5회) / 503 → 하위 모델 자동 폴백
| 문서 | 설명 |
|---|---|
| spec.md | 요구사항 정의 (FR-001~061) |
| arch-be.md | 백엔드 설계 — DB 스키마, API 명세, 에러 처리 |
| arch-fe.md | 프론트엔드 설계 — 컴포넌트, 상태 관리, 라우팅 |
| ui.md | UI 명세 — 화면별 컴포넌트, 상태, 인터랙션 |
| USAGE_GUIDE.md | 설치·실행·API 사용 가이드 |
수집 데이터: 15개 기술 지표
LLM에게 15개 지표 목록이 주어지고, 상호 보완적인 최대 8개를 자율 선택한다.
| 카테고리 | 지표 | 설명 |
|---|---|---|
| 이동평균 | close_50_sma |
50일 단순이동평균 — 중기 추세 |
close_200_sma |
200일 단순이동평균 — 장기 추세, 골든/데드크로스 | |
close_10_ema |
10일 지수이동평균 — 단기 모멘텀 | |
| MACD | macd |
EMA 차이 기반 모멘텀 |
macds |
MACD 시그널 라인 | |
macdh |
MACD 히스토그램 — 모멘텀 강도 | |
| 모멘텀 | rsi |
RSI — 과매수(70↑)/과매도(30↓) |
| 변동성 | boll |
볼린저 밴드 중간선 (20 SMA) |
boll_ub |
볼린저 상단밴드 (+2σ) | |
boll_lb |
볼린저 하단밴드 (-2σ) | |
atr |
ATR — 평균 진폭 | |
| 거래량 | vwma |
거래량 가중 이동평균 |
mfi |
MFI — 매수/매도 압력 |
수집 데이터: 28개 펀더멘탈 지표
시가총액, P/E(TTM), Forward P/E, PEG, P/B, EPS(TTM), Forward EPS, 배당수익률, Beta, 52주 고가/저가, 50/200일 평균가, 매출(TTM), 매출총이익, EBITDA, 순이익, 이익률, 영업이익률, ROE, ROA, 부채비율, 유동비율, 장부가치, FCF