# Trading AI 워렌 버핏 스타일 가치투자 관점의 한국 주식 AI 분석 파이프라인. 뉴스·공시·재무·기술적 지표·미증시 동조 시그널을 통합해 종목별 종합 점수와 매수/매도 추천을 산출하고 텔레그램으로 전달한다. --- ## 파이프라인 ``` [뉴스 RSS/네이버] → 형태소(바른) → 임베딩(bge-m3) → 중복제거(Qdrant) → 분석(EXAONE) ↓ [DART 공시/재무] → 재무비율(ROE·OPM·DR·FCF) → ┐ [네이버 주가] → 기술지표(MA/RSI/MACD/볼밴) → ┤ [미국 ETF/페어] → 섹터·페어 회귀 시그널 → ┼→ 종합 스코어링 → 추천 → 텔레그램 [ECOS 매크로] → USD/KRW·국고채10년 → ┤ (10공식 앙상블) [그래프 신경망] → GAT 다음날 수익률 예측 → ┘ ``` --- ## 서비스 구성 (Docker Compose) | 서비스 | 포트 | 역할 | |--------|------|------| | `news-collector` | 8787 | 뉴스 수집 + 형태소/임베딩/중복제거/EXAONE 분석 | | `bareunaapi` | 5757 | 한국어 형태소분석 FastAPI 래퍼 | | `bareun` | 5656/9902 | 바른 NLP gRPC 서버 | | `dart-collector` | 8888 | DART 공시/재무제표 수집 | | `score-engine` | 8686 | 종합 점수 계산 + 텔레그램 브리핑 | | `ta-engine` | 8484 | 기술적분석 (MA/RSI/MACD/볼밴/스토캐스틱) | | `aux-signal` | 8282 | 컨센서스·기관/외국인 수급·ECOS 매크로 | | `us-market` | 8383 | 미증시 섹터 ETF·페어 회귀 시그널 | | `graph-engine` | 9090 | GAT 그래프 신경망 (graph_score) | | `kis-api` | 8585 | 네이버모바일 주가 + 매매시그널 | | `dashboard-api` | 8989 | 대시보드 REST API + HTML | | `telegram-bot` | - | `/buy /sell /stock /deep /market` 명령 처리 | | `ollama` | 11434 | EXAONE 3.5 7.8B 추론 + bge-m3 임베딩 | | `n8n` / `worker` | 5678 | 워크플로우 자동화 | | `postgres` | 5432 | 메인 DB | | `redis` | 6379 | 캐시·중복제거 | | `qdrant` | 6333 | 뉴스 벡터 유사도 필터 | --- ## 점수 산출 ``` 종합점수 = 펀더멘털통합 × 0.24 + 뉴스(catalyst 가중) × 0.18 + 기술 × 0.15 + DART 공시 × 0.10 + 외국인 수급 × 0.14 + 공매도 × 0.06 + 가격 모멘텀 × 0.03 + DCF 안전마진 × 0.10 + 시장 레짐 보정 (±5~10) + 앙상블 보팅 (±18) ← 10공식 매수/매도 합 × 학습 가중치 ``` **10공식 앙상블 보팅** (각 공식이 독립 신호 발신, 백테스트 회귀로 가중치 학습): | 공식 | 출처 | 매수 신호 조건 | |------|------|---------------| | 매직포뮬러 | Greenblatt | ROC + EY ≥ 20 | | F-Score | Piotroski 2000 | 7신호 ≥ 6 | | 알트만 Z | Altman 1968 | Z ≥ 2.6 | | PEG | Lynch GARP | PER / 이익성장률 ≤ 1.5 | | 12-1 모멘텀 | AQR (Carhart) | (P_-21 / P_-252) − 1 ≥ 10% | | Beneish M | Beneish 1999 | 의심도 < 50 + CFO/NI > 1 | | GP/A | Novy-Marx 2013 | 영업이익/총자산 ≥ 15% | | G-Score | Mohanram 2005 | 5신호 vs 섹터 중앙값 ≥ 4 | | Amihud | Amihud 2002 | 비유동성 ≥ 100 (소형 알파) | | BAB(베타) | Frazzini-Pedersen | β < 0.7 (저베타 알파) | **버핏 가치투자 필터** (`is_value_investable`): - 영업이익 > 0 - ROE ≥ 10% - 부채비율 ≤ 200% - PER ≤ 60 - 시총 ≥ 100억 - `dart_corps.is_active = true` (상장폐지 제외) **추천 등급** (점수 + 다수 공식 동의 강제): - **강력매수**: ≥ 70 AND 매수 보팅 ≥ 3 - **매수관심**: ≥ 40 AND 매수 보팅 ≥ 1 AND 매도 보팅 < 2 - **매도관심**: ≤ −30 OR 매도 보팅 ≥ 3 - **강력매도**: ≤ −60 OR 매도 보팅 ≥ 4 - 그 외 **관망** --- ## 빠른 시작 ### 사전 요구사항 - Ubuntu 22.04, Docker / Docker Compose - GPU 2장 (GPU0: EXAONE 추론용 ≥12GB / GPU1: bge-m3 임베딩용 ≥8GB) - NAS NFS 마운트 (`/mnt/nas`) — PostgreSQL 데이터 영속화용 ### 환경변수 `.env` 파일 생성 (예시): ``` POSTGRES_HOST=postgres POSTGRES_PORT=5432 POSTGRES_DB=trading_ai POSTGRES_USER=kyu POSTGRES_PASSWORD=... REDIS_PASSWORD=... REDIS_MAX_MEMORY=2gb DART_API_KEY=... ECOS_API_KEY=... FINNHUB_API_KEY=... TELEGRAM_BOT_TOKEN=... TELEGRAM_CHAT_ID=... OLLAMA_NUM_PARALLEL=4 QDRANT_COLLECTION=news_vectors QDRANT_VECTOR_SIZE=1024 ``` ### 실행 ```bash docker compose up -d docker compose ps # 전체 상태 docker logs trading-score-engine -f # 로그 추적 ``` ### 초기 데이터 로딩 ```bash # DART 기업목록 수집 curl -X POST http://localhost:8888/collect/corps # 다년치 사업보고서 백필 (F-Score·PEG용, years≥2 필수) curl -X POST 'http://localhost:8888/collect/financials?count=3000&years=10&annual_only=true' # 섹터 정보 채우기 curl -X POST http://localhost:8888/collect/sectors # 점수 수동 재계산 curl -X POST http://localhost:8686/score/calculate # 백테스트 기반 공식 가중치 학습 curl -X POST 'http://localhost:8686/learn-weights?days=90' ``` --- ## 주요 API ### 추천 / 랭킹 ```bash # 오늘의 추천 종목 docker exec trading-postgres psql -U kyu -d trading_ai -c " SELECT s.stock_code, d.corp_name, s.total_score, s.recommendation, s.magic_score, s.f_score, s.buy_votes, s.sell_votes FROM stock_scores s JOIN dart_corps d ON d.stock_code=s.stock_code WHERE d.is_active=true AND s.score_date=CURRENT_DATE ORDER BY s.total_score DESC LIMIT 10;" # REST curl http://localhost:8686/recommendations curl http://localhost:8686/stock/005930 # 삼성전자 curl http://localhost:8686/backtest # 추천 성과 백테스트 curl http://localhost:8484/technical/005930 # 기술분석 curl http://localhost:8989/api/summary # 대시보드 요약 ``` ### 학습 / 예측 ```bash curl -X POST 'http://localhost:8686/learn-weights?days=90' curl http://localhost:8686/learn-weights curl -X POST http://localhost:8686/learn-pricing curl http://localhost:8686/predict-price/005930 ``` --- ## 데이터베이스 핵심 테이블 | 테이블 | 설명 | |--------|------| | `news_analysis` | 분석된 뉴스 (sentiment / intensity / catalyst) | | `news_raw` | 수집/분석 분리용 임시 저장소 | | `dart_corps` | DART 기업목록 (`is_active=true` 필터 필수) | | `dart_financials` | 재무제표 + 비율 (ROE / OPM / DR / FCF) | | `stock_scores` | 일별 종합 점수 + 10공식 신호 + 가중치 | | `stock_technical` | 기술지표 + 매매신호 | | `weight_config` | 공식별 학습 가중치 (자동 갱신) | | `pricing_model` | 30일 수익률 회귀/RF 모델 메타 | 상세 스키마는 `CLAUDE.md` 참고. --- ## 디렉토리 구조 ``` trading/ ├── CLAUDE.md # 프로젝트 상세 가이드 (Claude Code용) ├── docker-compose.yml # 전체 서비스 정의 ├── init-db.sql # 초기 스키마 ├── news-collector/ # 뉴스 수집·분석 ├── bareunaapi/ # 형태소분석 래퍼 ├── dart-collector/ # DART 공시·재무 ├── score-engine/ # 종합 스코어링 ├── ta-engine/ # 기술적 분석 ├── aux-signal/ # 컨센서스·수급·매크로 ├── us-market/ # 미증시 동조 시그널 ├── graph-engine/ # GAT 그래프 신경망 ├── kis-api/ # 주가 수집 ├── dashboard-api/ # 대시보드 REST ├── telegram-bot/ # 텔레그램 봇 └── scripts/ # 설치/상태 스크립트 ``` --- ## 주의사항 - 모든 추천 쿼리에 `WHERE d.is_active=true` 필수 (상장폐지 제외). - NAS fstab은 반드시 한 줄, `nfsvers=3` 옵션 필수. - Ollama 단일 컨테이너가 GPU0·GPU1을 동시 사용. `runtime: nvidia` 필요. - `.env` / `pg_backup/` / `models/` 등 민감 자산은 `.gitignore` 처리됨. --- ## 라이선스 내부 프로젝트.